meteornk 2022-02-11 19:24 采纳率: 50%
浏览 314
已结题

vue3 + element plus 2.0.1,table组件的数据使用filter函数,同时根据选中数据的length更改按钮的状态,出错

问题遇到的现象和发生背景

vue + element plus 2.0.1 el-table组件,在data中使用filter,并根据是选中talbe中的数据行,更改“删除”按钮的状态。

问题相关代码,请勿粘贴截图
<template>
  <div>
    <div>
      <el-input clearable placeholder="搜索..." prefix-icon="el-icon-search" v-model="serarchText"></el-input>
    </div>
    <el-table border stripe
              :data="roleData.filter((data) => !serarchText || data.name.includes(serarchText))"
              :header-cell-style="{background:'#409EFF',color:'#FFF'}"
              @selection-change="handleRoleChange">
      <!--TODO::data 如果使用roleData.filter,会导致当前table无法选中数据-->
      <el-table-column align="center" type="selection" width="50" />
      <el-table-column align="center" label="ID" prop="id" width="50" />
      <el-table-column align="center" label="角色名称" prop="name" width="150" />
      <el-table-column align="center" label="角色代码" prop="code" width="120" />
    </el-table>
    <div>
      <!--<el-button type="danger" :disabled="buttonDisabled">删除角色</el-button>-->
      <el-button type="danger" :disabled="roleSelectedData.length === 0">删除角色</el-button>
    </div>
  </div>
</template>

<script lang="ts" setup>
import { ref, watch } from 'vue';

// const buttonDisabled = ref(false);
const roleData = ref();
roleData.value = [
  {
    id: 1,
    code: 'ROLE_TEST0_1',
    name: '测试角色3',
    enabled: true
  },
  {
    id: 3,
    code: 'ROLE_TEST0_3',
    name: '系统开发员',
    enabled: true
  }
];

const roleSelectedData = ref();
roleSelectedData.value = [];

const serarchText = ref();

//
const handleRoleChange = (value: any) => {
  roleSelectedData.value = value;
  console.log('handleRoleChange >> roleIds = ', roleSelectedData.value);
};

watch(roleSelectedData, (newValue, oldValue) => {
  // if (newValue.length > 0) {
  //   buttonDisabled.value = true;
  // } else {
  //   buttonDisabled.value = false;
  // }
  // const _temp = JSON.parse(JSON.stringify(newValue));
  // if (_temp.length === 0) {
  //   buttonDisabled.value = true;
  // } else {
  //   buttonDisabled.value = false;
  // }
  console.log('Watch(roleSelectedData) newValue = ', newValue, '   oldValue = ', oldValue);
});

</script>
运行结果及报错内容

此时table的行无法选中,删除按钮的disable状态不变更。
通过watch打印roleSelectedData数据的状态,发现此时点击一下某数据行时,控制台会打印两次watch结果,也就是:

handleRoleChange >> roleIds =  Proxy {0: Proxy}
Watch(roleSelectedData) newValue =  Proxy {0: Proxy}    oldValue =  Proxy {}
handleRoleChange >> roleIds =  Proxy {}
Watch(roleSelectedData) newValue =  Proxy {}    oldValue =  Proxy {0: Proxy}

我的解答思路和尝试过的方法

一头雾水,不知道为啥会这样,还请不吝赐教

我想要达到的结果

点击数据行时,如果此时有选中的行,则删除按钮解除disable状态;如果一行数据都没选中,此时删除按钮disable

  • 写回答

2条回答 默认 最新

  • 原莱_ 2022-02-12 11:04
    关注
    watch去掉,没有用,给tablerow-key,el-table-column加reserve-selection
    const getkey=(row)=>{
        return row.id
    }
    
    <el-table border stripe
                  :data="roleData.filter((data) => !serarchText || data.name.includes(serarchText))"
                  :header-cell-style="{background:'#409EFF',color:'#FFF'}"
                  @selection-change="handleRoleChange"
                  :row-key="getkey">
          <!--TODO::data 如果使用roleData.filter,会导致当前table无法选中数据-->
          <el-table-column align="center" type="selection" :reserve-selection="true" width="50" />
          <el-table-column align="center" label="ID" prop="id" width="50" />
          <el-table-column align="center" label="角色名称" prop="name" width="150" />
          <el-table-column align="center" label="角色代码" prop="code" width="120" />
        </el-table>
    

    img


    对你有用的话,请点击一下【采纳此答案】,谢谢🌹

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 2月21日
  • 已采纳回答 2月13日
  • 创建了问题 2月11日

悬赏问题

  • ¥15 TMC2209串口模式下读取不到寄存器的值串口助手蓝色字体是发过去的消息,绿色字体是收到的消息,第二行发送读取寄存器的指令但是没有读取到寄存器的值串口助手如下图:接线如下图,如何解决?
  • ¥15 高通安卓11提取完整线刷包软件,或者优博讯dt50顺丰刷机包
  • ¥20 C,有个译码器,换了信道就跑不出原来数据
  • ¥15 MIMIC数据库安装问题
  • ¥60 基于JTag协议开发Fpga下载器上位机,哪位大🐂有偿指导?
  • ¥20 全书网Java爬取数据
  • ¥15 怎么获取红包封面的原始链接,并且获取红包封面序列号
  • ¥100 微信小程序跑脚本授权的问题
  • ¥100 房产抖音小程序苹果搜不到安卓可以付费悬赏
  • ¥15 STM32串口接收问题