vue3中的provide注入的依赖如何在子组件中更新

52 阅读3分钟

vue3中的provide注入的依赖如何在子组件中更新

在 Vue 3 中,provideinject 是一种依赖注入机制,用于在组件树中共享数据或方法。默认情况下,provide 注入的依赖是非响应式的,但如果提供的是响应式数据(如 refreactive),则可以在子组件中更新这些数据。

以下是详细说明和示例:

  1. provideinject 的基本用法

父组件:提供依赖

<template>
  <div>
    <ChildComponent />
  </div>
</template>

<script setup>
import { provide, ref } from 'vue';
import ChildComponent from './ChildComponent.vue';

const count = ref(0); // 创建一个响应式数据

// 提供依赖
provide('count', count);
</script>

子组件:注入依赖

<template>
  <div>
    <p>Count: {{ count }}</p>
    <button @click="increment">增加</button>
  </div>
</template>

<script setup>
import { inject } from 'vue';

// 注入依赖
const count = inject('count');

function increment() {
  count.value++; // 修改注入的响应式数据
}
</script>
  1. 更新注入的依赖

如果 provide 提供的是响应式数据(如 refreactive),则可以在子组件中直接修改这些数据,父组件和所有注入该依赖的子组件都会同步更新。

<!-- 父组件 -->
<template>
  <div>
    <p>父组件的 Count: {{ count }}</p>
    <ChildComponent />
  </div>
</template>

<script setup>
import { provide, ref } from 'vue';
import ChildComponent from './ChildComponent.vue';

const count = ref(0); // 创建一个响应式数据

// 提供依赖
provide('count', count);
</script>
<!-- 子组件 -->
<template>
  <div>
    <p>子组件的 Count: {{ count }}</p>
    <button @click="increment">增加</button>
  </div>
</template>

<script setup>
import { inject } from 'vue';

// 注入依赖
const count = inject('count');

function increment() {
  count.value++; // 修改注入的响应式数据
}
</script>

在这个示例中:

  • 父组件通过 provide 提供了一个响应式的 count

  • 子组件通过 inject 注入了 count,并可以修改它。

  • 修改 count 后,父组件和所有注入 count 的子组件都会同步更新。

  1. 提供方法供子组件调用

除了提供响应式数据,还可以通过 provide 提供方法,供子组件调用。

<!-- 父组件 -->
<template>
  <div>
    <p>父组件的 Count: {{ count }}</p>
    <ChildComponent />
  </div>
</template>

<script setup>
import { provide, ref } from 'vue';
import ChildComponent from './ChildComponent.vue';

const count = ref(0);

// 提供一个方法供子组件调用
function increment() {
  count.value++;
}

provide('count', count);
provide('increment', increment);
</script>
<!-- 子组件 -->
<template>
  <div>
    <p>子组件的 Count: {{ count }}</p>
    <button @click="increment">增加</button>
  </div>
</template>

<script setup>
import { inject } from 'vue';

// 注入依赖
const count = inject('count');
const increment = inject('increment');
</script>

在这个示例中:

  • 父组件提供了一个 increment 方法。

  • 子组件通过 inject 注入 increment 方法并调用它。

  1. 注意事项

响应式数据

  • 如果希望注入的依赖是响应式的,必须提供 refreactive 数据。

  • 如果提供的是普通对象或值,子组件无法直接更新它。

命名冲突

  • 确保 provideinject 的键名唯一,避免命名冲突。

默认值

  • 可以为 inject 提供一个默认值,当依赖未提供时使用。
const count = inject('count', 0); // 默认值为 0

只读依赖

  • 如果不希望子组件修改注入的依赖,可以提供只读数据。
import { readonly } from 'vue';

provide('count', readonly(count)); // 提供只读数据

总结

  • 在 Vue 3 中,provideinject 用于在组件树中共享数据或方法。

  • 如果提供的是响应式数据(如 refreactive),子组件可以直接修改这些数据,父组件和所有注入该依赖的子组件都会同步更新。

  • 还可以通过 provide 提供方法,供子组件调用。

  • 确保提供的数据是响应式的,并根据需要处理命名冲突、默认值和只读依赖。

更多vue相关插件及后台管理模板可访问vue admin reference,代码详情请访问github