深入vue3 之 provide / inject

45 篇文章 6 订阅
  • 前言:本文章写的是composition api,options api的查看底部链接

  • 应用API的 provide
    • 作用范围:实例内的所有组件
  • 组件上下级关系的 provide
    • 父级组件声明的 provide,所有子孙组件皆可拿到;
      • 声明 provide 的组件该同级和父级无法 inject 获取到
  • 关联链上 provide 声明的同名内容
    • 采取就近原则,最近一级父级有就引用最近一级的,没有就接着往上找,直到根实例的 provide 声明 

父组件:

<script lang='ts' setup>
import { provide,ref,rective } from 'vue'
let year = ref(2020)
let book = rective({title:'命运石之门'})
provide('year',year)
provide('yearValue',year.value) // 子组件inject('yearValue') ,获取到的是静态的,子组件不会获取到最新数据
provide('book',book)
provide('changeFn',changeFn) // 有时候可能需要在子组件修改响应式的数据,此时provide一个方法给子组件调用
setTimeout(()=>{
  year.value = 2022
},1000*2)
function changeFn (){
  book.title = '弧光计划'
  year.value = 2036
}
</script>

子组件:

<template>
  <div>{{year}}</div>
  <div>{{yearValue}}</div>
  <div>{{book.title}}</div>
  <button @click='changeFn'>命运探知</button>
</template>
<script lang='ts' setup>
import { inject } from 'vue'
// 讲解1
interface Book {
  title: string
}
let year = inject('year')
let yearValue = inject('yearValue') // 如上所述,一直都是不变的数据
let book = inject<Book>('book')
let changeFn:()=>void = inject('changeFn')


// 讲解2
// 即使在子组件可以直接修改,但最好不要这么做,将会影响到provide的父组件以及其他所有inject的子组件。
// 这会导致 溯源 非常麻烦,所以修改方式统一为在父组件provide一个方法,子组件调用进行修改!
// book.title = '不要这么做'


// 讲解3
// 无默认值的injcet :当任意父级没有声明时,则为 undefined
let static = inject('static') // undefined

// 有默认值的injcet :当任意父级没有声明时,则使用默认值
let static2 = inject('static2','????') // ????

// 默认值是函数的injcet :当任意父级没有声明时,则使用函数return的值
let defaultFn = inject('ab12',()=>'雏见泽'+'棉流',true) // 固定为 true
console.log(defaultFn) // '雏见泽棉流'

</script>

 其他更多vue3 选项式api、组合式api、全局/应用api学习经验分享

vue3 学习资料vue3学习资料记录,经验交流、分享https://oumae-kumiko.github.io/vue3.cn.community/

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值