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的引用类型特性

微信交流