详解vue3中的非父子组件传值

 更新时间:2021年12月28日 08:43:05   作者:高级白嫖工程师  
这篇文章主要为大家介绍了vue3中的非父子组件传值,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
vue2中非父子组件的传值主要是通过事件总线,创建一个vue实例,通过在不同的组件中导入该实例来实现非父子组件之间的通信行为。
vue3提供了**provide**和**inject**属性,可以实现非父子组件之间的通信;
假设有三个组件:App.vue(父级)、sub1(子级)、sub2(子级的子级):

App.vue

<template>
  <div style="border: 1px solid pink">
    <h1>我是你爹</h1>
    <span>👇</span>
    <sub1/>
  </div>
</template>
<script>
  import sub1 from './sub1'
	export default {
		name: "App",
    components:{
			sub1,
    },
    provide:{ // 通过在父组件中定义provide   声明要传递的值
			names:['peanut','javascriptKing']
    }
	}
</script>
<style scoped>
</style>

sub1.vue

<template>
  <h2>我是一级子组件</h2>
  <span>👇</span>
  <sub2/>
</template>
<script>
  import sub2 from "./sub2";
	export default {
		name: "sub1",
    components:{
			sub2,
    }
	}
</script>
<style scoped>
</style>

sub2.vue

<template>
  <h3>我是最小的,也就是孙子</h3>
  <div>我引用了顶级组件的names数组 ===> {{names}}</div>
</template>
<script>
	export default {
		name: "sub2",
    // 通过inject  在子组件中接受某一个跨级传递的值
    inject:['names'],
	}
</script>
<style scoped>
</style>

实现效果如下,可以看到是可以正常获取顶级组件中传递的值:

在这里插入图片描述

但是也会出现问题:

就是顶级组件要传递的值变化时,如何让它实现响应式呢?

如何在provide属性中通过this获取当前的实例呢?

这里就需要将provide属性书写为方法的形式,返回一个数组或者对象:

<template>
  <div style="border: 1px solid pink">
    <h1>我是你爹</h1>
    <span>👇</span>
    <sub1/>
  </div>
</template>
<script>
  import sub1 from './sub1'
	export default {
		name: "App",
    data(){
			return {
				names:['peanut','javascriptKing']
      }
    },
    components:{
			sub1,
    },
    /*这样写是拿不到this的   此时的this只想script内的作用域   this为undefined*/
    /*provide:{
			this.names,
    }*/
  //  应该这样写
    provide(){
    	return {
    		names:this.names
      }
    }
	}
</script>
<style scoped>
</style>

像上面这样写,虽然可以拿到this指向的实例下的数据,但是如何让它们形成依赖关系,实现响应式呢?对此我们需要对App.vue做如下的修改:

<template>
  <div style="border: 1px solid pink">
    <h1>我是你爹</h1>
    <span>👇</span>
    <sub1/>
  </div>
</template>
<script>
  import sub1 from './sub1'
  import { computed } from 'vue'
	export default {
		name: "App",
    data(){
			return {
				names:['peanut','javascriptKing']
      }
    },
    components:{
			sub1,
    },
    /*这样写是拿不到this的   此时的this只想script内的作用域   this为undefined*/
    /*provide:{
			this.names,
    }*/
  //  应该这样写
    provide(){
    	return {
    		names:computed(() =>{ this.names.length }) // 使用计算属性返回该变量   使得names与data中的names形成依赖关系
      }
    },
    mounted() {
    	setInterval(()=>{
    		this.names.push('vue大王!')
      },1000)
    }
	}
</script>
<style scoped>
</style>

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注脚本之家的更多内容!

相关文章

  • 关于Vue3中的响应式原理

    关于Vue3中的响应式原理

    这篇文章主要介绍了关于Vue3中的响应式原理,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-09-09
  • Bpmn.js 自定义描述文件使用说明

    Bpmn.js 自定义描述文件使用说明

    这篇文章主要为大家介绍了Bpmn.js 自定义描述文件使用说明,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-10-10
  • vue3实战-子组件之间相互传值问题

    vue3实战-子组件之间相互传值问题

    这篇文章主要介绍了vue3实战-子组件之间相互传值问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-03-03
  • vue.js 中使用(...)运算符报错的解决方法

    vue.js 中使用(...)运算符报错的解决方法

    这篇文章主要介绍了vue.js 中使用(...)运算符报错的解决方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-08-08
  • vue3中实现图片压缩的示例代码

    vue3中实现图片压缩的示例代码

    图片压缩是一种比较便捷的压缩方式,本文主要介绍了vue3中实现图片压缩的示例代码,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧
    2024-02-02
  • vue中拆分组件的实战案例

    vue中拆分组件的实战案例

    最近在学vue,试着写个单页应用,在写组件,拆分组件时遇到一些困惑,下面这篇文章主要给大家介绍了关于vue中拆分组件的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-12-12
  • vue.js input框之间赋值方法

    vue.js input框之间赋值方法

    今天小编就为大家分享一篇vue.js input框之间赋值方法具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-08-08
  • 详解vue-resource promise兼容性问题

    详解vue-resource promise兼容性问题

    这篇文章主要介绍了详解vue-resource promise兼容性问题,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-06-06
  • Vue Camera组件功能及常用使用方法

    Vue Camera组件功能及常用使用方法

    Vue Camera组件是一个用于在Web应用中使用摄像头的Vue插件,它提供了一些常见的功能和方法来控制摄像头和捕获图像或视频数据,本文给大家介绍Vue Camera组件的常见功能和使用方法,感兴趣的朋友一起看看吧
    2023-11-11
  • vue自定义组件如何添加使用原生事件

    vue自定义组件如何添加使用原生事件

    这篇文章主要介绍了vue自定义组件如何添加使用原生事件,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-04-04

最新评论