• vue中的provide/inject你知道吗(vue2、vue3)?


    昨天看一个项目代码看到了provide,但是学习的时候也没看到,看了官网才知道vue还有这个API。多数情况下,provide会和inject一起使用,又叫“依赖注入”。

    “依赖注入”主要是解决父子组件传值“props逐级传递”问题。所以,provide/inject的作用就是组件间的传值。

    vue2基本用法:

    1.provide

    provide 是一个对象或是返回一个对象的函数。

    写在祖先组件中,用于提供给子组件可以注入的值。组件的关系为a-b-c-d

     在a组件中将参数num进行传递

    1. export default {
    2. components: { BCom },
    3. data() {
    4. return {
    5. num: 2,
    6. };
    7. },
    8. provide() {
    9. return {
    10. num: this.num,
    11. };
    12. },
    13. };

    2.inject

    inject为:一个数组,数组元素为注入的变量

                    一个对象,key为注入的变量,value为一个包含form和default的对象

    1. num: {
    2. from: 'num',
    3. default: '20'
    4. }

      在d组件中接收注入的变量

    写法一:

    1. export default {
    2. inject: ["num"],
    3. };

    写法二:

    1. export default {
    2. inject: {
    3. num: {
    4. form: "num",
    5. default: 20,
    6. },
    7. },
    8. };

     可以看到d中显示的为inject注入的num变量。如果在a中不进行provide,则会显示默认值。


    num 不是响应式的

     

     点击+100按钮,a组件显示的值改变,d组件显示的值没有改变。

    如何成为响应式?

    1.方法一:函数方法

    a组件:

    1. <script>
    2. import BCom from "./b-com.vue";
    3. export default {
    4. components: { BCom },
    5. data() {
    6. return {
    7. num: 2,
    8. };
    9. },
    10. provide() {
    11. return {
    12. num: () => this.num,
    13. };
    14. },
    15. methods: {
    16. add() {
    17. this.num = this.num + 100;
    18. },
    19. },
    20. };
    21. script>
    22. <style>
    23. style>

    b组件 

    1. <script>
    2. export default {
    3. inject: {
    4. num: {
    5. form: "num",
    6. default: () => {},
    7. },
    8. },
    9. };
    10. script>
    11. <style>
    12. style>

    2.方法二:传递this

    a组件

    1. <script>
    2. import BCom from "./b-com.vue";
    3. export default {
    4. components: { BCom },
    5. data() {
    6. return {
    7. num: 2,
    8. };
    9. },
    10. provide() {
    11. return {
    12. AThis: this,
    13. };
    14. },
    15. methods: {
    16. add() {
    17. this.num = this.num + 100;
    18. },
    19. },
    20. };
    21. script>
    22. <style>
    23. style>

    d组件

    1. <script>
    2. export default {
    3. inject: {
    4. AThis: {
    5. form: "AThis",
    6. default() {
    7. return {};
    8. },
    9. },
    10. },
    11. };
    12. script>
    13. <style>
    14. style>

    vue3的基本用法:

    provide() 接受两个参数:第一个参数是要注入的 key,可以是一个字符串或者一个 symbol,第二个参数是要注入的值。

    inject:

            第一个参数是注入的 key。

            Vue 会遍历父组件链,通过匹配 key 来确定所提供的值。如果父组件链上多个组件对同一个 key 提供了值,那么离得更近的组件将会“覆盖”链上更远的组件所提供的值。如果没有能通过 key 匹配到值,inject() 将返回 undefined,除非提供了一个默认值。

            第二个参数是可选的,即在没有匹配到 key 时使用的默认值。它也可以是一个工厂函数,用来返回某些创建起来比较复杂的值。如果默认值本身就是一个函数,那么你必须将 false 作为第三个参数传入,表明这个函数就是默认值,而不是一个工厂函数。

     

    注:在d组件中,如果data中存在变量num,inject又注入了变量num,在页面中会显示data中num的值。

    参考:组合选项 | Vue.js

  • 相关阅读:
    GIS、多场景加载、溶解特效等功能首次公开,全网免费调用!
    【区块链实战】如何创建一个带参数的智能合约
    Vue3 环境变量
    数据结构之栈
    Python数据分析与挖掘————图像的处理
    【华为校招】【校招】【Java】污染水域(DFS)
    NodeJS 如何连接 MongoDB
    项目分析(三个小众的嵌入式产品)
    使用 PAI-DSW x Free Prompt Editing图像编辑算法,开发个人AIGC绘图小助理
    测试工程师应具备何种心态?
  • 原文地址:https://blog.csdn.net/weixin_57399180/article/details/126901339