Closed Wscats closed 5 years ago
mpvue github地址 请参见是一个使用Vue.js开发小程序的前端框架。框架基于Vue.js核心,mpvue修改了Vue.js的runtime
和compiler
实现,使其可以运行在小程序环境中,从而为小程序开发引入了整套Vue.js开发体验
搭建环境
# 1. 先检查下 Node.js 是否安装成功
$ node -v
v8.9.0
$ npm -v
5.6.0
# 2. 可以考虑切换源为 taobao 源
$ npm set registry https://registry.npm.taobao.org/
# 3. 全局安装 vue-cli
# 一般是要 sudo 权限的
$ npm install --global vue-cli@2.9
# 4. 创建一个基于 mpvue-quickstart 模板的新项目
# 新手一路回车选择默认就可以了
$ vue init mpvue/mpvue-quickstart my-project
# 5. 安装依赖
$ cd my-project
$ npm install
$ npm run dev
新增的页面需要重新npm run dev
来进行编译,比如新建的vue组件需要重新编译,小程序的工具才能看出效果
vue文件对应小程序里面的那些文件
<template>
/* 这部分相当于原生小程序的 app.wxml */
</template>
<script>
/* 这部分相当于原生小程序的 app.js */
export default {
created () {
}
}
</script>
<style>
/* 这部分相当于原生小程序的 app.wxss */
</style>
全局的app.json
就是对应小程序的app.json
{
"pages": [
"pages/index/main",
"pages/logs/main",
"pages/counter/main",
"pages/setting/main"
],
"window": {
"backgroundTextStyle": "light",
"navigationBarBackgroundColor": "#fff",
"navigationBarTitleText": "你是谁",
"navigationBarTextStyle": "black"
},
"tabBar": {
"list": [{
"pagePath": "pages/index/main",
"text": "首页"
}, {
"pagePath": "pages/logs/main",
"text": "日志"
},{
"pagePath": "pages/counter/main",
"text": "vuex"
}, {
"pagePath": "pages/setting/main",
"text": "设置"
}]
}
}
局部的main.json
对应的是page里面的xxx.json
{
"navigationBarTitleText": "查看启动日志",
"navigationBarBackgroundColor": "#58bc58"
}
状态管理
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
const store = new Vuex.Store({
state: {
count: 0
},
mutations: {
increment: (state) => {
const obj = state
obj.count += 1
},
decrement: (state) => {
const obj = stat
obj.count -= 1
}
}
})
export default store
组件可以通过store.commit('increment')
,注意发现在语法上用单引号,结尾不要用分号,还有函数括号前要放空格,不然会报错
import store from '../store'
export default {
methods: {
edit () {
store.commit('increment')
}
}
}
可以直接使用store.state.xxx
获取state的值
import store from '../store'
export default {
computed: {
count () {
return store.state.count
}
}
}
v-html
指令不可用小程序的界面并不是基于浏览器的BOM/DOM的,所以不能动态的在界面模板里直接插入HTML片段来显示
如果要插入html片段可以用<rich-text>
组件或者wxParse
(https://github.com/icindy/wxParse)来实现
{{}}
中的表达式功能存在诸多限制,以下功能都不能使用表达式中放函数
<div>{{ formatMessage(msg) }}</div>
调用对象的方法
<div>{{ msg.trim().split(',').join('#') }}</div>
过滤器
<div>{{ msg | format }}</div>
methods
下的函数
<div v-if="getErrorNum() > 0 && code == 10001" class="error">{{ errorMsg }}</div>
官方建议的方案如下
<template>
<div :class="classStr"></div>
</template>
<script>
export default {
data() {
return {
classObject: {
active: true,
'text-danger': false
}
}
},
computed: {
classStr() {
let arr = []
for (let p in this.classObject) {
if (this.classObject[p]) {
arr.push(p)
}
}
return arr.join(' ')
}
}
}
</script>
v-for
时,必须指定索引index<ul v-for="(category, index) in categories">
<li v-for="(product, productIndex) in category.products">{{product.name}}</li>
</ul>
在mpvue中,一般可以使用Web的DOM事件名来绑定事件,mpvue会将Web事件名映射成对应的小程序事件名
// 左侧为WEB事件 : 右侧为对应的小程序事件
{
click: 'tap',
touchstart: 'touchstart',
touchmove: 'touchmove',
touchcancel: 'touchcancel',
touchend: 'touchend',
tap: 'tap',
longtap: 'longtap',
input: 'input',
change: 'change',
submit: 'submit',
blur: 'blur',
focus: 'focus',
reset: 'reset',
confirm: 'confirm',
columnchange: 'columnchange',
linechange: 'linechange',
error: 'error',
scrolltoupper: 'scrolltoupper',
scrolltolower: 'scrolltolower',
scroll: 'scroll'
}
一句话,表单组件又多又复杂,框架可能Hold不住。所以在实际开发中,推荐直接使用小程序的表单组件标签来写,而不是使用Web的表单组件标签来写。当然了,在mpvue中使用了小程序的组件标签,数据绑定功能还是完全可以用的
<template>
<div>
<picker @change="handlePickerChange" :value="selectedIndex" :range="messages">
<view class="picker">当前消息:{{ messages[selectedIndex] }}</view>
</picker>
</div>
</template>
<script>
export default {
data () {
return {
selectedIndex: 0,
messages: ['Hello', 'World', 'Haha']
}
},
methods: {
handlePickerChange (e) {
console.log(e)
}
}
}
</script>
另外,在Vue开发Web应用的时候,通常使用vue-router来进行页面路由。但是在mpvue小程序开发中,不能用这种方式,请使用标签和小程序原生API wx.navigateTo等来做路由功能
还有就是请求后端数据,我们通常在Web开发中使用axios等ajax库来实现,但是在小程序开发中也是不能用的,也请使用小程序的原生API wx.request等来进行
安装
官方文档 首先下载微信小程序的开发者工具小程序开发者工具,再下载微信小程序DEMO源码 安装开发者工具,并解压DEMO源码,在开发者工具中导入源码项目
注册
打开微信公众平台,在里面注册账号选择小程序,用户体选择个人
app.json(全局配置)
我们使用
app.json
文件来对微信小程序进行全局配置,决定页面文件的路径、窗口表现、设置网络超时时间、设置多tab等pages
如果学过其他框架,可以把它理解为路由,在
app.json
文件的pages
属性里面定义路由和对应的组件,默认是在pages文件夹里面寻找xxx组件的xxx.js文件,当然没有后缀pages接受一个数组,每一项都是字符串,来指定小程序由哪些页面组成,每一项代表对应页面的
路径+文件名
信息.json,.js,.wxml,.wxss
的四个文件进行整合tabBar
tabBar其实就是配置底部的选项卡,在
app.json
文件的tabBar
属性里面定义底部的选项卡的详细配置如果我们的小程序是一个多 tab 应用(客户端窗口的底部或顶部有tab栏可以切换页面),那么我们可以通过tabBar配置项指定tab栏的表现,以及tab切换时显示的对应页面
tabBar是一个数组,只能配置最少2个、最多5个tab,tab按数组的顺序排序
一般我们可以新建一个放图标的文件夹image,此文件夹跟pages同级,然后在里面我们可以放图标
我在文件夹里面放了两张图片
wscats.pn
g和wscats-active.png
,我们就可以在iconPat
h和selectedIconPath
里面把图片引进来,设置的分别是切换选项卡时候出现的图标list接受一个数组,数组中的每个项都是一个对象,其属性值如下
window
用于设置小程序的状态栏、导航条、标题、窗口背景色
networkTimeout
可以设置各种网络请求的超时时间
debug
可以在开发者工具中开启debug模式,在开发者工具的控制台面板,调试信息以info的形式给出,其信息有Page的注册,页面路由,数据更新,事件触发 。可以帮助开发者快速定位一些常见的问题
page.json
每一个小程序页面也可以使用.json文件来对本页面的窗口表现进行配置。 页面的配置比app.json全局配置简单得多,只是设置app.json中的window配置项的内容,页面中配置项会覆盖app.json的window中相同的配置项
页面的.json只能设置window相关的配置项,以决定本页面的窗口表现,所以无需写 window 这个键
如图,在logs组件里面的logs.json设置对应的参数,那就会覆盖app.json原有的配置项
xxx.json(页面配置)
每一个小程序页面也可以使用.json文件来对本页面的窗口表现进行配置
页面的配置只能设置
app.json
中部分window
配置项的内容,页面中配置项会覆盖app.json
的window
中相同的配置项,示例如下组件
可以建立一个
components
的目录在
tab-content1.wxml
写入以下代码,这里可以配合使用<slot></slot>
让我们使用组件的时候插入片段里面新建一个目录为
tab-content1
的目录作为组件的放置位置,然后可以在pages
目录下的index.json
下写入以下代码然后在
pages
目录下的index.wxml
下写入以下代码,来使用组件生命周期
组件里面有的生命周期,可以在这里做逻辑或者监听其他组件的逻辑来通信数据
组件通信
组件和组件之间的通信,我个人会用
$on
和$emit
来实现,参考发布订阅模式父传子的数据通信
父组件在子组件的标签值上传递值
子组件
<pannel>
用properties
属性接受,逻辑中用this.properties.channel
获取值,这种方法类似于vue和react中的props
方法模板语法
使用 name 属性,作为模板的名字。然后在
<template/>
内定义代码片段,可以构建一个可复用的模板使用模板,先 import 对应模板的文件路径,使用 is 属性,声明需要的使用的模板,然后将模板所需要的 data 传入
is 属性可以使用 Mustache 语法,来动态决定具体需要渲染哪个模板:
WeUI
在Github下载WeUI for 小程序 为微信小程序量身设计 Github仓库
把
weui-wxss/dist/style/
目录中的weui.wxss放到程序根目录下,然后在app.wxss全局引用weui样式然后就可以复制粘贴
src/example
文件夹里面的组件进行开发了导航
导航相当于路由跳转,用
navigator
标签,然后在属性值上面放自己定义好的组件页面比如要跳到详情页组件就写
url="/pages/detail/detail"
,如果要跳到主页那就写url="/pages/index/index"
,根据pages属性值里面定义好的路由去改相应的链接地址路由传参
我们在链接上带上哈希值,然后传递给详情页
在详情页中获取options中的哈希值
获取视图输入值
input输入框显示自己输入的值,
bindinput
来对输入的值进行接受,再把值赋给一个变量value="{{user}}"
显示绑定的值,bindinput绑定事件,在e中的detail属性中获取常用API
wx.request(Object object) 发起
HTTPS
网络请求,这个相当于微信小程序给我们封装好的ajax
请求在使用之前记得要去后台页面设置安全域名
当然如果只是测试可以勾选
不校验合法域名