在小程序开发过程中,经常出现组件套组件的情况,所以经常出现父组件向子组件传值,子组件向父组件传值的情况,通常都是怎样解决的呢?
这里我用两个小案例来演示一下
1.父组件向子组件传值
2.子组件删除父组件数据
下面让我来模拟一下:
<mark>首先我创建了两个组件和一个页面</mark>
组件:list组件和 item组件 他们都在courses目录下,
页面:在和courses同级路径下我创建了index目录,并将index页面放在其中
这里:我让list组件为中间组件,也就是list组件是item的父组件,index页面调用list组件
<mark>首先index页使用list组件</mark>
代码如下:
在index页面的index.json文件中,添加引用
{
"usingComponents": {
"c-list":"../components/courses/list"
}
}
然后调用它
在index.wxml中调用
<c-list/>
页面准备工作完成
接下来在list组件中完成对item组件的调用
方法同上:
首先在list.json中添加引用
{
"component": true,
"usingComponents": {
"c-item":"./item"
}
}
然后在list.wxml中调用:
<view>
<c-item/>
</view>
完成之后
我要从list中向item中传递参数
先在
list.js中定义data属性:
list:[
"vue",
"mina"
]
然后改造引用代码
此时将list.wxml改造成:
<view>
<c-item title="{{item}}" wx:for="{{list}}"/>
</view>
然后打开item组件
首先在item.js中定义属性
然后打开item.wxml:
输入:
<view>
{{title}}
</view>
这就实现了父组件向子组件传值
保存,你就可以看到效果了
然我我再做一个在子组件中,删除父组件的数据
首先在子组件中添加代码:
<view class="item">
{{title}}
<text class="del" bindtap="delItem">X</text>
</view>
在item.wxss中添加样式
.item{
width: 100%;
height: 200rpx;
border-bottom: 2rpx dotted gray;
font-size: 60rpx;
}
.del{
color: red;
}
效果如下:
然后在item.js中定义delItem方法
<mark>但是我们要删除上面列表中的某项数据的时候,我们需要获取到它的Index值,所以我们现在去它的父组件也就是list组件中定义我们想要的东西:</mark>
我们将index定义为idx
然后我们回到item定义idx数据
现在我们可以写我们上面定义的delItem方法了:
delItem(){
// console.log(this.data.idx);
this.triggerEvent("del", { id: this.data.idx},{})
},
写到这里,我们距离我们需求的实现就很近了
接下来我们回到list组件中完成最后的工作
注意:
<mark>这里对triggerEvent方法解释一下,在微信开放文档中,</mark>
解释是这样子的,具体详细解释请自己在开发文档中查询
所以我们对list组件的wxml代码更改:
<view>
<c-item binddel="delCourse" idx="{{index}}" title="{{item}}" wx:for="{{list}}"/>
//这里的bindedel 意思是自定义del方法,
//binddel="delCourse"意思是:执行del方法时,会执行callback方法,其中delCourse就是callback方法,也就是执行del方法是,delCourse也会执行
</view>
接下来到最后一步:定义delCourse方法
delCourse(e){
console.log("删除",e.detail);
let id=e.detail.id;
this.data.list.splice(id,1);
this.setData({
list:this.data.list
})
}
注意:
e.detail用来获取item.js中的this.triggerEvent(“del”, { id: this.data.idx},{ })这句话中向父组件传递的index值
控制台 console.log(“删除”,e.detail);显示如下:
保存后就可以完成删除操作了
不会制作动图,这里就不再演示了!!!
欢迎探讨,欢迎交流,如有错误,欢迎指出!!!