vue祖孙组件间传值

provide是一个对象或返回一个对象的函数。该对象包含可注入其子孙的property

在最外层组件(祖先)使用provide,如下:

    data() {
        return {
            featureQuery: {
                layerList: [],  //图层列表数据
                layerType: "",  //图层类型(symbol:点,line:线)
                layerCode: "",  //图层code
            },
        }
    },
    provide() {
        return {
            queryData: this.featureQuery
        }
    },

当然this.featureQuery可以改为this,element的组件中也是用的this,但页面中变量及方法比较多,担心会有性能方面影响,故而只注入部分使用到的变量。

在需要用到这些变量的页面中使用inject,如下:

    inject: ['queryData'],
    watch: {
        "queryData.layerCode": {
            handler(obj) {
                
            },
            deep: true,
        },
    },

然后即可在该页面直接this.queryData.layerCode使用,也可以进行监听。这样即完成了祖先向子孙传值

如果子组件需要调用父/祖先的方法,第一种可以将上面的this.featureQuery改为this,然后直接在子孙组件通过this.queryData[方法名]即可,另一种就是通过emit传回去,可以使用$listeners,使用方法如下

有A、B、C三个页面,B是A的子组件,C是B的子组件
C组件

//页面点击事件
handleClick(data) {
	this.$emit("current-layer", data);
}

B组件(页面引入C组件的地方添加v-on=“$listeners”)

<C v-on="$listeners"></C>

A组件

<B @current-layer="handleChangeLayer"></B>

handleChangeLayer(data){
	//这里调用A组件的方法即可
}
Vue 3中,可以使用Props和Events来实现祖孙组件之间的。 1. Props:父组件可以通过props将数据递给子组件。在子组件中,可以通过props选项接收这些数据。具体步骤如下: 父组件: ```vue <template> <div> <ChildComponent :message="message" /> </div> </template> <script> import ChildComponent from './ChildComponent' export default { components: { ChildComponent }, data() { return { message: 'Hello from parent component' } } } </script> ``` 子组件: ```vue <template> <div> <p>{{ message }}</p> </div> </template> <script> export default { props: ['message'] } </script> ``` 在父组件中,使用冒号(:)绑定属性,并将数据递给子组件。子组件中通过props选项接收这个属性。 2. Events:子组件可以通过事件将数据递给父组件。在子组件中,可以使用$emit方法触发一个自定义事件,并递数据给父组件。具体步骤如下: 父组件: ```vue <template> <div> <ChildComponent @update-message="updateMessage" /> <p>{{ message }}</p> </div> </template> <script> import ChildComponent from './ChildComponent' export default { components: { ChildComponent }, data() { return { message: '' } }, methods: { updateMessage(newMessage) { this.message = newMessage } } } </script> ``` 子组件: ```vue <template> <div> <button @click="sendMessage">Send Message</button> </div> </template> <script> export default { methods: { sendMessage() { this.$emit('update-message', 'Hello from child component') } } } </script> ``` 在子组件中,使用@click绑定一个点击事件,并在事件处理程序中使用this.$emit方法触发自定义事件。父组件中通过@update-message监听这个事件,并在对应的事件处理函数中更新父组件的数据。 这样就实现了祖孙组件之间的。父组件通过props将数据递给子组件,子组件通过事件将数据递给父组件
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值