Vue.js最佳实践--给大量子孙组件传值(provide/inject)
开发中有个需求,有个Parent组件(例如div)下,输入框,下拉框,radiobutton等可编辑的子孙组件几百个,根据某个值统一控制Parent下面的所有控件的disabled状态
类似于这样,给大量子孙组件传值的场景,一直在思考在Vue.js下面有没有什么最佳实践?
类似于下面这种结构
<App>
<Parent1>
<Child1>
<Child1Child1>
......
<Child1ChildN>
<Child2>
<Child2Child1>
......
<Child2ChildN>
<Child3>
<Child3Child1>
......
<Child3ChildN>
.......
<ChildN>
<ChildNChild1>
......
<ChildNChildN>
尝试1:安装Vue.js官方教程,父子传值使用props
缺点:在这种场景下,每层都要传递写起来实在是痛苦不堪 放弃
尝试2:采用Vuex的方案,统一一个状态值来控制所有子组件的状态
缺点:如果有Parent1和Parent2,两个组件下面的子组件状态不一样,即Parent1下面disabled,Parent2下面可用,Vuex的状态必须再追加一个,如果多个Parent,Vuex就不够灵活 放弃
尝试3:provide/inject机制 目前看来比较完美的方案
Parent组件provide一个状态
export default {
props: {
disableMode: {
type: Boolean,
default: false,
},
},
data() {
return { // provide默认不算响应式的,为了变更可响应,返回一个可响应对象
componentDisableMode: { disabled: this.disableMode },
}
},
watch: { // provide默认不算响应式的,为了变更可响应,需要监听props传来的状态
disableMode(newValue) {
this.componentDisableMode.disabled = newValue
},
},
provide() { // 提供一个组件禁用状态
return {
componentDisableMode: this.controlDisableMode,
}
},
}
所有的子组件里面inject这个值,根据这个值来控制禁用状态
inject: {
componentDisableMode: { default: { disabled: false} },
},
具体使用代码(Child的禁用状态,由Parent1DiableFlag或ParentXDiableFlag来控制,即Child里面可以得到Parent传来的值)
<Parent1 :disable-mode= "Parent1DisableFlag">
<Child1></Child1>
<ChildX></ChildX>
</Parent1>
<ParentX :disable-mode= "ParentXDisableFlag">
<Child1></Child1>
<ChildX></ChildX>
</ParentX>
PS:在vue.js论坛上也发帖咨询过 https://forum.vuejs.org/t/best-way-to-pass-prop-to-chidrens-children/32633
欢迎大神指导有没有其他最佳实践
Vue.js最佳实践--给大量子孙组件传值(provide/inject)的更多相关文章
- Vue.js最佳实践
Vue.js最佳实践 第一招:化繁为简的Watchers 场景还原: created(){ this.fetchPostList() }, watch: { searchInputValue(){ t ...
- Vue.js最佳实践(五招让你成为Vue.js大师)
对大部分人来说,掌握Vue.js基本的几个API后就已经能够正常地开发前端网站.但如果你想更加高效地使用Vue来开发,成为Vue.js大师,那下面我要传授的这五招你一定得认真学习一下了. 第一招:化繁 ...
- Vue.js最佳实践(五招助你成为vuejs大师)
转自https://www.jb51.net/article/139448.htm 本文面向对象是有一定Vue.js编程经验的开发者.如果有人需要Vue.js入门系列的文章可以在评论区告诉我,有空就给 ...
- vue3 父组件给子组件传值 provide & inject
介绍 provide() 和 inject() 可以实现嵌套组件之间的数据传递. 这两个函数只能在 setup() 函数中使用. 父级组件中使用 provide() 函数向下传递数据. 子级组件中使用 ...
- Vue.js最佳实践--VueRouter的beforeEnter与beforeRouteLeave冲突解决
用Vue做应用管理系统,通常会在离开某个页面的时候,需要检测用户是否有修改,询问用户需要不需要保存之类的需求 这时候,在读VueRouter文档:组件内的守卫 的时候,发现beforeRouteLea ...
- JavaScript best practices JS最佳实践
JavaScript best practices JS最佳实践 0 简介 最佳实践起初比较棘手,但最终会让你发现这是非常明智之举. 1.合理命名方法及变量名,简洁且可读 var someItem = ...
- require.js 最佳实践【转】
https://www.cnblogs.com/digdeep/p/4607131.html require.js是一个js库,相关的基础知识,前面转载了两篇博文:Javascript模块化编程(re ...
- require.js 最佳实践
require.js是一个js库,相关的基础知识,前面转载了两篇博文:Javascript模块化编程(require.js), Javascript模块化工具require.js教程,RequireJ ...
- Vue 工程化最佳实践
目录结构 总览 api 目录用于存放 api 请求,文件名与模型名称基本一致,文件名使用小驼峰,方法名称与后端 restful 控制器一致. enums 目录存放 常量,与后端的常量目录对应 ...
随机推荐
- windows 7系统下查看被占用的端口并解除占用
运行输入cmd,在命令行输入 netstat -ano 查找所占用端口所在的行,如图本例子被占用端口为9999,记住对应的pid 然后输入 tasklist|findstr pid(此处为9528) ...
- 201871020225-牟星源《面向对象程序设计(java)》第十二周学习总结
201871020225-牟星源<面向对象程序设计(java)>第十二周学习总结 项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ ...
- python SSL 错误
python 使用pip 安装模块是提示SSL错误 出现该问题的原因由于系统的openssl是1.0.1的版本,对于python3.7太老了,需要更新为openssl1.0.2或者libressl2. ...
- JAVA并发-Executor
结构 类继承图: 上面的各个接口/类的关系和作用: Executor 执行器接口,也是最顶层的抽象核心接口, 分离了任务和任务的执行. ExecutorService 在Executor的基础上提供了 ...
- USACO Telephone Lines
洛谷 P1948 [USACO08JAN]电话线Telephone Lines https://www.luogu.org/problem/P1948 JDOJ 2556: USACO 2008 Ja ...
- python之路—从入门到放弃
python基础部分 函数 初识函数 函数进阶 装饰器函数 迭代器和生成器 内置函数和匿名函数 递归函数 常用模块 常用模块 模块和包 面向对象 初识面向对象 面向对象进阶 网络编程 网络编程 并发编 ...
- python的可变类型和不可变类型
Python有六种数据类型:数字类型.字符串类型.列表类型.元组类型.字典类型和集合类型 其中不可变类型包括三种:数字类型.字符串类型和元组类型 剩余三种为可变类型:列表类型.字典类型和集合类型 可变 ...
- Emacs奇技淫巧
奇技快捷键 C-t: 交换两个字符的位置 M-t: 交换两个字符的位置 C-x, C-t: 则是交换两行的位置 C-x, h: 全选 M-/: 匹配这个首字母的单词 M-c: 将下一个单词开头大写, ...
- 【转】jsp 页面 按回车键 触发事件
转载: https://blog.csdn.net/ludongshun2016/article/details/59536779. 第一种: <script type="text/J ...
- Linux性能优化实战学习笔记:第八讲
一.环境准备 1.在第6节的基础上安装dstat wget http://mirror.centos.org/centos/7/os/x86_64/Packages/dstat-0.7.2-12.el ...