Vue checkbox 处理有层级关系的元素

准备实现这样一个功能,如图选中一级步骤,所有的子级步骤都选中,取消选中一级步骤,所有的 子级步骤都取消选中

 其中一级步骤是li元素,二级步骤是li中的ul下的li,代码结果大致如下:

 <ul v-for="(step,index) in operate_steps" :key="index" class="list-group text-ul">
            <li class="ol-list list-group-item" :class="checkd_oper_steps.indexOf(step.id)!=-1?'list-group-item-success':''">
             
              <span class="oper_title">{{step.name}}</span>
                <el-checkbox @change="oper_check(step)" class="oper_check_box" :label="step.id" v-model="checkd_oper_steps">完成请勾选</el-checkbox>
                 <i class="oper_check_icon el-icon-check" style=""></i>
              <ul v-if="step.children">
                   <li v-for="(sub_step,index2) in step.children" :key="index2"  class="ol-list list-group-item" :class="checkd_oper_steps.indexOf(sub_step.id)!=-1?'list-group-item-success':''">
                      <span class="oper_title">{{sub_step.name}}</span>
                      <el-checkbox  @change="oper_check(sub_step)" class="oper_check_box" :label="sub_step.id" v-model="checkd_oper_steps">完成请勾选</el-checkbox>
                  </li>
              </ul>
              </li>
        </ul>

checkbox绑定的变量checkd_oper_steps是在组件中申明的变量

 export default {
       name:"Catelog",
       data(){
           return{
               checkd_oper_steps:[]
           }
       },

checkbox中的:label绑定的值,在选中后自动赋值到checkd_oper_steps(v-model中绑定的变量),若checkd_oper_steps是数组的话,则是自动作为元素加入到checkd_oper_steps中。

 checkbox 的@change="oper_check(step)"绑定的函数oper_check,主要处理的是:若是加入操作,判断加入的元素节点是否有子节点,有的话,子节点也加入;若是取消操作,判断取消的元素节点是否有子节点,有的话,子节点取消。

 oper_check(step){
           let index=this.checkd_oper_steps.indexOf(step.id)

           if(index!=-1&&step.children){
              for(let i=0;i<step.children.length;i++){
                this.checkd_oper_steps.push(step.children[i].id)
              }
           }else{
             if(step.children){
              for(let i=0;i<step.children.length;i++){
                let index=this.checkd_oper_steps.indexOf(step.children[i].id)
                this.checkd_oper_steps.splice(index,1)
              }
           }}

 

注意,若对数组使用for/in,取的是数组的下标

function myFunction() {
    var cars = ["BMW", "Volvo", "Saab", "Ford"];
    var i,j;
	var text="";
    for (i in cars) {
          text =text+";"+ cars[i];

    }
    document.getElementById("demo").innerHTML = text;
}

展示的内容:

;BMW;Volvo;Saab;Ford

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值