辽宁十一选五一定牛 辽宁十一选五推荐号码预测专家今日 辽宁十一选五六月走势分析预测 哪个平台有辽宁十一选五开奖结果 辽宁十一选五六码遗漏 辽宁十一选五公告 辽宁十一选五前三技巧 辽宁十一选五任选四最大遗漏 辽宁十一选五小助手 辽宁十一选五360 辽宁十一选五组二技巧 辽宁十一选五推荐号码 辽宁十一选五计划软件手机版 辽宁十一选五连线走势图百度乐彩 辽宁十一选五玩法
用户
 ?#19968;?#23494;码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,登录网站

小程序社区 首页 资讯/观点 查看内容

快速开发小程序前端篇(下)

Rolan 2019-4-24 00:42

开始开发在此之前普及下一些基本概念,日常小程序开发中可能用到:自定义组件:复用性高的交互模块,可以考虑以组件的形式封装,提高复用性和开发效率,但同时也需注意低版本兼容问题.低版本兼容:某些API是在迭代中 ...

开始开发

在此之前普及下一些基本概念,日常小程序开发中可能用到:

  • 自定义组件:复用性高的交互模块,可以考虑以组件的形式封装,提高复用性和开发效率,但同时也需注意低版本兼容问题.

  • 低版本兼容:某些API是在迭代中新增的,故和小程序版本号与客户端版本有关,故在使用前需进行兼容性判断(如VUE不兼容IE8以下,因为VUE基于Object.defineProperty)。

  • 插件:程序基础库版本 1.9.6 开始支持。适合用来封装自己的功能或服务,提供给第三方小程序进行?#25925;?#21644;使用,之前有沉淀过相关文章,点击查看

  • 场景值:可以区分小程序是从哪个场景打开的,如群聊会话卡片,发现栏小程序tab入口,以便做精细化运营或数据区分。

  • WXS:WXS(WeiXin Script)是小程序的一套脚本语言,结合 WXML,可以构建出页面的结构。比如对金额封装?#25925;?#20989;数等场景。

从构建Demo开始

打开开发工具,选择一个空的目录,勾选"创建 QuickStart 项目",为项目取一个名字,填写申请到的AppID(若还没申请到),可以暂时选择用官?#25945;?#20379;的测试号。点击确定,即可打开小程序开发界面。

可以看到项目结构如下:

打开app.json,可以看到代码结构类似以下:

  1. {

  2.  "pages": [

  3.    "pages/index/index",

  4.    "pages/logs/logs"

  5.  ],

  6.  "window": {

  7.    "backgroundTextStyle": "light",

  8.    "navigationBarBackgroundColor": "#fff",

  9.    "navigationBarTitleText": "WeChat",

  10.    "navigationBarTextStyle": "black"

  11.  },

  12.  "sitemapLocation": "sitemap.json"

  13. }

pages定义了小程序的所有页面路径,window定义了导航栏颜色,文?#20540;?#23646;性。

打开index.js,类似如下代码:

  1. //index.js

  2. //获取应用实例

  3. const app = getApp()


  4. Page({

  5.  data: {

  6.    motto: 'Hello World',

  7.    userInfo: {},

  8.    hasUserInfo: false,

  9.    canIUse: wx.canIUse('button.open-type.getUserInfo')

  10.  },

  11.  //事件处理函数

  12.  bindViewTap: function() {

  13.    wx.navigateTo({

  14.      url: '../logs/logs'

  15.    })

  16.  },

  17.  onLoad: function () {

  18.    if (app.globalData.userInfo) {

  19.      this.setData({

  20.        userInfo: app.globalData.userInfo,

  21.        hasUserInfo: true

  22.      })

  23.    } else if (this.data.canIUse){

  24.      // 由于 getUserInfo 是网络请求,可能会在 Page.onLoad 之后才返回

  25.      // 所以此处加入 callback 以?#20048;?#36825;种情况

  26.      app.userInfoReadyCallback = res => {

  27.        this.setData({

  28.          userInfo: res.userInfo,

  29.          hasUserInfo: true

  30.        })

  31.      }

  32.    } else {

  33.      // 在没有 open-type=getUserInfo 版本的兼容处理

  34.      wx.getUserInfo({

  35.        success: res => {

  36.          app.globalData.userInfo = res.userInfo

  37.          this.setData({

  38.            userInfo: res.userInfo,

  39.            hasUserInfo: true

  40.          })

  41.        }

  42.      })

  43.    }

  44.  },

  45.  getUserInfo: function(e) {

  46.    console.log(e)

  47.    app.globalData.userInfo = e.detail.userInfo

  48.    this.setData({

  49.      userInfo: e.detail.userInfo,

  50.      hasUserInfo: true

  51.    })

  52.  }

  53. })

常见页面分为三个组成部分,详见:

  • data: 页面数据,可由MVVM驱动

  • 事件处理函数:如这里的bindViewTap,getUserInfo,可以相应页面的交互,也可以在Page定义的函数中互相调用。

  • 生命周期函数:常用?#23567;猳nLoad(页面加载时触发,可以从query字段中拿到页面?#38382;?、onShow(页面显示时触发)、onShareAppMessage(用户点击转发或分享时触发)

打开index.wxml,可看到类似如下代码:

  1. <!--index.wxml-->

  2. <view class="container">

  3.  <view class="userinfo">

  4.    <button wx:if="{{!hasUserInfo && canIUse}}" open-type="getUserInfo" bindgetuserinfo="getUserInfo"> 获取头像昵称 </button>

  5.    <block wx:else>

  6.      <image bindtap="bindViewTap" class="userinfo-avatar" src="{{userInfo.avatarUrl}}" mode="cover"></image>

  7.      <text class="userinfo-nickname">{{userInfo.nickName}}</text>

  8.    </block>

  9.  </view>

  10.  <view class="usermotto">

  11.    <text class="user-motto">{{motto}}</text>

  12.  </view>

  13. </view>

这里的view、button、image组件都是官?#25945;?#20379;的组件,view可以理解为一个盒子模型用于?#24615;?#20869;容,button是一个按钮。

这里的button的open-type表明了这是一个获取用户属性的?#24418;?#21487;以在bindgetuserinfo里触发getUserInfo函数。这里的image绑定了一个bindViewTap点击事件,当用户点击这个图片时则会触发bindViewTap事件。定义在index.js里的bindViewTap方法会触发对应的逻辑。

这里的wx:if是官?#25945;?#20379;的语法糖,用来动态?#25925;?#25110;者隐藏模块,比如这里的wx:if="{{!hasUserInfo && canIUse}}"是当用户数据不为空且canIUse为true时才?#25925;盡?#36825;里的{{motto}}则会把data中定义的motto字段显示出来,且跟随motto值的变更,动态更?#29575;?#22270;(这里小程序底层做了由数据驱动视图更新的?#34385;椋?/p>

setData是官?#25945;?#20379;的更?#29575;?#25454;的方法,不要视图直接用this.motto = 'xxx'去更新,这样视图不会得到同步更新。而应该采用

  1. this.setData({

  2.    motto: 'xxx'

  3. })

这里需注意几点:

  • 避免过频过大调用setData(因为底层需要通信)

  • 不要对data设置undefined

wx:for,是用于渲染重复模块的语法糖,适合如列表渲染等场景,详情参见

以上就是一个小型页面的渲染和构建过程。

尝试使用官?#25945;?#20379;的API

在不同业务场景下,往往需要使用底层的一些能力,如地理位置、?#20302;?#20449;息、绘图等,详见。以下为地理位?#27809;?#21462;(某些API需要向用户授权):

  1. wx.getLocation({

  2.  type: 'wgs84',

  3.  success(res) {

  4.    const latitude = res.latitude

  5.    const longitude = res.longitude

  6.    const speed = res.speed

  7.    const accuracy = res.accuracy

  8.  }

  9. })

某些时候还需要将用户某些数据(非敏感数据)存在本地缓存(因为web是无状态的),便可以利用本地缓存API:

  1. try {

  2.  wx.setStorageSync('key', 'value')

  3. } catch (e) { }

又如绘图的场景,需要用到canvas能力,可参见写的这篇文章小程序canvas的那些事。

往往的交互还需要通过网络从服务端获取数据,则需要发起网络请求,大多时候业务是需要检验用户身份的(即发请求时需要带登录态),这里可以考虑用同事封装的请求库(比较优雅的封装了登录模块),业务开发者可以聚焦于业务开发,而不用花太多精力在登录上,github传送门: https://github.com/IvinWu/weRequest

复杂的业务场景

服务端支持

更复杂的业务场景就需要后端服务,包括登录服务,用户信息,客服消息等可以参见文档。

云开发

若你对后端开发不熟悉,还可以利用小程序团队提供的云开发,让你不用了解太多后端知识,只需掌握JS则可以搭建自己后台服务。

总结

以上只是对如何快速上手开发小程序的一个缩影,具体深入的开发还需要结合文?#21040;?#34892;?#23548;?#21487;以参考之前个人尝试的小程序经验沉淀,文章链接。后续会从小程序的设计、后端等多方面进行介绍。

鲜花
鲜花 (1)
鸡蛋
鸡蛋

刚表态过的朋友 (1 人)

分享至 : QQ空间
收藏
原作者: 心有林夕 来自: 微信开发者社区
  • 4fun 2019-4-27 16:19
    期待后续的文章。我现在学习小程序有一段时间。开发文档也看了一遍,文章里面讲的东西也都能明白。但是还是不知道如何下手,请问博主有没有什么好的建议,方便的话指导一下,谢谢!
辽宁十一选五平台
辽宁十一选五一定牛 辽宁十一选五推荐号码预测专家今日 辽宁十一选五六月走势分析预测 哪个平台有辽宁十一选五开奖结果 辽宁十一选五六码遗漏 辽宁十一选五公告 辽宁十一选五前三技巧 辽宁十一选五任选四最大遗漏 辽宁十一选五小助手 辽宁十一选五360 辽宁十一选五组二技巧 辽宁十一选五推荐号码 辽宁十一选五计划软件手机版 辽宁十一选五连线走势图百度乐彩 辽宁十一选五玩法
人民币兑换里尔 超级大乐透走势图带连线图 使命召唤ol吃鸡模式 比特币暴涨暴跌 白狮走势图 芬里尔加点 拳皇命运什么时候出 里昂纳多小李子百科 武里南联是哪个城市