【Vue 开发实战】基础篇 # 12:常用高级特性provide/inject

简介: 【Vue 开发实战】基础篇 # 12:常用高级特性provide/inject

说明

【Vue 开发实战】学习笔记。



组件通信

provide/inject 底层通用组件用的很多。进行跨组件通信。

e0f684b2b543485e89d41df268eea6f8.png


要实现组件 E 变化,更新 F、I

组件A

<template>
  <div class="border">
    <h1>A 结点(第一级)</h1>
    <button @click="() => changeColor()">改变color</button>
    <ChildrenB />
    <ChildrenC />
    <ChildrenD />
  </div>
</template>
<script>
import ChildrenB from "./ChildrenB";
import ChildrenC from "./ChildrenC";
import ChildrenD from "./ChildrenD";
export default {
  components: {
    ChildrenB,
    ChildrenC,
    ChildrenD
  },
//   provide() {
//     return {
//       theme: {
//         color: this.color
//       }
//     };
//   },
  // 需要响应式数据 
  provide() {
    return {
      theme: this
    };
  },
  data() {
    return {
      color: "blue"
    };
  },
  methods: {
    changeColor(color) {
      if (color) {
        this.color = color;
      } else {
        this.color = this.color === "blue" ? "red" : "blue";
      }
    }
  }
};
</script>


组件E

<template>
  <div class="border2">
    <h3 :style="{ color: theme.color }">E 结点(第三级)</h3>
    <button @click="handleClick">改变color为green</button>
  </div>
</template>
<script>
export default {
  components: {},
  inject: {
    theme: {
      default: () => ({})
    }
  },
  methods: {
    handleClick() {
      if (this.theme.changeColor) {
        this.theme.changeColor("green");
      }
    }
  }
};
</script>


组件F:可以通过 from 命别名

<template>
  <div class="border2">
    <h3 :style="{ color: theme1.color }">F 结点(第三级)</h3>
  </div>
</template>
<script>
export default {
  components: {},
  inject: {
    // 可以通过 from 命别名
    theme1: {
      from: "theme",
      default: () => ({})
    }
  }
};
</script>


组件I:函数式组件需要使用 injections

<template functional>
  <div class="border2">
    <!-- 函数式组件使用injections -->
    <h3 :style="{ color: injections.theme.color }">I 结点(第三级)</h3>
  </div>
</template>
<script>
export default {
  inject: {
    theme: {
      default: () => ({})
    }
  }
};
</script>


点击两个按钮改变颜色,三个子节EFI点都会颜色变化

04914f3ffb8b47c38b628dcd2b80dcce.png


如果在组件C 里添加 provide

<template>
  <div class="border1">
    <h2>C 结点(第二级)</h2>
    <ChildrenE />
    <ChildrenF />
  </div>
</template>
<script>
import ChildrenE from "./ChildrenE";
import ChildrenF from "./ChildrenF";
export default {
  components: {
    ChildrenE,
    ChildrenF
  },
  provide() {
    return {
      theme: {
        color: "green"
      }
    };
  }
};
</script>


EF节点不会变化,只有A节点的按钮点击了I节点才会变化颜色,这个跟冒泡很类似。就像在C节点阻止了冒泡事件一样

96ac02a911f4470e9a301490240ebc74.png

完整源码可以参考这个https://github.com/kaimo313/vue-development-practice/tree/master/vue-demo/src/views/demo12

目录
相关文章
|
2月前
|
存储 JavaScript 数据管理
除了provide/inject,Vue3中还有哪些方式可以避免v-model的循环引用?
需要注意的是,在实际开发中,应根据具体的项目需求和组件结构来选择合适的方式来避免`v-model`的循环引用。同时,要综合考虑代码的可读性、可维护性和性能等因素,以确保系统的稳定和高效运行。
34 1
|
2月前
|
JavaScript
Vue3中使用provide/inject来避免v-model的循环引用
`provide`和`inject`是 Vue 3 中非常有用的特性,在处理一些复杂的组件间通信问题时,可以提供一种灵活的解决方案。通过合理使用它们,可以帮助我们更好地避免`v-model`的循环引用问题,提高代码的质量和可维护性。
44 1
|
3月前
|
API
vue3知识点:provide 与 inject
vue3知识点:provide 与 inject
40 4
vue3知识点:provide 与 inject
|
2月前
|
JavaScript
Vue基础知识总结 4:vue组件化开发
Vue基础知识总结 4:vue组件化开发
|
3月前
|
JavaScript 前端开发 测试技术
组件化开发:创建可重用的Vue组件
【10月更文挑战第21天】组件化开发:创建可重用的Vue组件
31 1
|
6天前
|
JavaScript
vue使用iconfont图标
vue使用iconfont图标
48 1
|
16天前
|
JavaScript 关系型数据库 MySQL
基于VUE的校园二手交易平台系统设计与实现毕业设计论文模板
基于Vue的校园二手交易平台是一款专为校园用户设计的在线交易系统,提供简洁高效、安全可靠的二手商品买卖环境。平台利用Vue框架的响应式数据绑定和组件化特性,实现用户友好的界面,方便商品浏览、发布与管理。该系统采用Node.js、MySQL及B/S架构,确保稳定性和多功能模块设计,涵盖管理员和用户功能模块,促进物品循环使用,降低开销,提升环保意识,助力绿色校园文化建设。
|
2月前
|
JavaScript 前端开发 开发者
vue学习第一章
欢迎来到我的博客!我是瑞雨溪,一名热爱前端的大一学生,专注于JavaScript与Vue,正向全栈进发。博客分享Vue学习心得、命令式与声明式编程对比、列表展示及计数器案例等。关注我,持续更新中!🎉🎉🎉
48 1
vue学习第一章
|
2月前
|
JavaScript 前端开发 索引
vue学习第三章
欢迎来到瑞雨溪的博客,一名热爱JavaScript与Vue的大一学生。本文介绍了Vue中的v-bind指令,包括基本使用、动态绑定class及style等,希望能为你的前端学习之路提供帮助。持续关注,更多精彩内容即将呈现!🎉🎉🎉
34 1
|
2月前
|
缓存 JavaScript 前端开发
vue学习第四章
欢迎来到我的博客!我是瑞雨溪,一名热爱JavaScript与Vue的大一学生。本文介绍了Vue中计算属性的基本与复杂使用、setter/getter、与methods的对比及与侦听器的总结。如果你觉得有用,请关注我,将持续更新更多优质内容!🎉🎉🎉
40 1
vue学习第四章

热门文章

最新文章