vue学习,使用provide/inject通信

提示:组件的provide,可以被其内所有层级的组件,通过inject引用

文章目录

  • 前言
  • 一、通信组件
  • 二、效果
  • 三、参考文档
  • 总结


前言

需求:使用provide/inject通信

一、通信组件

1、AA.vue

<template><div class="test"><p>1级 provid</p><p><BB /></p></div>
</template><script>
import BB from './BB'
export default {name: 'AA',components:{BB},data () {return {title:'---测试provid和inject通讯',name:'张三'}},provide(){return {title:this.title,changeName(name){this.name = name;console.log(this.name)},}},created(){console.log(this.name,'1级')}
}
</script>

2、BB.vue

<template><div class="test"><p>2级 inject  {{ title }}</p><p><CC /></p></div>
</template><script>
import CC from './CC'
export default {name: 'BB',components:{CC},inject:{title:{type:String,default:''},changeName:{type:Function,default:function(name){}}},data () {return {}},created(){this.changeName('李四')}
}
</script>

3、CC.vue

<template><div class="test"><p>3级 inject  {{ title }}</p><p><DD/></p></div>
</template><script>
import DD from './DD'
export default {name: 'CC',components:{DD},inject:{title:{type:String,default:''},changeName:{type:Function,default:function(name){}}},data () {return {}},created(){this.changeName('王五')}
}
</script>

4、DD.vue

<template><div class="test"><p>4级 inject  {{ title }}</p></div>
</template><script>
export default {name: 'DD',inject:{title:{type:String,default:''},changeName:{type:Function,default:function(name){}}},data () {return {}},created(){this.changeName('赵六')}
}
</script>

二、效果

在这里插入图片描述

AA组件引用BB组件
BB组件引用CC组件
CC组件引用DD组件
BB、CC、DD都可以通过 inject 获取到AA的provide
provide与inject之间的通讯,既可以传输数据,也可以传输方法
在BB、CC、DD调用AA的方法修改AA的name

不能在inject的changeName方法里,直接修改provide的title

更新beforeCreate状态
初始化inject
初始化props、setup、methods、data、computed、watch
初始化provide
更新created状态

三、参考文档

1、vue provide文档

总结

踩坑路漫漫长@~@