一、父子组件之间通信的3种方式
1、属性绑定
用于父组件向子组件的只当属性设置数据,但只能设置JSON兼容的数据
2、事件绑定
用于子组件向父组件传递数据,可以传递任意数据
3、获取组件实例
父组件还可以通过this.select Component()获取子组件的实例对象,这可直接访问子组件的任意数据和方法
二、属性绑定
属性绑定用于实现父向子传值,而且只能传递普通类型的数据,无法将方法传递给子组件
示例:
1、先创建一个组件test5,在component文件目录下
2、在wxml文件中进行属性绑定
home.wxml文件中,父组件的中count值
<test5 count="{{count}}"></test5>
<view>父组件中,count的值是:{{count}}</view>
//test5.js文件中,指定count的类型
properties:{
count:Number
}
test5.wxml文件中count的值,并实现子组件count值自增
<view>子组件中count的值是:{{count}}</view>
<button bindtap="addcount">+1</button>
test.js文件中,实现自增
methods:{
addcount(){
this.setData({
count:this.properties.count+1
})
}
}
会发现count自增并没有同步到父组件当中,这里我们要用到事件绑定事件。
三、事件绑定
用于子组件向父组件传递数据,可以传递任意数据。
使用步骤如下:
- 在父组件的js中,定义一个函数,这个函数即将通过自定义事件的形式,传递给子组件
//home.js文件中
syncCount(e){
console.log(e)
})
- 在父组件的wxml中,通过自定义时间的形式,将步骤1定义的函数引用,传递给子组件
home.wxml文件中,父组件的中count值
<test5 count="{{count}}" bind:sync="syncCount"></test5>
<view>父组件中,count的值是:{{count}}</view>
- 在子组件的js文件中,调用this.triggerEvent('自定义事件的名称',{/*参数对象*/}),将数据发送到父组件
test.js文件中,实现自增,触发自定义事件将数值同步给父组件
methods:{
addcount(){
this.setData({
count:this.properties.count+1
})
this.triggerEvent('sync',{value:this.properties.count})
}
}
- 在父组件的js中,通过e.detail获取到子组件传递过来的数据
//home.js文件中
syncCount(e){
this.setData({
count:e.detail.value
})
四、获取组件实例
可在父组件里调用this.selectComponent('id或者class选择器'),获取子组件的实例对象,从而直接访问子组件的任意数据和方法,调用时需要传入一个选择器。
home.wxml文件
<test5 count="{{count}}" bind:sync="syncCount" class="custom" id="cA"> </test5>
<button bindtap="getChild">获取子组件实例</button>
//home.js文件中
getChild(){
const child = this.selectComponent('custom')
child.setData({count:child.properties.count+1})
child.addCount()
},