Vue.js最佳实践--给大量子孙组件传值(provide/inject)

探讨在Vue.js中如何高效控制大量子孙组件的状态,包括使用props、Vuex及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

欢迎大神指导有没有其他最佳实践

转载于:https://www.cnblogs.com/Amar/p/9106465.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值