Skip to content
☆´∀`☆
On this page

Provide & Inject

应用实例提供

在编写插件时特别有用,作为 globalProperties.

js
import { createApp } from "vue";
const app = createApp(/* ... */);
app.provide("message", "hello");

普通组件中提供

  • 不保持响应性
js
export default {
  data() {
    return {
      message: "hello!",
    };
  },
  provide() {
    // 使用函数的形式,可以访问到 `this`
    return {
      message: this.message,
    };
  },
};
  • 保持响应性
js
import { computed } from "vue";

export default {
  data() {
    return {
      message: "hello!",
    };
  },
  provide() {
    return {
      // 显式提供一个计算属性
      message: computed(() => this.message),
    };
  },
};

组合式中提供

需在 setup 阶段同步调用。(根中执行)

js
<script setup>
  import {(ref, provide)} from 'vue' import {fooSymbol} from './injectionSymbols' // 提供静态值 provide('foo', 'bar') // 提供响应式的值 const count =
  ref(0) provide('count', count) // 提供时将 Symbol 作为 key provide(fooSymbol, count)
</script>

在普通组件中注入

注入会在组件自身的状态之前被解析

js
export default {
  // 当声明注入的默认值时
  // 必须使用对象形式
  inject: {
    message: {
      from: "message", // 当与原注入名同名时,这个属性是可选的
      default: "default value",
    },
    user: {
      // 对于非基础类型数据,如果创建开销比较大,或是需要确保每个组件实例
      // 需要独立数据的,请使用工厂函数
      default: () => ({ name: "John" }),
    },
  },
};

在组合式中注入

js
<script setup>
  import {inject} from 'vue' import {fooSymbol} from './injectionSymbols' // 注入值的默认方式 const foo = inject('foo') // 注入响应式的值 const count
  = inject('count') // 通过 Symbol 类型的 key 注入 const foo2 = inject(fooSymbol) // 注入一个值,若为空则使用提供的默认值 const bar = inject('foo',
  'default value') // 注入一个值,若为空则使用提供的工厂函数 const baz = inject('foo', () => new Map()) //
  注入时为了表明提供的默认值是个函数,需要传入第三个参数 const fn = inject('function', () => {}, false)
</script>

使用 symbol 作为注入名

js
// keys.js
export const myInjectionKey = Symbol()
// 在供给方组件中
import { myInjectionKey } from './keys.js'

export default {
  provide() {
    return {
      [myInjectionKey]: {
        /* 要提供的数据 */
      }
    }
  }
}
// 注入方组件
import { myInjectionKey } from './keys.js'

export default {
  inject: {
    injected: { from: myInjectionKey }
  }
}