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 目录存放 常量,与后端的常量目录对应 ...
随机推荐
- @TableField(select=false)
使用这个注解排除删除标识字段.
- nginx geoip_module 地域信息读取
1.安装geoip yum -y install nginx-module-geoip 2.安装完成后在cd /etc/nginx/modules/ 能看到安装的模块 # cd /etc/nginx/ ...
- LeetCode 153. Find Minimum in Rotated Sorted Array寻找旋转排序数组中的最小值 (C++)
题目: Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand. ( ...
- 【51Nod1555】布丁怪
[51Nod1555]布丁怪 题面 51Nod 题目大意: 给你一个\(n\times n\)的棋盘以及\(n\)个棋子,每个棋子坐标为\((x_i,y_i)\),保证棋盘的每一行或一列都有且仅有一个 ...
- A1070 Mooncake (25 分)
一.参考代码 #include<cstdio> #include<algorithm> #include<iostream> using namespace std ...
- Mac上Hive安装配置
Mac上Hive安装配置 1.安装 下载hive,地址:http://mirror.bit.edu.cn/apache/hive/ 之前我配置了集群,tjt01.tjt02.tjt03,这里hive安 ...
- python运维开发常用模块(四)文件对比模块difflib
1.difflib介绍 difflib作为 Python的标准库模块,无需安装,作用是对比文本之间的差异,且支持 输出可读性比较强的HTML文档,与Linux下的diff命令相似.我们可以 使用dif ...
- 查看window重启日志
命令行输入 net statistics WORKSTATION 显示开机时间 如果你今天一直没有关机,但是你看到这个信息显示今天XX点才开始统计数据的说明电脑重启了
- (三)golang--执行流程分析
XXX.go--go build XXX.go--XXX.exe XXX.go--go run XXX.go 两种方式的区别:(1)如果我们先编译生成了可执行文件,那么我们可以将该可执行文件拷贝到没g ...
- sublime text3安装ConvertToUTF8
1.安装 Package Control 方式1:命令行安装 按ctrl+~快捷键,调出一个小文本款,然后粘贴以下代码: import urllib.request,os,hashlib; h = ' ...