前端技术 · 2020年7月16日 0

vue中provide和inject的用法

2.2.0 新增 描述: provide 和 inject 主要为高阶插件/组件库提供用例。并不推荐直接用于应用程序代码中; 并且这对选项需要一起使用; 以允许一个祖先组件向其所有子孙后代注入一个依赖,不论组件层次有多深,并在起上下游关系成立的时间里始终生效。

//父组件:
provide: { //provide 是一个对象,提供一个属性或方法
  foo: '这是 foo',
  fooMethod:()=>{
    console.log('父组件 fooMethod 被调用')
  }
},

// 子或者孙子组件
inject: ['foo','fooMethod'], //数组或者对象,注入到子组件
mounted() {
  this.fooMethod()
  console.log(this.foo)
}
//在父组件下面所有的子组件都可以利用inject
复制代码

provide 和 inject 绑定并不是可响应的。这是官方刻意为之的。 然而,如果你传入了一个可监听的对象,那么其对象的属性还是可响应的,对象是因为是引用类型

//父组件:
provide: { 
  foo: '这是 foo'
},
mounted(){
  this.foo='这是新的 foo'
}

// 子或者孙子组件
inject: ['foo'], 
mounted() {
  console.log(this.foo) //子组件打印的还是'这是 foo'
}
复制代码

provide和inject响应方法

// 父组件
provide() {
    return {
      staticValue: this.staticValue, // 直接返回值,不可响应
      staticObject: this.staticObject, // 返回一个对象,可响应
      getReactiveValue: () => this.staticValue // 返回一个对象的函数,可响应
    }
  },
  
// 子组件
inject: ["staticValue", "getReactiveValue", "staticObject"],
computed: {
    reactiveValue() {
      return this.getReactiveValue(); // 返回注入的对象函数,通过计算属性来监听值的变化
    },
  },
复制代码

所以provide返回一个对象或者函数是可以响应的, 因为对象和函数是引用类型, 实际上改变也不是vue做的,而是JS的引用类型特性