一.父传子
描述:
在父组件中通过自定义属性来传值,在子组件js文件中通过properties属性来进行接受,可以设置默认值,最后在子组件中直接渲染就可以。
1、父组件的json文件中声明对引用子组件
// parents.json
{
"usingComponents": {
"w-child": "/components/children/children"
}
}
2、父组件的wxml中使用子组件
<w-child fatherName='mike fatherage='25'></w-child>
3、子组件在js中获取父组件中传过来的值
properties是组件的对外属性,是属性名到属性设置的映射表,属性设置中可包含三个字段, type 表示属性类型、 value 表示属性初始值、 observer 表示属性值被更改时的响应函数
// child.js
properties: { // 在这里拿到了数据之后可以直接使用了(在wxml模板渲染,或者js中使用this.data.fatherName/this.properties.fatherName 都能获取到),不要直接修改properties属性中的数据
fatherName: {
type: String
},
fatherage: Number
}
二.子组件向父组件传值( this.triggerEvent() )
主要实现原理:事件发布与订阅方式(也称为观察者模式)
在子组件中定义方法名中通过this.triggerEvent(‘派发的方法’,‘要传递的数据’)来传递数据 【类似于this.$emit】
在父组件中通过bindconfirm=“方法名”(getConfirmData),然后在getConfirmData方法中有一个data的参数,就是传递过来的值
1、子组件触发自定义事件,传递数据给父组件
<!-- child.wxml-->
<view class="nav" data-index="0" bindtap="onChangeValue">tab</view>
2、子组件在点击事件中主动触发自定义事件
// child.js
onChangeValue(e) {
var index = e.target.dataset.index
//子组件传值给父组件
let detail = { // 需要传递什么数据就在这个对象中写
val: index
}
// detail 对象,提供给事件监听函数的参数数据
// changeIndex 是自定义名称事件,父组件中监听使用
this.triggerEvent('changeIndex', myEventDetail)
}
3、父组件wxml中监听子组件的自定义事件
<!-- parents.wxml-->
<!-- 注意这里写的事件监听名字-->
<w-child bind:changeIndex="getIndex" />
4、父组件的js中添加事件函数,获取子组件传递过来的数据
// parents.js
getIndex( data) { // paramData参数就是子组件的this.triggerEvent()
console.log(data.detail.val) // 0
}