小程序开发和传统的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>
标签,即便里面没有内容