码迷,mamicode.com
首页 > 微信 > 详细

微信小程序开发

时间:2017-06-04 09:52:31      阅读:376      评论:0      收藏:0      [点我收藏+]

标签:dex   公众   发送   deb   import   console   app   let   cat   

微信小程序开发

  • 开发环境搭建
  • 应用架构解析
  • 逻辑层
    • 注册程序
    • 注册页面
    • 模块化
    • API
  • 视图层
    • 数据绑定
    • 条件渲染和列表渲染
    • 模块
    • 事件
    • 引用
    • WXSS
    • 组件

  之前觉得微信小程序已经不行了,似乎没有任何生机,很多人可能都不知道有小程序这回事吧,但是最近在做vue的项目,发现美团和饿了么的微信公众号都连接到了小程序,主要特点就是非常像原生app,可以发送到桌面,使用感受就如同原生app,感觉还是很舒服的,所以觉得有必要尝试一下微信小程序的开发。。。嗯,现在已经是凌晨3点了,小程序啊。 

  根据上述的目录,我们主要讨论一下开发环境的搭建、应用架构、逻辑层、视图层。 

 

一、开发环境搭建

  官网有工具的下载地址,我们直接点击下载即可,目前的最新版本是2017年5月26日更新的。 看来腾讯还是不会轻易放弃小程序的。 

 

 

二、 应用架构解析

  我们看看最简单的小程序的目录结构:

  • pages
    • index
      • index.js
      • index.wxml
      • index.wxss
    • logs
      • logs.js
      • logs.json
      • logs.wxml
      • logs.wxss
  • utils
    • util.js
  • app.js
  • app.json
  • app.wxss

  首先比较突出的就是 wxss 和 wxml了, 其实就相当于css和html, 另外还有json的使用,主要是来配置小程序的,如颜色等。 毫无疑问app.js就是入口文件了。  不难看出 pages 就表示多个页面了。  还有一个公用的工具函数 util.js。 

  

  我们先说说单个页面吧。 微信小程序要求页面文件名和目录的名称必须一致。比如这里的logs目录对应的一堆logs开头的文件,所以这样我们在使用的时候就不需要在js中import了。

  下面是js文件和模板文件:

//index.js
//获取应用实例
var app = getApp()
Page({
  data: {
    motto: Hello World,
    userInfo: {}
  },
  //事件处理函数
  bindViewTap: function() {
    wx.navigateTo({
      url: ../logs/logs
    })
  },
  onLoad: function () {
    console.log(onLoad)
    var that = this
    //调用应用实例的方法获取全局数据
    app.getUserInfo(function(userInfo){
      //更新数据
      that.setData({
        userInfo:userInfo
      })
    })
  }
})

 

<!--index.wxml-->
<view class="container">
  <view  bindtap="bindViewTap" class="userinfo">
    <image class="userinfo-avatar" src="{{userInfo.avatarUrl}}" background-size="cover"></image>
    <text class="userinfo-nickname">{{userInfo.nickName}}</text>
  </view>
  <view class="usermotto">
    <text class="user-motto">{{motto}}</text>
  </view>
</view>

其中的 Page 是框架提供的全局方法。 和vue类似的mvvm框架一样,采用了数据绑定、事件绑定、生命周期、路由这些。  下面是一个logs.json文件:

{
    "navigationBarTitleText": "查看启动日志"
}

即json文件就是做一些基础的配置的。 因为小程序毕竟还是运行在微信上的, 所以这些配置文件log就是改一下标题栏颜色、文字之类的东西。   

 

 

三、逻辑层

  微信小程序的逻辑层就下面这些:

  • 注册程序
  • 注册页面
  • 模块化
  • API

 1. 注册程序

  注册程序是提供给我们的,是一个全局的App方法(传入一个对象), 这个作为应用的主入口,当然是写在app.js这个入口文件中的,可以监听一些应用生命周期的事件,然后配置一些全局变量。 

//app.js
App({
  onLaunch: function () {
    //调用API从本地缓存中获取数据
    var logs = wx.getStorageSync(logs) || []
    logs.unshift(Date.now())
    wx.setStorageSync(logs, logs)
  },
  getUserInfo:function(cb){
    var that = this
    if(this.globalData.userInfo){
      typeof cb == "function" && cb(this.globalData.userInfo)
    }else{
      //调用登录接口
      wx.login({
        success: function () {
          wx.getUserInfo({
            success: function (res) {
              that.globalData.userInfo = res.userInfo
              typeof cb == "function" && cb(that.globalData.userInfo)
            }
          })
        }
      })
    }
  },
  globalData:{
    userInfo:null
  }
})

  这里的onLaunch是一个生命周期的钩子,然后getUserInfo相当于一个全局的方法(使用getApp()获取实例以后就可以调用,在Index.js里的), 而globalData作为app的属性自然就担任了全局变量这个角色了, 然后还使用了本地存储的api,来提高用户体验。

 

  

2. 注册页面  

  Page方法就是用于注册页面的,页面也会有一些生命周期的钩子等。 另外,Page还有一个事件: 即onPullDownRefresh,即页面下拉刷新。 

    
<view bindtap="viewTap"> click me </view>

 

Page({
  viewTap: function() {
    console.log(view tap)
  }
})

  除了使用bind + event作为属性名还可以使用catch + event, 区别在于后者可以继续阻止冒泡。 事件绑定函数同样还有一个参数event, 但是event包含了该节点的星星所以很快就可以完成逻辑定制。 

 

 

3. 模块化

  目前的小程序并不支持node_modules的导入, 所以要用就可能复制过去,另外和webpack的模块化是类似的, 即小程序各个page的作用域是独立的,如果要对外暴露接口的话需要使用模块导出。

 

// common.js
function sayHello(name) {
  console.log(`Hello ${name} !`)
}
function sayGoodbye(name) {
  console.log(`Goodbye ${name} !`)
}
module.exports.sayHello = sayHello
// module.exports = { sayHello: sayHello }

 

这里要说的是: 微信小程序是完全支持es6语法的,不用担心兼容性的问题啦!  

 

 

4. API

  小程序的API都通过wx这一个全局对象来访问的, 和运行在浏览器的JavaScript类似,wx也提供了如http请求、本地存储、绘图这一类的api, 除此之外,还有一些更为本地化的api,比如拨打电话、重力感应、交互反馈、支付这样的api。 可以查询小程序api。其实真的是非常方便的。

 

 

 

四、视图层  

  微信小程序也是自制了一套标签,成为WXML(weixin Markup Language), 同样也是基于组件的。 与之配合的样式表称为 WXSS (weixin Style Sheet)。 

 

1. 数据绑定

  数据绑定采用Mustache语法,也就是双大括号。值的注意的是大括号里支持一些ES6的表达式,比如说展开语法和简化的对象属性写法

    
<template is="objectCombine" data="{{...obj1, ...obj2, e}}"></template>
Page({
  data: {
    obj1: {
      a: 1,
      b: 2
    },
    obj2: {
      c: 3,
      d: 4
    },
    e: 5
  }
})

 

这样得到的结果就是: {a: 1, b: 2, c: 3, d: 4, e: 5}。  

 

2. 条件渲染和列表渲染

条件渲染和列表渲染很简单,就像vue.js里两个指令v-ifv-for,小程序里用的是wx:ifwx:for,用两个简单的DEMO过一下

<!-- 条件渲染 -->
<view wx:if="{{length > 5}}"> 1 </view>
<view wx:elif="{{length > 2}}"> 2 </view>
<view wx:else> 3 </view>
<!-- 列表渲染 -->
<view wx:for="{{array}}">
  {{index}}: {{item.message}}
</view>

 

 

3. 模板

  即我们需要定义一个模板来复用。

<template name="msgItem">
  <view>
    <text> {{index}}: {{msg}} </text>
    <text> Time: {{time}} </text>
  </view>
</template>
<template is="msgItem" data="{{...item}}"/>

 

 

4. 事件

  

前面简单提了一下事件的两种绑定方式,现在简单列一下wx支持的一些冒泡事件名称:

  • touchstart 手指触摸动作开始
  • touchmove 手指触摸后移动
  • touchcancel 手指触摸动作被打断,如来电提醒,弹窗
  • touchend 手指触摸动作结束
  • tap 手指触摸后马上离开
  • longtap 手指触摸后,超过350ms再离开

其余的事件都是不冒泡的,那些就因组件而异了,比如说<form />的submit等。然后之前也提过,事件参数就只有一个event,所以要传值的时候data-属性就显得很重要了,因为事件对象可以获取到一个dataset对象,对应都是就是各个自定义的data-属性。

 

 

5. 视图的引用

就像ejs里会有include一样,模板语言肯定是会有引用嵌套的功能的,wx里提供了两种方法,分别是importinclude,见DMEO

<!-- item.wxml -->
<template name="item">
  <text>{{text}}</text>
</template>
<import src="item.wxml"/>
<template is="item" data="{{text: ‘forbar‘}}"/>

 

 

也可以是include,

<!-- index.wxml -->
<include src="header.wxml"/>
<view> body </view>
<!-- header.wxml -->
<view> header </view>

 

 

6. wxss

    继承了css的大部分特性。 

 

 

 

 

 

 

 

  

 

 

 

 

 

 

 

 

 

 

 

 

 

  

 

 

 

 

 

 

 

 

 

 

 

 

  

  

 

微信小程序开发

标签:dex   公众   发送   deb   import   console   app   let   cat   

原文地址:http://www.cnblogs.com/zhuzhenwei918/p/6939391.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!