
Vue中的Provide/Inject 实现响应式数据
发布日期:2021-05-04 18:17:10
浏览次数:26
分类:精选文章
本文共 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应用.
发表评论
最新留言
路过,博主的博客真漂亮。。
[***.116.15.85]2025年04月02日 23时14分45秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
SQL联表的方式(逗号, Left Join, Right Join)
2019-03-06
牛客网输入输出举例
2019-03-06
字符串初始化时的注意点
2019-03-06
dll路径加载顺序
2019-03-06
悬垂指针和野指针的区别
2019-03-06
软考相关试题
2019-03-06
顺序表的操作
2019-03-06
常量表达式
2019-03-06
POD类型
2019-03-06
安装HDF5及在VS下配置HDF5
2019-03-06
const与常量,傻傻分不清楚~
2019-03-06
图解哈希表及其原理
2019-03-06
Head First设计模式——迭代器模式
2019-03-06
Head First设计模式——中介者模式和备忘录模式
2019-03-06
MongoDB版本及存储引擎区别
2019-03-06
shell echo单行和多行文字定向写入到文件中
2019-03-06
解析树状数组
2019-03-06
AtCoder Beginner Contest 100 题解
2019-03-06
【数据结构】可持久化线段树初步
2019-03-06
克拉默法则&矩阵分块:线性代数学习笔记2
2019-03-06