Vue 使用依赖注入的方式共享数据的过程

 更新时间:2023年11月06日 16:18:27   作者:前端扎啤  
赖注入的方式共享数据在Vue中是一种高级特性,它主要用于开发插件或库,或者处理一些特殊的场景,这篇文章主要介绍了Vue 使用依赖注入的方式共享数据,需要的朋友可以参考下

什么是vue依赖注入?

Vue是一个用于构建用户界面的渐进式框架。

它提供了一种简单而灵活的方式来管理组件之间的数据流,即依赖注入(Dependency Injection,DI)。

依赖注入是一种设计模式,它允许一个组件从另一个组件获取它所依赖的数据或服务,而不需要自己创建或管理它们。这样可以降低组件之间的耦合度,提高代码的可维护性和可测试性。

依赖注入示意图

provide和inject

在Vue中,依赖注入的方式是通过provide和inject两个选项来实现的。

provide选项允许一个祖先组件向下提供数据或服务给它的所有后代组件。
inject选项允许一个后代组件接收来自祖先组件的数据或服务。
这两个选项都可以是一个对象或一个函数,对象的键是提供或接收的数据或服务的名称,值是对应的数据或服务。函数的返回值是一个对象,具有相同的格式。

下面是一个简单的例子,演示了如何使用依赖注入的方式共享数据:

父组件

<template>
  <div>
    <h1>我是祖先组件</h1>
    <child-component></child-component>
  </div>
</template>
<script>
import ChildComponent from './ChildComponent.vue'
export default {
  name: 'AncestorComponent',
  components: {
    ChildComponent
  },
  // 提供一个名为message的数据
  provide: {
    message: 'Hello from ancestor'
  }
}
</script>

子组件

<template>
  <div>
    <h2>我是后代组件</h2>
    <p>{{ message }}</p>
  </div>
</template>
// 后代组件
<script>
export default {
  name: 'ChildComponent',
  // 接收一个名为message的数据
  inject: ['message']
}
</script>

这样,后代组件就可以直接使用祖先组件提供的数据,而不需要通过props或事件来传递。

需要注意的是,依赖注入的数据是不可响应的,也就是说,如果祖先组件修改了提供的数据,后代组件不会自动更新。
如果需要实现响应性,可以使用一个响应式的对象或者一个返回响应式对象的函数作为provide的值。

实现响应式依赖注入的几种方式

一、提供响应式数据

方法是在提供者组件中使用ref或reactive创建响应式数据,然后通过provide提供给后代组件。后代组件通过inject接收后,就可以响应数据的变化。

提供者:

<template>
  <div>
    <h1>我是提供者组件</h1>
    <button @click="count++">增加计数</button>
    <child-component></child-component>
  </div>
</template>
<script>
import ChildComponent from './ChildComponent.vue'
import { ref, provide } from 'vue'
export default {
  name: 'ProviderComponent',
  components: {
    ChildComponent
  },
  setup() {
    // 使用ref创建一个响应式的计数器
    const count = ref(0)
    // 提供给后代组件
    provide('count', count)
    return {
      count
    }
  }
}
</script>

接收者:

<template>
  <div>
    <h2>我是接收者组件</h2>
    <p>计数器的值是:{{ count }}</p>
  </div>
</template>
<script>
import { inject } from 'vue'
export default {
  name: 'ChildComponent',
  setup() {
    // 接收提供者组件提供的响应式对象
    const count = inject('count')
    return {
      count
    }
  }
}
</script>

二、提供修改数据的方法

提供者组件可以提供修改数据的方法函数,接收者组件调用该方法来更改数据,而不是直接修改注入的数据。

提供者:

<template>
  <div>
    <h2>我是接收者组件</h2>
    <p>计数器的值是:{{ count }}</p>
  </div>
</template>
<script>
import { inject } from 'vue'
export default {
  name: 'ChildComponent',
  setup() {
    // 接收提供者组件提供的响应式对象
    const count = inject('count')
    return {
      count
    }
  }
}
</script>

接收者:

<template>
  <div>
    <h2>我是接收者组件</h2>
    <p>消息是:{{ message }}</p>
    <button @click="updateMessage">更改消息</button>
  </div>
</template>
<script>
import { inject } from 'vue'
export default {
  name: 'ChildComponent',
  setup() {
    // 接收提供者组件提供的响应式对象和方法
    const { message, updateMessage } = inject('message')
    return {
      message,
      updateMessage
    }
  }
}
</script>

三、使用readonly包装

通过readonly包装provide的数据,可以防止接收者组件修改数据,保证数据流的一致性。

提供者:

<template>
  <div>
    <h1>我是提供者组件</h1>
    <p>姓名是:{{ name }}</p>
    <child-component></child-component>
  </div>
</template>
<script>
import ChildComponent from './ChildComponent.vue'
import { ref, provide, readonly } from 'vue'
export default {
  name: 'ProviderComponent',
  components: {
    ChildComponent
  },
  setup() {
    // 使用ref创建一个响应式的姓名
    const name = ref('Alice')
    // 使用readonly包装提供的值,使其不可修改
    provide('name', readonly(name))
    return {
      name
    }
  }
}
</script>

接收者:

<template>
  <div>
    <h2>我是接收者组件</h2>
    <p>姓名是:{{ name }}</p>
    <button @click="name = 'Bob'">尝试修改姓名</button>
  </div>
</template>
<script>
import { inject } from 'vue'
export default {
  name: 'ChildComponent',
  setup() {
    // 接收提供者组件提供的只读对象
    const name = inject('name')
    return {
      name
    }
  }
}
</script>

四、使用<script setup>

<script setup>组合式写法下,provide和inject默认就是响应式的,无需额外处理。

总结

依赖注入的方式共享数据在Vue中是一种高级特性,它主要用于开发插件或库,或者处理一些特殊的场景。

到此这篇关于Vue 使用依赖注入的方式共享数据的文章就介绍到这了,更多相关Vue 依赖注入使用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 详解vue-cli 接口代理配置

    详解vue-cli 接口代理配置

    本篇主要介绍了vue-cli 接口代理配置,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-12-12
  • Vue input控件通过value绑定动态属性及修饰符的方法

    Vue input控件通过value绑定动态属性及修饰符的方法

    这篇文章主要介绍了 Vue input控件通过value绑定动态属性及修饰符的方法,需要的朋友可以参考下
    2017-05-05
  • vue深拷贝的3种实现方式小结

    vue深拷贝的3种实现方式小结

    当使用同一个对象产生冲突时,可以使用lodash包,对该对象进行深拷贝,从而使操作的对象为不同的对象,这篇文章主要给大家介绍了关于vue深拷贝的3种实现方式,需要的朋友可以参考下
    2023-02-02
  • Vue下拉框回显并默认选中随机问题

    Vue下拉框回显并默认选中随机问题

    这篇文章主要介绍了Vue下拉框回显并默认选中随机问题,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-09-09
  • Vue 2.0在IE11中打开项目页面空白的问题解决

    Vue 2.0在IE11中打开项目页面空白的问题解决

    这篇文章主要给大家介绍了关于Vue 2.0在ie 11中打开项目页面空白问题的解决方法,文中详细分析出现该问题的原因,并给出了详细的解决方法,需要的朋友可以参考借鉴,下面跟着小编来一起学习学习吧。
    2017-07-07
  • Mac下安装vue

    Mac下安装vue

    本文给大家详细介绍了Mac下安装vue的方法,本文图文并茂给大家介绍的非常详细,需要的朋友可以参考下
    2018-04-04
  • vue中如何使用embed标签PDF预览

    vue中如何使用embed标签PDF预览

    这篇文章主要介绍了vue中如何使用embed标签PDF预览,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-05-05
  • Vue+node实现音频录制播放功能

    Vue+node实现音频录制播放功能

    这篇文章主要介绍了Vue+node实现音频录制播放,功能,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-03-03
  • vue3+vite使用vite-plugin-svg-icons插件显示本地svg图标的方法

    vue3+vite使用vite-plugin-svg-icons插件显示本地svg图标的方法

    这篇文章主要介绍了vue3+vite使用vite-plugin-svg-icons插件显示本地svg图标的方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-12-12
  • 详解滑动穿透(锁body)终极探索

    详解滑动穿透(锁body)终极探索

    这篇文章主要介绍了滑动穿透(锁body),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-04-04

最新评论