笔记: provide/inject 注入透传和Props(摘自官网)

146 阅读1分钟

inject需要在vue3中才支持

Props

Props传递是逐级的,时常会产生太深层的树而导致传递不清晰

Provide/inject

Provide/inject可以解决这个问题, 整个过程有两方: 提供者和注入者 提供者: 声明变量以及注入者需要更改的方法

Provide

Provide接受两个参数:注入名, 注入对象(可以是变量,可以是对象,也可是响应式对象) 响应式对象被注入时不会被解包,以此维系响应

<!--提供者组件-->
<template>
  <children-comp/>
</template>

<script setup>
import {provide, ref} from "vue";
import ChildrenComp from "@/components/childrenComp.vue";

// 注入子组件
const location = ref('North Pole')
const updatedLocation = () => {
  location.value = 'South North'
}
provide('location', {
  location,
  updatedLocation
})
</script>
// 注入者组件
<template>
  <button @click="updatedLocation">
    {{location}}
  </button>
  <grand-child-comp/>
</template>

<script setup>
import {inject} from 'vue'
import GrandChildComp from "@/components/grandChildComp.vue";
const {location, updatedLocation} = inject('location')
</script>

如果不想被注入方更改:readonly

import {readonly} from 'vue';
provide('injectName', readOnly(name))

如果正在构建大型应用:symbol

// keys.js
export const myInjectionKey = Symbol()

// 提供者组件
import {myInjectionKey} from './key.js'

// 注入方组件
import { inject } from 'vue'
import { myInjectionKey } from './keys.js'
const injected = inject(myInjectionKey)