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 

posted @ 2023-05-14 22:26  爱美丽——  阅读(1495)  评论(0)    收藏  举报