当前位置:网站首页>Provide 和 Inject 的用法
Provide 和 Inject 的用法
2022-08-04 05:36:00 【m0_67402026】
前言
父子组件传参可以通过props
和emit
来实现,但是当组件的层次结构比较深时,props
和emit
就没什么作用了。vue为了解决这个提出了Provide / Inject
,知道这个东西,但是一直没用过,最近碰到了一个问题,踩了一些坑,在这里记录一下
备注:
我安装的是vue3.x,v-model用的是3.x的语法。
2.x和3.x用法一致,我这里是用2.x写的
通用知识
基本用法
provide 选项应该是:一个对象或返回一个对象的函数
inject 选项应该是:一个字符串数组,或 一个对象,对象的 [key] 是本地的绑定名
provide 和 inject 绑定并不是可响应的。这是刻意为之的。
代码执行顺序
data->provide->created->mounted
基本代码
主要使用grandpa
和grandson
这两个组件,son
在这里充当一个层级
//grandpa.vue
<template>
<div>
<h3 style="margin-bottom: 20px">爷爷组件</h3>
<el-button type="primary" @click="lookDetail">查看</el-button>
<!-- 儿子组件 -->
<son v-model:visible="openDialog"></son>
</div>
</template>
<script>
import Son from "./son.vue";
export default {
components: { Son },
data() {
return {
message: "aa",
openDialog: false,
};
},
methods: {
lookDetail() {
this.openDialog = true;
},
},
};
</script>
//son.vue
<template>
<div>
<el-dialog v-model="visible" title="父组件" width="50%" append-to-body @close="closeDialog">
<el-button type="primary" @click="lookDetail">查看</el-button>
</el-dialog>
<!-- 孙子组件 -->
<grandson v-model:visible="openDialog"></grandson>
</div>
</template>
<script>
//孙子组件
import grandson from "./grandson.vue";
export default {
components: {
grandson,
},
props: {
visible: {
type: Boolean,
default: false,
},
},
emit: ["update:visible"],
data() {
return {
openDialog: false,
};
},
methods: {
closeDialog() {
this.$emit("update:visible", false);
},
lookDetail() {
this.openDialog = true;
},
},
};
</script>
//grandson.vue
<template>
<div>
<el-dialog v-model="visible" title="孙子组件" width="30%" @close="closeDialog">
</el-dialog>
</div>
</template>
<script>
export default {
props: {
visible: {
type: Boolean,
default: false,
},
},
emit: ["update:visible"],
data() {
return {};
},
methods: {
closeDialog() {
this.$emit("update:visible",false)
},
},
};
</script>
如图:
基础用法: 传个字符串
简单修改一下组件
//grandpa.vue
export default {
components: { Son },
provide:{
grandpaMsg:'哈哈哈'
}
//grandson.vue
<template>
<div>
<el-dialog v-model="visible" title="孙子组件" width="30%" @close="closeDialog">
<div>
信息:{
{grandpaMsg}}
</div>
</el-dialog>
</div>
</template>
<script>
export default {
props: {
visible: {
type: Boolean,
default: false,
},
},
inject:['grandpaMsg'],
数据过来了,如图:
中级用法
传个字符串没啥用,如果要传data
里的一个属性呢?简单修改一下组件
//grandpa.vue
components: { Son },
provide:{
grandpaMsg:this.message
},
data() {
return {
message: "aa",
openDialog: false,
};
},
嗯,直接报错,哈哈哈。
如果要使用data
里的参数,需要这样写
//grandpa
components: { Son },
provide(){
return {
grandpaMsg:this.message
}
},
结果:
高级用法
一开始就说了这个不是响应式,简单看一下
<h3 style="margin-bottom: 20px">爷爷组件</h3>
<el-button type="primary" @click="lookDetail">查看</el-button>
<el-button type="primary" @click="message='abcde'">改变数据</el-button>
如图:
那如何变成响应式的呢,再简单改一下
//grandpa
provide(){
return {
grandpaMsg:()=>this.message
}
},
//grandson
<el-dialog v-model="visible" title="孙子组件" width="30%" @close="closeDialog">
<div>
信息:{
{grandpaMsg()}}
</div>
</el-dialog>
如图:
拓展:你可以直接传一个this
过去,这样孙子组件会获得爷爷组件的实例对象,这种方式也是响应式的
provide(){
return {
grandpaMsg:this
}
},
先自我介绍一下,小编13年上师交大毕业,曾经在小公司待过,去过华为OPPO等大厂,18年进入阿里,直到现在。深知大多数初中级java工程师,想要升技能,往往是需要自己摸索成长或是报班学习,但对于培训机构动则近万元的学费,着实压力不小。自己不成体系的自学效率很低又漫长,而且容易碰到天花板技术停止不前。因此我收集了一份《java开发全套学习资料》送给大家,初衷也很简单,就是希望帮助到想自学又不知道该从何学起的朋友,同时减轻大家的负担。添加下方名片,即可获取全套学习资料哦
边栏推荐
- matlab的2DCNN、1DCNN、BP、SVM故障诊断与结果可视化
- Prematurely reached end of stream
- 如何在Excel 里倒序排列表格数据 || csv表格倒序排列数据
- 普通用户 远程桌面连接 服务器 Remote Desktop Service
- Gramm Angle field GAF time-series data into the image and applied to the fault diagnosis
- Nacos 原理
- Operating System Random
- U-Net详解:为什么它适合做医学图像分割?(基于tf-Kersa复现代码)
- 自适应迁移学习核极限学习机用于预测
- this关键字,构造函数
猜你喜欢
Gramm Angle field GAF time-series data into the image and applied to the fault diagnosis
A priori box (Anchor) in target detection
EfficientNet解读:神经网络的复合缩放方法(基于tf-Kersa复现代码)
电脑软件:推荐一款磁盘空间分析工具——WizTree
matlab的2DCNN、1DCNN、BP、SVM故障诊断与结果可视化
CMDB 腾讯云部分实现
curl (7) Failed connect to localhost8080; Connection refused
Mac安装PHP开发环境
手把手教你Charles抓包工具使用
科研绘图图表类型种类繁多,本文告诉你如何选择!
随机推荐
Implementation of ICEEMDAN Decomposition Code in MATLAB
SENet detailed explanation and Keras reproduction code
基于子空间结构保持的迁移学习方法MLSSM
软件:给大家推荐一款国产非常好用的效率软件uTools
电脑软件:推荐一款磁盘空间分析工具——WizTree
代码小变化带来的大不同
QT QOpenGLWidget 全屏导致其他控件显示问题
JVM 快速检测死锁
网络技巧:教你给路由器装上电池,断电照样可以上网!
【C# - 爬虫】使用Selenium实现爬虫,获取近七天天气信息(包含完整代码)
YOLOv3详解:从零开始搭建YOLOv3网络
电脑知识:台式电脑应该选择品牌和组装,值得收藏
事件链原理,事件代理,页面的渲染流程,防抖和节流,懒加载和预加载
matlab封闭曲线拟合 (针对一些列离散点)
E-R图总结规范
格拉姆角场GAF将时序数据转换为图像并应用于故障诊断
av_read_frame 阻塞,基于回调的解决办法
Base64编码原理
如何用matlab做高精度计算?【第二辑】
“需求370解决解决爬取章节之后主题讨论评论消失问题”工作总结