vue的provide与inject如何使用?能否实现双向绑定?

news/2025/1/11 14:15:19/

provide与inject

  • 1. provide与inject用法
  • 2.使用示例
  • 3.provide与inject实现双向绑定

vue 组件间的通信方式有很多种,所以使用时需要考虑哪种方式是最合适的。若仅仅是简单的隔代组件通信,我认为使用 provide与inject会更加方便。

1. provide与inject用法

作用:实现组件间的通信
适用范围:有一些深度嵌套的组件,而深层的子组件只需要父组件的部分内容。
使用方式:

provide 选项应该是:一个对象或返回一个对象的函数
inject 选项应该是:一个字符串数组,或 一个对象,对象的 [key] 是本地的绑定名

2.使用示例

示例为 Father.vue > Son.vue > GrandSon.vue 三层嵌套结构

Father.vue
父组件进行变量提供,供后代组件使用

<template><div><div><h1>这里是父组件</h1><button @click="changeName">click me</button><Son /></div></div>
</template>
<script>
import Son from "./Son";
export default {name: "Father",components: {Son},// 提供变量,供后代组件使用provide() {return {// 普通提供变量,不会发生响应式变化name: this.name,// 响应式提供getReactiveName: () => this.name};},data() {return {name: "默认姓名:张三"};},methods: {changeName(val) {// 修改需要注入的变量this.name = "父组件修改后的姓名: 杰森斯坦森·郭达";}}
};
</script>

Son.vue
此处并无实际意义,仅为了增加组件嵌套层级

<template><div><h4>这里是儿子组件</h4><GS /></div>
</template>
<script>
import GS from "@/views/GrandSon.vue";
export default {name: "Son",components: {GS}
};
</script>

GrandSon.vue
此为孙组件,进行注入父组件提供的数据

<template><div><h6>这里是孙子组件<br /><br /><!-- 普通的使用提供的值 -->正常使用:{{name}}<br /><br /><!-- 响应式使用方式1: 直接执行提供的函数-->直接执行提供的响应函数: {{getReactiveName()}}<br /><br /><!-- 响应式使用方式2: 使用computed计算属性-->使用computed计算属性: {{reactiveNameFromParent}}</h6></div>
</template>
<script>
export default {name: "GrandSon",inject: ["name", "getReactiveName"],computed: {reactiveNameFromParent() {return this.getReactiveName();}}
};
</script>

点击父组件里的按钮,可以发现父组件内的变量发生了变化,而后代组件内也可以响应式发生变化。

3.provide与inject实现双向绑定

Father.vue
父组件注入的地方多提供一个修改的方法

// ...provide() {return {// 普通注入变量,不会发生响应式变化name: this.name,// 响应式注入getReactiveName: () => this.name,// 给后代提供修改变量的方法setName: ({ name }) => {this.name = name;}};},
// ...

Grandson.vue
孙组件

// ...  多接受一个提供的方法inject: ["name", "getReactiveName",'setName'],
// ...
methods: {changeName() {// 调用父组件提供的方法进行修改this.setName({name:'孙组件修改后的姓名: 尼古拉斯·赵四'});}}

思路:
父组件多提供一个修改父组件内变量的方法,后代组件使用该方法并传递相应参数,父组件变量修改完成后会,后代组件相应的地方会响应式的进行修改。

如此即可实现双向绑定。


http://www.ppmy.cn/news/335871.html

相关文章

I O 流

Stream流的三类方法 获取Stream流 创建一条流水线&#xff0c;并把数据放到流水线上准备进行操作中间方法 流水线上的操作 一次操作完毕之后&#xff0c;还可以继续进行其他操作。终结方法 一个Stream流只能有一个终结方法 是流水线上的最后一个操作 Stream流的获取方法 单列…

Day12 面向对象的三大特性

面向对象的三大特征&#xff1a;封装、继承、多态 1、封装 (1)类的封装特征 隐藏对象的属性和实现细节&#xff0c;只对外提供必要的方法。 通过“私有属性、私有方法”的方式&#xff0c;实现“封装”。Python 追求简洁的语法 class game:def __init__(self,type):self.ty…

叫醒我的不是闹钟,是梦想

转眼间就来到兄弟连一个多月了&#xff0c;在兄弟连呆过的兄弟相信大家都有这种体会&#xff0c;每天撸代码到深夜&#xff0c;早上就要七八点多就要起床。相信大家已经习惯了这种生活。 虽睡眠虽然不充足但我从没有一次迟到&#xff0c;而且我从没有设闹钟的习惯&#xff0c;因…

Python之类和对象【三】---继承(2.1-多继承,多重继承,多态)

文章目录 前言一、多继承二、多重继承三、多态总结 前言 记录多继承&#xff0c;多态的含义&#xff0c;理清思路。 一、多继承 含义&#xff1a;一个子类可以继承多个父类。 class 子类(父类1, 父类2.....): pass 一般这种情况&#xff0c;父类之间是没有什么关联&…

杰森斯坦森是机器人_MIT机器人参加风靡全球的“踢瓶盖挑战”,模仿人类肌肉,任务正确率97%...

导读&#xff1a;前段时间&#xff0c;瓶盖挑战赛一下子火遍了社交网络&#xff0c;面对着人类花式的开盖风采&#xff0c;来自MIT的机器人Baxter坐不住了&#xff0c;通过对肌肉神经信号的处理&#xff0c;也呈现了一把“盖世风采”。 自从哈萨克斯坦的跆拳道冠军法拉比杰森斯…

ZZULIOJ1071-1080

目录 1071: 分解质因子 1072: 青蛙爬井 1073: 再谈鸡兔同笼问题 1074: 百钱买百鸡 1075: 聚餐人数统计 1076: 三位数求解 1077: 空心菱形 1078: ab&#xff08;多实例测试1&#xff09; 1079: ab&#xff08;多实例测试2&#xff09; 1080: ab&#xff08;多实例测试…

rd640服务器引导,联想RD640服务器外部简介_ThinkServer RD640 S2603v2 4/300AHROD_服务器产业-中关村在线...

联想RD640服务器外部简介&#xff1a; 硬件是服务器产品的基础&#xff0c;对服务器的性能有着巨大的影响&#xff0c;服务器平台整体性能优劣我们可以从硬件设计方面看出一些端倪。外观设计精致细腻的产品&#xff0c;其产品内部设计自然也不会很差。而如果连产品外观设计都非…