小程序開發和傳統的web開發有相識的地方,可是也有不一樣的地方,要區分。html
:name="name"
是靜態的,父組件改變name
子組件仍是不會變,子組件仍是父組件第一次傳進來的值.sync
,也即:name.sync="name"
$emit
事件的方式實現,這裏wepy能夠在子組件中的props配置類型、默認值、以及是否雙向
中的twoWay
爲true
,就實現了雙向數據流twoWay
的值是false
,若是不是特別須要,請按單向數據的方式傳遞數據最好,再配合$emit、$broadcast、$invoke
,儘可能少用,除非是表單這種constructor
構造函數中添加靜態屬性,可是要添加super()
,纔可使用this
來添加靜態屬性constructor
執行時間比較早,全部在這裏面的變量,能夠直接用於wepy組件,也就是能夠和data
的數據同樣用於數據綁定,可是原生組件只能放在data
中constructor
中定義,不要都放到data
中,data
中的數據都會被轉換成Observable
數據的$broadcast、$emit、$invoke
constructor
調用,能夠在onLoad
中調用events
用於定義事件,用於接收用的$broadcast('eventName', ...args)
,可是全部的後代
組件都會觸發該事件,若是後代組件的events.eventName
有定義到,會調用其函數,並將args
傳給其函數$emit
,同理,父組件(到根組件)的events
要事先定義好事件$broadcast和$emit
都會一次觸發多個事件,定義events
的時候要注意$invoke('./componentName', 'methodName', args)
能夠直接調用指定組件的方法methods
中定義的方法,若是是調用父組件能夠用../
往上層走,若是要調用下層的./oneLevelComponentName/twoLevelComponentName
methods
或者events
,還可使用mixins
components
中,和Vue的同樣,可是使用的時候是不一樣的,一個組件對應一個id,若是在同一個模板中使用同一組件超過2次,它們會共享數據{ coma: Button, comb: Button }
,實際上就是new多一個Button
Vue和React
這樣的組件,它們會new一個新的Button
實例<repeat>
中,在小程序中就會去new一個新的組件實例,若是你的內容重複,又不想定義多個組件名(new 多個組件),可使用循環體<repeat>
slot
,若是那個組件和數據無關,只是單純的用於slot
模板,它們最終生成的標籤是不一樣的,由於這些生成的模板和數據無關,若是生成的模板中包含數據,那生成那部分關聯數據的元素都是同樣的<view class='{{ className }}' >{{ data }}</view>
這些花括號中的數據className
和data
,它們是共享的,因此它們最終生成的視圖是如出一轍的//repeat包着元素view text等 <repeat for="{{mylist}}"> <view>{{item.name}}</view> </repeat> //repeat包着自定義組件 <repeat for='{{myList}}'> <List :mylist.sync="mylist"></List> <Item :item='item'></Item> </repeat>
repeat的組件
中使用props
、computed
、watch
等特性repeat
的時候,儘可能使用純文本渲染的組件,純組件.
或者[]
的方式選擇想傳的數據,可是自定義組件不能夠,要整個數據傳入,或者傳入item
([{}, {}]
這種格式的數據),item
就是wx:item
data
中,纔有效果,靜態屬性不行$broadcast、$emit、$invoke
$broadcast、$emit、$invoke
的方式傳值,別老想着使用props
,會有不少莫名的bug$broadcast、$emit、$invoke
,能夠經過mixins
拯救一下,惟一沒什麼莫名bug的Object
原生對象的信息data
須要的對象要帶原型鏈,不能用這個,不然在綁定數據到模板的時候會報錯""
,別用''
(想殺人):age='2'
和:age="2"
,前面的''
是傳不了2
給age
的,除非使用"2"
,哈哈哈哈哈哈哈哈""
不要使用''
,好比定義事件函數的時候'handlerTap("123")'
,這裏是不成功的給handlerTap
傳遞參數"123"
,可是"handlerTap('123')"
就能夠???@tap="handlerTap('love')"
,最外層用""
,最內層''
原生組件:就是小程序自帶的組件<view>、<text>、<image>等等
,這些原生組件綁定數據,要求數據必須在data
中,若是綁定的數據不在data
中將不會渲染vue
<template> <view class="{{className}}">{{text}}</view> </template> <script> import wepy from 'wepy' // 注意:這個是組件實例 export default class Test extends wepy.component { data = { text: 123, className: 'hahah' } // 因爲computed最後返回值會成爲data中一部分,computed也能夠用於原生組件數據綁定 // 可是在repeat的時候,不可使用這個,repeat的時候不可使用computed和watch computed = { text () { return this.text + 1 } } } </script>
自定義組件:綁定數據能夠是data
中,也能夠用自定義函數,或者靜態變量來綁定數據,且綁定數據的方式要和原生小程序的同樣,不能用vue的方式react
<template> <UserComponent :fn="fn()" :staticV="staticVar" :text="text"/> </template> <script> import wepy from 'wepy' // 注意:這個是頁面實例 export default class Index extends wepy.page { constructor () { super() this.staticVar = 123 } data = { text: 123 } // 自定義函數 fn () { return '123' } // 因爲computed最後返回值會成爲data中一部分,computed也能夠用於原生組件數據綁定,若是和data中的屬性重名,優先使用computed的 computed = { text () { return this.text + 1 } } } </script>
原生組件的綁定只能是data中的數據,不能夠像vue中的那樣綁定數據,可是若是是自定義的組件就能夠像vue那樣綁定數據。還有methods
自能用於定義事件處理程序,不能把自定義函數定義在裏面web
也就是碰到原生組件的時候,請用原生小程序的方式處理,碰到自定義組件的時候才考慮用你vue的方式處理,也就是區分原生組件和自定義組件很是重要canvas
../
這種,由於當組件被引入到某個頁面時,會相對哪一個頁面,致使路徑沒法複用/
,在小程序中,/
是指的當前項目的文件夾,例如:/pages/index
,這裏的首個字符/
就至關於@/
都是指向/src
目錄@/assets/icons/logo.png
能夠用/assets/icons/logo.png
,由於第一個字符是/
就至關於@/
,表示/src
目錄之下wx.navigateTo
,若是導航到/pages/user
,不要使用/
或者../
,直接user
,最終會自動拼成/pages/user
,也就是說微信默認/pages/
+user
<component-name sid="canvas"> <canvas canvas-id="canvas"></canvas> </component-name>
component-name
是一個組件,接收sid只要是爲了能夠wx.createCanvasContext(this.sid)
wx.createCanvasContext(this.sid)
,因此咱們能夠把canvas獨立成slot<style>
不起做用<style>
標籤,致使子組件不編譯<style>
標籤的內容<style>
標籤,即便裏面沒有內容