前言
之前做小程式是用它原本的程式碼進行開發的,在第二個小程式專案的時候就嘗試用wepy框架進行開發,用用新的東西,多get一個小技能
在這裡把一些使用的方法和遇到的問題記錄一下,方便之後開發的時候參考.
複製程式碼
開始
1 全域性安裝wepy,有安裝淘寶映象可以使用cnpm,否則就使用npm
cnpm install wepy-cli -g
2 初始化專案 1.7.0 之後版本
wepy init standard 你的專案名
3 切換到你的專案下
cd 你的專案名
4 安裝依賴
cnpm i
5 開啟實時編譯
npm run dev 或者 wepy build -watch
編譯之後會生成一個dist檔案,這個就是轉換成小程式格式程式碼,
可以把dist拖入到微信開發者工具裡面檢視效果
複製程式碼
開發
寫法
雖然wepy是基礎vue的小程式框架,但是寫法上面還是有許多的差別
複製程式碼
原生的寫法
var app = getApp()
Page({
data: {},
onLoad: function () {}
})
複製程式碼
wepy的寫法
<script>
import wepy from 'wepy'
export default class Index extends wepy.page {
data = {},
methods = {},
onload () {}
}
</script>
複製程式碼
vue的寫法
<script>
export default {
data () {
return {}
},
methods: {}
}
</script>
複製程式碼
元件的寫法
import wepy from 'wepy'
export default class Index extends wepy.component {
data = {},
methods = {},
onload () {}
}
複製程式碼
元件開發時 wepy.page要記得換成wepy.component, 雖然寫wepy.page時可以正常的執行,但是遇到父元件想子元件傳參,子元件就無法接受到
子元件的 onShow() 和 onLoad() 一樣只會觸發一次.
複製程式碼
使用
事件繫結語法使用優化語法代替,常用的幾個語法:
bindtap="click" 替換為 @tap="click",
catchtap="click" 替換為 @tap.stop="click"。
capture-bind:tap="click" 替換為 @tap.capture="click",
capture-catch:tap="click" 替換為 @tap.capture.stop="click"。
複製程式碼
事件傳參使用優化後語法代替。
bindtap="click" data-index={{index}} 替換為 @tap="click({{index}})"。
這個也和vue的類似.不過wepy要加上{{}}
複製程式碼
wepy預設對小程式的API全部進行了Promisechuli,可以使用async/await進行開發,這個在開發的時候非常的方便
// 原生的登入API
onLoad = function () {
var self = this;
wx.login({
success: function (data) {
wx.getUserInfo({
success: function (userinfo) {
self.setData({userInfo: userinfo});
}
});
}
});
}
// wepy優化後的登入API
async onLoad() {
await wepy.login();
this.userInfo = await wepy.getUserInfo();
}
複製程式碼
資料的繫結方式
// 原生程式碼:
<view> {{ message }} </view>
onLoad: function () {
this.setData({message: 'hello world'});
}
// WePY
<view> {{ message }} </view>
onLoad () {
this.message = 'hello world';
}
* 在非同步函式和onLoad() onShow() 中更新資料的時候,一定要加上this.$apply();否則資料更新會延遲,
元件內則使用this.$parent.$apply()
複製程式碼
獲取和修改globalData的值
在page頁面中通過this.$parent.globalData可以訪問和修改
在component中通過this.$parent.$parent.globalData才能訪問到
複製程式碼
事件的處理
<template>
<view @tap="tap">Click me</view>
</template>
import wepy from 'wepy'
export default class Index extends wepy.page {
data = {},
methods = {
tap () {
console.log('click');
this.test();
}
},
// 自定義事件
test () {
console.log('test')
}
onload () {}
}
在wepy中,html頁面也就是 template 中使用的事件,要寫在 methods 裡面,自定義的事件寫在methods外面,在 methods 中的方法無法互相呼叫
複製程式碼
元件
// parent.wpy
<template>
<Child :title.sync="parentTitle" :page="parentPage" @tap.user="tap">Click me</Child>
</template>
<script>
import wepy from 'wepy'
export default class Index extends wepy.page {
data = {
parentTitle:'父元件',
parentPage: '父級頁面'
},
methods = {
tap (data) {
console.log(data); // 子元件
this.title = data
}
},
onload () {}
}
</script>
:title.sync可以動態接收引數,向子元件動態傳遞引數, :page傳遞的值只支援初始化時填入的值,修改無效
需要動態的向子元件傳遞引數時.可以加上.sync
// child.wpy
<template>
<view @tap="click">{{title}}</view>
</template>
<script>
import wepy from 'wepy'
export default class Index extends wepy.component {
props = {
title: String,
}
data = {
childTitle:'子元件',
childPage: '子頁面'
},
methods = {
tap () {
this.$emit('changeTitle', this.childTile)
}
},
onload () {}
}
</script>
複製程式碼
元件在引入的時候,設定 wx:if 只會隱藏元件,元件仍會被載入,元件 onLoad 裡的事件會被觸發,如果不想頁面載入的時候就觸發元件裡面的事件,可以通過 watch 監聽元件的變化
<Child :pageBol.sync="workerToast"></Childc>
<script>
watch = {
pageBol (newValue, oldValue) {
if (newValue) {
// do something
}
}
}
</script>
複製程式碼
向子元件傳遞引數的時候,如果要傳遞一個物件中的某一個值,通過物件點的方式(obj.child)傳遞過去的值,子元件無法接收到,需要把整個物件一起傳遞過去