VUE+TS使用elementUI的el-checkbox双重v-for循环做勾选

html部分

<template>
  <div class="hello">
    <el-form :model="elForm">
<!-- cities对象数组形式 -->
      <el-form-item v-for="(item, topIndex) in cities" :key="topIndex">
<!--item.checked 是每一个item的勾选状态,字段里可以没有  -->
        <el-checkbox class="textCheck" :indeterminate="item.indeterminate" v-model="item.checked" @change="onChangeTop(topIndex, item.tagParamId, $event, item)">{
  { item.tagParamName }}</el-checkbox>
<!-- dialogCheckedCities是空对象,保存勾选的每一个子选项的数据集合 -->
        <el-checkbox-group v-model="dialogCheckedCities">
<!-- city.needAlarm子选项的needAlarm字段,true/false -->
          <el-checkbox v-for="city in item.tagKnowledgeRule" v-model="city.needAlarm" :key="city.tagKnowledgeId" :label="city" @change="onChangeSon(topIndex, city.tagKnowledgeId, item.tagParamId, $event, item, city)">{
  { city.tagKnowledgeName }}</el-checkbox>
        </el-checkbox-group>
      </el-form-item>
    </el-form>
    <el-button @click="getArr">点击</el-button>
  </div>
</template>

data数据部分

 data() {
    return {
      cities: [
        {
          tagParamId: '1759763720885637120',
          tagParamName: '报警1',
          tagKnowledgeRule: [
            {
              tagKnowledgeId: 'fu1zi1',
              tagKnowledgeName: '统计报表',
              needAlarm: true
            },
            {
              tagKnowledgeId: 'fu1zi2',
              tagKnowledgeName: '统计',
              needAlarm: true
            },
            {
              tagKnowledgeId: 'fu1zi3',
              tagKnowledgeName: '报表',
              needAlarm: true
            }
          ]
        },
        {
          tagParamId: '报警2',
          tagParamName: '文字档案2',
          tagKnowledgeRule: [
            {
              tagKnowledgeId: 'fu2zi1',
              tagKnowledgeName: '好好学习',
              needAlarm: false
            },
            {
              tagKnowledgeId: 'fu2zi2',
              tagKnowledgeName: '学习',
              needAlarm: true
            }
          ]
        },
        {
          tagParamId: '报警3',
          tagParamName: '文字档案3',
          tagKnowledgeRule: [
            {
              tagKnowledgeId: 'fu3zi1',
              tagKnowledgeName: '上班',
              needAlarm: false
            },
            {
              tagKnowledgeId: 'fu3zi2',
              tagKnowledgeName: '一直上班',
              needAlarm: false
            }
          ]
        }
      ],
      dialogCheckedCities: [],
      elForm: {}
    }
  },

JS脚本部分/重要

<template>
  <div class="hello">
    <el-form :model="elForm">
      <el-form-item v-for="(item, topIndex) in cities" :key="topIndex">
        <el-checkbox class="textCheck" :indeterminate="item.indeterminate" v-model="item.checked" @change="onChangeTop(topIndex, item.tagParamId, $event, item)">{
  { item.tagParamName }}</el-checkbox>
        <el-checkbox-group v-model="dialogCheckedCities">
          <el-checkbox v-for="city in item.tagKnowledgeRule" v-model="city.needAlarm" :key="city.tagKnowledgeId" :label="city" @change="onChangeSon(topIndex, city.tagKnowledgeId, item.tagParamId, $event, item, city)">{
  { city.tagKnowledgeName }}</el-checkbox>
        </el-checkbox-group>
      </el-form-item>
    </el-form>
    <el-button @click="getArr">点击</el-button>
  </div>
</template>

<script>
export default {
  name: 'HelloWorld',
  props: {
    msg: String
  },
  mounted() {
    this.cities.forEach(item => {
      // 回显为true的数据
      item.tagKnowledgeRule.forEach(items => {
        if (items.needAlarm) {
          this.dialogCheckedCities.push(items)
        }
      })
      //回显全选
      item.checked = item.tagKnowledgeRule.every(ele => {
        return ele.needAlarm === true
      })
    })
  },
  data() {
    return {
      cities: [
        {
          tagParamId: '1759763720885637120',
          tagParamName: '报警1',
          tagKnowledgeRule: [
            {
              tagKnowledgeId: 'fu1zi1',
              tagKnowledgeName: '统计报表',
              needAlarm: true
            },
            {
              tagKnowledgeId: 'fu1zi2',
              tagKnowledgeName: '统计',
              needAlarm: true
            },
            {
              tagKnowledgeId: 'fu1zi3',
              tagKnowledgeName: '报表',
              needAlarm: true
            }
          ]
        },
        {
          tagParamId: '报警2',
          tagParamName: '文字档案2',
          tagKnowledgeRule: [
            {
              tagKnowledgeId: 'fu2zi1',
              tagKnowledgeName: '好好学习',
              needAlarm: false
            },
            {
              tagKnowledgeId: 'fu2zi2',
              tagKnowledgeName: '学习',
              needAlarm: true
            }
          ]
        },
        {
          tagParamId: '报警3',
          tagParamName: '文字档案3',
          tagKnowledgeRule: [
            {
              tagKnowledgeId: 'fu3zi1',
              tagKnowledgeName: '上班',
              needAlarm: false
            },
            {
              tagKnowledgeId: 'fu3zi2',
              tagKnowledgeName: '一直上班',
              needAlarm: false
            }
          ]
        }
      ],
      dialogCheckedCities: [],
      elForm: {}
    }
  },
  methods: {



    //点击的''全部''(全选)
    onChangeTop(index, tagParamId, e, item) {
      //点击的谁的下标,对应的id,点击的true/false状态,点击的这个对象所有的数据
      //父级change事件
      this.cities[index].checked = e 
      if (e == false) this.cities[index].indeterminate = false //去掉不确定状态

     //父级勾选后,子级全部勾选或者取消
	//这里注意是选取一级下的二级数据,也是所有子选项的数据集合
      var childrenArray = this.cities[index].tagKnowledgeRule 
	//某一个对象下子选项的数组集合长度
      // var len = childrenArray.length
	//如果某一个勾选的对象的checked状态为true,就是全选状态时
      if (this.cities[index].checked == true) {
        // 点击全选往v-model添加选中的
	//dialogCheckedCities里面把某一个对象下的二级子选项全部放入dialogCheckedCities里,这是点击全部,勾选全部子数据的
	// :label="city"  想控制全选要看你子选项的label绑定的是什么,此处我绑定的是对象,所以说下方要塞入对象
	//dialogCheckedCities是存放的勾选的数据,里面有什么,就勾什么
        for (var i = 0; i < childrenArray.length; i++) this.dialogCheckedCities.push(childrenArray[i])
      } else {
        //取消全选删除重复的id
	//从 this.dialogCheckedCities 中移除那些在 childrenArray 中存在的元素。
	//childrenArray.some() 意思是,如果有一项数据相同,返回true,保存,如果都不相同,返回false,过滤
	// !childrenArray.some() 意思是,如果有一项数据相同,返回false,都不相同,返回true
	//dialogCheckedCities的数据过滤,如果childrenArray里的数据和它的每一项都相同,返回false,表示不保存,直接过滤掉
        this.dialogCheckedCities = this.dialogCheckedCities.filter(item => !childrenArray.some(ele => ele === item))
      }
    },
    onChangeSon(topIndex, sonId, topId, e, item, city) {
      console.log('点击的儿子', topIndex, sonId, topId, e, item, city)
      //子级change事件
      var childrenArray = this.cities[topIndex].tagKnowledgeRule //这里注意是选取一级下的二级数据
      var tickCount = 0,
        unTickCount = 
### 自定义 ElementUI `el-checkbox-group` 多选框样式 为了自定义 `el-checkbox-group` 中的多选框样式,可以通过 CSS 或者 SCSS 来调整默认的设计。这不仅限于颜色和尺寸的变化,还包括间距、边距以及更复杂的视觉效果。 #### 使用内联样式或全局样式表修改 可以直接在项目中的全局样式文件里添加特定的选择器来覆盖原有样式: ```css /* 调整复选框之间的水平间隔 */ .el-checkbox { margin-right: 30px; } /* 移除复选框间的左外边距 */ .el-checkbox + .el-checkbox { margin-left: 0px; } ``` 上述代码片段展示了如何移除复选框之间不必要的左边距并增加右侧的空间[^3]。 #### 利用 scoped 样式作用域 如果希望仅影响当前组件内的 `el-checkbox` 组件而不干扰其他地方使用的相同组件,则可以在 Vue 单文件组件 (SFC) 的 `<style>` 部分使用 `scoped` 属性: ```html <template> <!-- ... --> </template> <script setup lang="ts"> // ... </script> <style scoped> .el-checkbox { background-color: #f8f9fa; /* 设置背景色 */ border-radius: 4px; /* 圆角处理 */ padding: 10px 20px; /* 增加内部填充 */ transition: all 0.3s ease;/* 添加过渡效果 */ &:hover { box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1); /* 悬停时阴影 */ } input[type='checkbox'] { display: none; &:checked ~ span::before { content: '✓'; /* 当勾选时显示对号 */ color: white; /* 对号颜色 */ font-size: 1rem; /* 字体大小 */ text-align: center; line-height: 1em; width: 1em; height: 1em; position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); background-color: blue; /* 已选中状态下的背景色 */ border-radius: 2px; } &:not(:checked) ~ span::before { content: ''; visibility: hidden; } } </style> ``` 这段代码实现了更加个性化的复选框设计,包括但不限于更改未选中状态下无任何标记、已选中状态下呈现蓝色方块带白色对钩的效果,并且增加了鼠标悬停反馈[^1]。 #### 动态绑定类名实现条件渲染 除了静态样式之外,还可以基于某些逻辑动态应用不同的 class 名字到 `el-checkbox` 上面,从而达到根据不同情况展示不同样式的目地。比如根据用户的交互动作或是数据模型的状态变化来进行切换。 ```vue <template> <div> <el-checkbox v-for="(item, index) in items" :key="index" :class="[customClass(item)]" :label="item.value">{{ item.text }}</el-checkbox> </div> </template> <script setup lang="ts"> import { ref } from 'vue'; const items = [ { value: 'option1', text: 'Option One' }, { value: 'option2', text: 'Option Two' }, ]; function customClass(item): string[] { let classes = ['default-style']; if (someCondition(item)) { classes.push('special-case'); } return classes; } function someCondition(): boolean { // Implement condition logic here... return true || false; } </script> <style scoped> .default-style { /* 默认样式 */ } .special-case { /* 特殊情况下附加的样式 */ } </style> ``` 此方法允许开发者灵活控制何时何地应该展现何种形式的 UI 元素,增强了应用程序的表现力和用户体验。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值