首先亲子组件的参与可以通过props和emit实现,但当组件层次结构较深时,props和emit不起作用。 vue为了解决这个提出了Provide/Inject。 我知道这个,但是一直没用。 最近遇到问题,踩了几个洞,所以在这里记录
备注:
我正在安装vue3.x。 v-model使用的是3.x的语法。
2.x和3.x使用方法一致。 我这里用2.x写
通用知识基本用法
provide选项必须是对象或返回对象的函数
inject选项必须是字符串数组或对象。 对象的[key]是本地绑定名称
provide 和 inject 绑定并不是可响应的。这是刻意为之的。
代码执行顺序
数据提供-创建-装载
基本代码
son在这里作为一个级别工作,主要使用两个组件: grandpa和grandson
//grandpa.vuetemplatedivh3style=' margin-bottom 336020 px '爷爷组件/h3el-buttontype=' primary ' @ click=' look detail -儿子的组件----sonv-model : visible=' opendialog '/son/detail export default { components : { son },data(}{return{message:'aa ',openDialog: false,} );methods : { look detail () } { this.opendialog=true; (,)、); /script//son.vuetemplatedivel-dialogv-model=' visible ' title='父组件' width=' 50 % ' append-to-body @ close -后代组件Grandson/div/templatescript//孙子组装体importgrandsonfrom './gra and son export default { components : { grandson,},prop default: false,}、emault (,methods: ) closedialog ) (this.$emit )、update:visible )、false );lookDetail () { this.openDialog=true; (,)、);/script//grandson.vuetemplatedivel-dialogv-model=' visible ' title='孙组件' width=' 30 % ' @ close=' close visible:{type:boolean,default: false,}、emit:['update360]、methods: { closeDialog () } this.$ /script图:
传递基础用法:字符串
很容易修改组件
//grandpa.vueexportdefault { components : { son }, provide:{ grandpaMsg: '哈哈' }//grandson.vuetemplatedivel-dialogv-model=' visible ' title='孙组件' width=' 30 % ' @ close=' close dialog ' ditle visible:{type:boolean,default: false,},inject:['granddanddard,}
中级用法
传递字符串是没什么用的。 如果要传递data属性呢? 很容易修改组件
//grandpa.vue components : { son }、provide : { grandpa msg : this.message }、data{return}message3360 )
使用data的参数时,必须这样写
//grandpa components: { Son },provide((return ) grandpamsg:this.message ),结果:
高级用法
我从一开始就说这不是回应式,让我们简单看看
H3 style=' margin-bottom : 20px '爷爷的组件/h3el-buttontype=' primary ' @ click=' look detail '显示/El-button
那么如何成为应答式,再简单修改一下吧
//grandpaprovide((return ) grandpamsg: )=this.message } } ),//grandson El-dialogv-model=' visible ' ti ibib
展开:可以直接告诉你this的过去。 这样,孙子程序集就可以得到爷爷程序集的实例对象。 这个方法也是响应性的
provide () return (grandpa msg : this )、