开发中有个需求,有个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)的更多相关文章

  1. Vue.js最佳实践

    Vue.js最佳实践 第一招:化繁为简的Watchers 场景还原: created(){ this.fetchPostList() }, watch: { searchInputValue(){ t ...

  2. Vue.js最佳实践(五招让你成为Vue.js大师)

    对大部分人来说,掌握Vue.js基本的几个API后就已经能够正常地开发前端网站.但如果你想更加高效地使用Vue来开发,成为Vue.js大师,那下面我要传授的这五招你一定得认真学习一下了. 第一招:化繁 ...

  3. Vue.js最佳实践(五招助你成为vuejs大师)

    转自https://www.jb51.net/article/139448.htm 本文面向对象是有一定Vue.js编程经验的开发者.如果有人需要Vue.js入门系列的文章可以在评论区告诉我,有空就给 ...

  4. vue3 父组件给子组件传值 provide & inject

    介绍 provide() 和 inject() 可以实现嵌套组件之间的数据传递. 这两个函数只能在 setup() 函数中使用. 父级组件中使用 provide() 函数向下传递数据. 子级组件中使用 ...

  5. Vue.js最佳实践--VueRouter的beforeEnter与beforeRouteLeave冲突解决

    用Vue做应用管理系统,通常会在离开某个页面的时候,需要检测用户是否有修改,询问用户需要不需要保存之类的需求 这时候,在读VueRouter文档:组件内的守卫 的时候,发现beforeRouteLea ...

  6. JavaScript best practices JS最佳实践

    JavaScript best practices JS最佳实践 0 简介 最佳实践起初比较棘手,但最终会让你发现这是非常明智之举. 1.合理命名方法及变量名,简洁且可读 var someItem = ...

  7. require.js 最佳实践【转】

    https://www.cnblogs.com/digdeep/p/4607131.html require.js是一个js库,相关的基础知识,前面转载了两篇博文:Javascript模块化编程(re ...

  8. require.js 最佳实践

    require.js是一个js库,相关的基础知识,前面转载了两篇博文:Javascript模块化编程(require.js), Javascript模块化工具require.js教程,RequireJ ...

  9. Vue 工程化最佳实践

    目录结构 总览   api 目录用于存放 api 请求,文件名与模型名称基本一致,文件名使用小驼峰,方法名称与后端 restful 控制器一致.   enums 目录存放 常量,与后端的常量目录对应 ...

随机推荐

  1. day16_7.18 常用模块

    一.collections collections模块中提供了除了dict,list,str等数据类型之外的其他数据类型:Counter.deque.defaultdict.namedtuple和Or ...

  2. ETA:

    Route-based models - Simple Additive Model- Data-driven Model Path-free models - MURAT Model Chun-Hs ...

  3. LeetCode 21. Merge Two Sorted Lists合并两个有序链表 (C++)

    题目: Merge two sorted linked lists and return it as a new list. The new list should be made by splici ...

  4. Nacos 解读:服务发现客户端

    Nacos是阿里巴巴的微服务开源项目,用于服务发现和配置管理,开源以来我就一直关注,在此准备以几篇文章来窥其全貌,但大段大段贴代码就没必要了,这里用自己的一些理解和总结来帮助大家理解.文章将基于截止目 ...

  5. 使用element-ui的table组件时,渲染为html格式

    背景 今天在做vue的项目时,使用到 element-ui 的 table 组件,使用富文本编辑器进行新增操作后,发现 html格式 并没有被识别 原因 在 element-ui 中,table组件默 ...

  6. 题解 P2668 【斗地主】

    dfs+简易剪枝+简易a* 思路: dfs+简易剪枝+简易a(我也不知道算不算a): dfs参数记录层数 按消耗牌多少的贪心顺序搜索 有几种情况可以不用搜索(但我还是搜索了) 可以用a*估算出来 最后 ...

  7. 认识beanstalkd

    认识beanstalkd 背景  公司业务做某个需求是将数据写入到消息队列中,然后另外一个服务来消费数据,这里的消息队列使用的是beastalkd,之前接触到的消息队列为kafka,因此简单学习记录一 ...

  8. gcc编译的时候报错 error trying to exec 'cc1plus': execvp 解决方法

    sudo apt install --reinstall build-essential -y

  9. java8 HashTable 原理

    HashTable原理 Hashtable是基于陈旧的Dictionary类的,HashMap是Java 1.2引进的Map接口的一个实现.Hashtable中的方法是同步的,而HashMap方法(在 ...

  10. 轻量级搜索工具【Everything】的设置

    下面是我对 轻量级搜索工具[Everything]的设置 Everything 下载地址:http://www.voidtools.com/downloads/ 1. 排除 Windows => ...