【Vue3 分步学】:依赖注入

188 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第2天,点击查看活动详情

什么是依赖注入

依赖注入是 vue3 中引入的新的组件传值方式,通过 provide/inject 实现。

主要就是为了实现 props 的逐级透传,依赖注入传值可以由父组件传值给它的所有后代组件,只要是他后代链上的子组件都可以。

需要注意的是:依赖注入只适用于父子组件,不适用于兄弟组件传值。 依赖注入是单项数据流传值

provide(提供)

要为组件后代提供数据,需要使用到 provide() 函数:

  • provide()函数接收两个参数。第一个参数被称为注入名,可以是一个字符串或是一个 `Symbol。

    • 后代组件会用注入名来查找期望注入的值
    • 一个组件可以多次调用 provide(),使用不同的注入名,注入不同的依赖值。
  • 第二个参数是提供的值,值可以是任意类型,包括响应式的状态

inject(注入)

要注入上层组件提供的数据,需使用 inject() 函数:

实现方法

(1)选项式

父组件提供 provide:

<script>
export default {
  provide: {
    user: '张三'
  }
}
</script>

后代组件注入 inject:

<script>
export default {
  data() {
    return {
      user:'张三'
    }
  },
  provide() {
    return {
      user:this.user // 用函数返回对象。这里的值即可以自定义内容,也可以使用data里的变量值
    }
  }
}
</script>

上面这种方式不是响应式的,如果想在数据更新时同步改变,需要借助于 computed。

<script>
import { computed } from 'vue'

export default {
  data() {
    return {
      user:'张三'name: '法外狂徒'
    }
  },
  provide() {
    return {
      user:computed(() => this.user),
      name: computed(() => this.name) // 多条可以依次写,互相之间不干扰
    }
  }
}
</script>

(2)组合式

父组件:

<script>
import { provide, ref, reactive, readonly } from 'vue' // 需要引入provide

export default {
  setup() {
    const user = ref('张三') // 非引用类型的响应式ref写法
    // const user = ref({name: '张三'}) // 引用类型的响应式ref写法  user.value.name调用
    // const user = reactive({name: '张三'}) // 引用类型的响应式reactive写法, user.name调用
    // const user = '张三' // 非响应式写法
    provide('user', readonly(user)) // readonly是为了防止inject端修改数据影响到provide端
  }
}
</script>

后代组件:

<template>
  <div>{{user}}</div>
</template>
<script>
import { inject } from 'vue'
export default {
  setup() {
    const user = inject('user')
    return { // 注意,在setup中定义的值需要return出去才能在子组件中直接使用
      user
    }
  }
}
</script>

注意:setup 中不能使用 this。因为 setup 的调用是在 data、computed、methods 之前,所以this取不到组件的变量。