uniapp-嵌套组件里子组件给父组件传值
1.需求描述
由于数据是树状结构,所以用到了组件嵌套, 在嵌套了3层的组件中,第三层子组件要传递值给第一级的父组件
2.解决思路
1)方法:
1.props (如果嵌套组件过多的话,会使代码逻辑过于繁琐)
2. Vuex (一般用于大型项目中,只是用来传值有点大材小用了)
3. Bus (建一个公共的js双方传值和获取值,需要在main主文件中注册bus,只用这一个组件传参,就太麻烦了)
4. 使用uni.emit('functionName','value'),uni.on('functionName',(data)=>{}),全局的发送事件和接收,但是假使这个界面复用了多次该组件,那么在其中某个组件中发送了事件,会导致界面其他复用的组件同时发送事件,所以不采用此方法。
5.使用this.$emit('functionName','value'),组件向上传递值,在上一级通过v-on(@是简写)接收传递过来的参数,用$emit继续向上传递
在这里采用的是第5种方法
3.代码结构
// 父级组件
<view class="aui-picker-select-list">
<aui-picker-item
v-for="(item,index) in searchResult"
:key="item.id"
:node="item"
@nodeSelect ="nodeSelect"
></aui-picker-item>
</view>
<script>
import auiPickerItem from './aui-picker-item.vue'
export default {
name: 'aui-picker',
components:{auiPickerItem},
methods:{
// 子组件中 点击名称选择子项,接收子组件传递过来的参数
nodeSelect(data){
let _this = this;
console.log("data",data)
_this.selectId = data.id;
},
}
}
</script>
// 子组件
<template>
<view class="aui-picker-tree-select-content" >
<view @click.stop="nodeSelect(node)">{{node.name}}</view>
<aui-picker-item
v-for="(item,index) in node.children"
:key="item.id"
:node="item"
@nodeSelect ="nodeSelect">
</aui-picker-item>
</view>
</template>
<script>
import auiPickerItem from './aui-picker-item.vue'
let flag = false;
let selectValue = null;
export default {
name: 'aui-picker-item',
props:{
node:{
type:Object,
default:()=>{ return {}}
}
},
components: {
auiPickerItem
},
methods:{
nodeSelect(node){
let _this = this;
// 递归执行,会根据组件层级执行多次,所以传递数据时做判断仅取最里面那层数据
if(!flag){
selectValue = JSON.parse(JSON.stringify(node));
flag = true;
}
if(_this.level == 0){
flag = false;
}
console.log("----",selectValue)
_this.$emit('nodeSelect',selectValue);
},
},
}
</script>
方法参考:https://blog.csdn.net/weixin_43487782/article/details/107568678

浙公网安备 33010602011771号