
Vue中的Provide/Inject 实现响应式数据
发布日期:2021-05-04 18:17:10
浏览次数:27
分类:精选文章
本文共 906 字,大约阅读时间需要 3 分钟。
Vue中,provide和inject机制实现了跨组件的通信。但有一个关键问题:数据并不是直接响应式的(设计上如此).
为什么会这样设计?
这背后的原因在于,希望避免数据的混乱。就像props一样,子组件无法直接修改父组件的数据。这有助于保持数据的一致性和可控性.
代码层面讲
假设父组件代码如下:
data() { return { foo: 'foo', bar: 'bar', baz: { hello: 'world' } }},provide() { return { foo: this.foo, bar: this.bar, };},
当我们以这种方式书写代码时,this.foo
和this.baz
都会被浅拷贝,导致子组件注入的数据失去响应式特性。但由于只是浅拷贝,属性仍然保持响应式状态。
例如:
// 父组件provide() { return { baz: this.baz, };},// 子组件inject: ['baz'];
子组件中的baz.hello
仍然是响应式的.
如何实现整体响应式数据?
如果希望所有数据都保持响应式,可以参考以下方法:
// 父组件provide() { return { reactiveMsg: () => this.msg, };},
子组件:
inject: ['reactiveMsg'],computed: { computedProperty() { return this.reactiveMsg(); },},watch: { computedProperty() { console.log('数据改变了'); },}
这种方式通过返回一个函数来提供响应式数据,整体数据的响应式状态得以保留.
优势
这种方法的好处在于,computedProperty
是一个计算属性,无法直接修改其值。这有助于防止数据混乱.
通过深入理解Vue的设计意图,可以更好地利用这些工具来构建高效且可靠的Vue应用.
发表评论
最新留言
表示我来过!
[***.240.166.169]2025年04月28日 11时01分41秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
lamp 一键安装
2025-04-04
Lamp(Fpm-Php)基本配置
2025-04-04
laradock 安装使用 kafka
2025-04-04
laravel 5.3 给容器传参
2025-04-04
laravel 5.5 -- Eloquent 模型关联
2025-04-04
laravel mix
2025-04-04
Laravel Passport
2025-04-04
laravel 之 Eloquent 模型修改器和序列化
2025-04-04
Laravel 使用 - artisan schedule使用
2025-04-04
Laravel 使用rdkafka
2025-04-04
Laravel 多环境配置
2025-04-04
laravel 学习之第一章
2025-04-04
laravel 学习之第二章
2025-04-04
Laravel 安装上传代码不完整的解决方法
2025-04-04
laravel 安装添加多站点
2025-04-04
Laravel 模型
2025-04-04
Laravel 深入理解路由和URL生成
2025-04-04
laravel 生命周期与框架精髓
2025-04-04
laravel 表单验证
2025-04-04
laravel 调试sql
2025-04-04