vue element table 标题嵌套checkbox 全选不更新视图问题

 需要给el-table-column 添加key属性

具体代码:

<template>
  <div class="public-main">
    <div class="public-main-head">
      <el-button
        size="small"
        icon="el-icon-back"
        @click="onBack"
        plain
      >返回</el-button>
    </div>
    <div class="public-main-content">
      <div class="public-main-content-title">企业生产状态报备申请单</div>
      <el-form
        :model="formData"
        :rules="rules"
        key="ruleForm"
        ref="ruleForm"
        label-width="130px"
      >
        <el-row>
          <moft-fieldcard
            title="申请信息"
            style="margin-bottom:10px"
          >
            <el-row :gutter="20">
              <el-col :span="12">
                <el-form-item
                  label="申请人"
                  prop="applicant"
                >
                  <el-input
                    v-model="formData.applicant"
                    placeholder="请输入申请人"
                    clearable
                  >
                  </el-input>
                </el-form-item>
              </el-col>
              <el-col :span="12">
                <el-form-item
                  label="联系电话"
                  prop="phone"
                >
                  <el-input
                    v-model="formData.phone"
                    placeholder="请输入联系电话"
                    clearable
                  >
                  </el-input>
                </el-form-item>
              </el-col>
            </el-row>
          </moft-fieldcard>
          <moft-fieldcard
            title="企业生产状态"
            style="margin-bottom:10px"
          >
            <el-row :gutter="20">
              <el-col :span="12">
                <el-form-item
                  label="报备状态"
                  prop="reportStatus"
                >

                  <el-select
                    v-model="formData.reportStatus"
                    placeholder="请选择"
                    clearable
                    style="width:100%"
                  >
                    <el-option
                      v-for="item in reportStatuss"
                      :key="item.code"
                      :label="item.name"
                      :value="item.code"
                    >
                    </el-option>
                  </el-select>
                </el-form-item>
              </el-col>
            </el-row>
          </moft-fieldcard>
          <moft-fieldcard
            title="危险源生产状态"
            style="margin-bottom:10px"
          >

            <el-table
              key="tableData"
              :data="formData.dangerousDatas"
              style="width: 100%"
            >
              <el-table-column
                prop="hazardName"
                label="危险源名称"
                align="center"
              >
              </el-table-column>
              <el-table-column
                prop="deviceName"
                label="设备名称"
                align="center"
              >
              </el-table-column>

              <el-table-column
                align="center"
                :key="checkOverhaulAll"
              >
                <template slot="header">
                  {{"检修报备"}}<el-checkbox
                    size="mini"
                    v-model="checkOverhaulAll"
                    @change="handlecheckOverhaulAllChange"
                  ></el-checkbox>
                </template>
                <template slot-scope="scope">
                  <el-checkbox
                    size="mini"
                    v-model="scope.row.overhaul"
                    @change="handleOverhaulChecked"
                  ></el-checkbox>
                </template>
              </el-table-column>

            </el-table>
          </moft-fieldcard>
        </el-row>
      </el-form>
    </div>
  </div>
</template>

<script>
export default {
  props: {},
  components: {},

  data () {
    return {
      multipleSelection: [],
      formData: {
        dangerousDatas: [
          {
            hazardName: '危险源1',
            deviceName: '罐1',
            overhaul: null
          }
        ]
      },
      rules: {

      },
      checkOverhaulLen: 0,
      checkOverhaulAll: false
    }
  },
  computed: {},
  methods: {
    // 全选
    handlecheckOverhaulAllChange (val) {
      console.log(val)
      const newData = this.formData.dangerousDatas.map(item => {
        return {
          ...item,
          overhaul: val
        }
      })
      this.formData.dangerousDatas = newData
      if (val) {
        this.checkOverhaulAll = true
        this.checkOverhaulLen = newData.length
      } else {
        this.checkOverhaulAll = false
        this.checkOverhaulLen = 0
      }
    },
    handleOverhaulChecked (val) {
      this.checkOverhaulLen = val ? this.checkOverhaulLen + 1 : this.checkOverhaulLen - 1
      this.checkOverhaulAll = this.checkOverhaulLen === this.tableData.length
    },
    onBack () {
      this.$emit('evtBack')
    },
    submitForm (formName) {
      this.$refs[formName].validate((valid) => {
        if (valid) {
          const params = {
            isActive: this.isActive
          }
          this.$emit('next', params)
        } else {
          console.log('error submit!!')
          return false
        }
      })
    }
  }
}

</script>
<style lang="scss" scoped>
.public-main {
  flex: 1;
  overflow: hidden;
  &-head {
    padding: 10px;
    border-bottom: 1px solid #cdcdcd;
  }
  &-content {
    width: 1200px;
    flex: 1;
    border: 1px solid #f00;
    margin: auto;
    overflow-y: auto;
    @extend %scroller-bar;
    &-title {
      color: #666;
      font-size: 18px;
      font-weight: 700;
      text-align: center;
      padding: 30px 0;
    }
  }
}
</style>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于 Vue3 嵌套表格中的全选和反选功能,你可以按照以下步骤实现: 1. 在父表格组件中定义一个选中项的数组,例如:`selectedRows: []`。 2. 在父表格中的每一行中添加一个复选框,并绑定一个 `v-model` 指令到该行对应数据的选中状态,例如:`<input type="checkbox" v-model="rowData.selected">`。 3. 在表头中添加一个全选复选框,并绑定一个 `v-model` 指令到一个 Boolean 类型的变量,例如:`<input type="checkbox" v-model="allSelected">`。 4. 在全选复选框的 `change` 事件中,将所有数据的选中状态设为全选复选框的选中状态,并通过 `$emit` 方法向子组件发送消息,例如: ``` selectAll() { this.selectedRows = this.tableData.map(row => { row.selected = this.allSelected; return row; }); this.$emit('select-all', this.allSelected); } ``` 5. 在选中项数组的 `watch` 中,计算已选中的项数,并更新全选复选框的选中状态,例如: ``` watch: { selectedRows() { const selectedCount = this.selectedRows.filter(row => row.selected).length; this.allSelected = selectedCount === this.tableData.length; } } ``` 6. 在子表格组件中定义一个选中项的数组,并通过 `props` 接收父组件传递的选中状态和选中项数组,例如: ``` props: { allSelected: Boolean, selectedRows: Array }, data() { return { innerSelectedRows: [] }; } ``` 7. 在子表格中的每一行中添加一个复选框,并绑定一个 `v-model` 指令到该行对应数据的选中状态,例如:`<input type="checkbox" v-model="rowData.selected">`。 8. 在表头中添加一个全选复选框,并绑定一个 `v-model` 指令到一个 Boolean 类型的变量,例如:`<input type="checkbox" v-model="allSelected">`。 9. 在父组件向子组件发送消息的事件中,将子组件的选中项数组设为父组件的选中项数组,并根据父组件的全选状态更新子组件的全选状态,例如: ``` onSelectAll(allSelected) { this.innerSelectedRows = this.tableData.map(row => { row.selected = allSelected; return row; }); this.allSelected = allSelected; } ``` 10. 在子组件选中项数组的 `watch` 中,计算已选中的项数,并更新父组件的选中项数组和全选状态,例如: ``` watch: { innerSelectedRows() { const selectedCount = this.innerSelectedRows.filter(row => row.selected).length; this.selectedRows.splice(this.$attrs.index, 1, ...this.innerSelectedRows); this.$emit('select-all', selectedCount === this.innerSelectedRows.length); } } ``` 以上就是实现 Vue3 嵌套表格中全选和反选功能的基本步骤。需要注意的是,在子组件中,需要通过 `$attrs` 获取到父组件传递的索引值,以便更新父组件的选中项数组。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值