Vue 综合- provide() 子或孙子组件如何调用Vue对象

简介: Vue 综合- provide() 子或孙子组件如何调用Vue对象

provide() 基础使用

``` import Vue from 'vue' import App from './App.vue' import router from './router' import store from './store'


Vue.config.productionTip = false


// 孙子组件 const ChildComponent = { template: '


child - component {{value}}

', inject: ['yeye', 'value'], mounted () { console.log(this.$parent.$options.name); // comp console.log(this.yeye); // Vue 对象 console.log(this.value); // 123

} }


// 子组件 const compoent = { name: 'comp', components: { ChildComponent }, template: <div :style="style"> <slot value="456" :text="text"></slot> <child-component></child-component> </div> , data () { return { style: { width: '200px', height: '200px', border: '1px solid #aaa' }, text: 'dzm' } }, mounted () { console.log(this.$parent.$options.name); // Vue 对象


} }


// 父组件 new Vue({ el: '#app', components: { compOne: compoent }, provide () { return { yeye: this, value: this.value } }, data () { return { value: '123' } }, mounted () { console.log(this.$refs.comp, this.$refs.span);


}, template: <div> <comp-one ref="comp"> <span slot-scope="props" ref="span">{{props.value}} {{props.text}} {{value}}</span> </comp-one> <input type="text" v-model="value"> </div> }) ```


但是上面这种方式在使用里面 input 标签输入内容的时候会发现,子组件里面使用到的 value 值会跟着变化, 但是孙子组件里面的 value 是不会发生变化的,因为 provide() 不会去监听这个值的改变,那么就需要用到下面的这种方式:


``` import Vue from 'vue' import App from './App.vue' import router from './router' import store from './store'


Vue.config.productionTip = false


// 孙子组件 const ChildComponent = { template: '


child - component {{data.value}}

', inject: ['yeye', 'data'], mounted () { console.log(this.$parent.$options.name); // comp console.log(this.yeye); // Vue 对象 console.log(this.data.value); // 123

} }


// 子组件 const compoent = { name: 'comp', components: { ChildComponent }, template: <div :style="style"> <slot value="456" :text="text"></slot> <child-component></child-component> </div> , data () { return { style: { width: '200px', height: '200px', border: '1px solid #aaa' }, text: 'dzm' } }, mounted () { console.log(this.$parent.$options.name); // Vue 对象


} }


// 父组件 new Vue({ el: '#app', components: { compOne: compoent }, provide () { const data = {} Object.defineProperty(data, 'value', { get: () => this.value, // 每次调用 value 的时候就会每次调用这个 get 方法, get方法就会每次取读取最新的值 enumerable: true // 设置可以被读取 }) return { yeye: this, data } }, data () { return { value: '123' } }, mounted () { console.log(this.$refs.comp, this.$refs.span);


}, template: <div> <comp-one ref="comp"> <span slot-scope="props" ref="span">{{props.value}} {{props.text}} {{value}}</span> </comp-one> <input type="text" v-model="value"> </div> }) ```


相关文章
|
6天前
|
JavaScript 前端开发
如何在 Vue 项目中配置 Tree Shaking?
通过以上针对 Webpack 或 Rollup 的配置方法,就可以在 Vue 项目中有效地启用 Tree Shaking,从而优化项目的打包体积,提高项目的性能和加载速度。在实际配置过程中,需要根据项目的具体情况和需求,对配置进行适当的调整和优化。
|
6天前
|
存储 缓存 JavaScript
如何在大型 Vue 应用中有效地管理计算属性和侦听器
在大型 Vue 应用中,合理管理计算属性和侦听器是优化性能和维护性的关键。本文介绍了如何通过模块化、状态管理和避免冗余计算等方法,有效提升应用的响应性和可维护性。
|
6天前
|
JavaScript 前端开发 UED
vue学习第二章
欢迎来到我的博客!我是一名自学了2年半前端的大一学生,熟悉JavaScript与Vue,目前正在向全栈方向发展。如果你从我的博客中有所收获,欢迎关注我,我将持续更新更多优质文章。你的支持是我最大的动力!🎉🎉🎉
|
6天前
|
JavaScript 前端开发 开发者
vue学习第一章
欢迎来到我的博客!我是瑞雨溪,一名热爱JavaScript和Vue的大一学生。自学前端2年半,熟悉JavaScript与Vue,正向全栈方向发展。博客内容涵盖Vue基础、列表展示及计数器案例等,希望能对你有所帮助。关注我,持续更新中!🎉🎉🎉
|
JavaScript
Vue的非父子组件之间传值
全局事件总线 一种组件间通信的方式,适用于任意组件间通信
|
缓存 JavaScript 前端开发
Vue Props、Slot、v-once、非父子组件间的传值....
Vue Props、Slot、v-once、非父子组件间的传值....
84 0
|
JavaScript
Vue中父子组件传值
先在⽗组件中给⼦组件的⾃定义属性绑定⼀个⽗组件的变量
|
JavaScript
vue 组件传值
vue 组件传值
82 0
|
JavaScript
vue父子组件传值
vue父子组件传值
|
JavaScript
vue兄弟组件传值 方便快捷
vue兄弟组件传值 方便快捷