相关文章推荐
讲道义的脸盆  ·  解析或序列化 XML - ...·  1 月前    · 
跑龙套的单杠  ·  分享6个对象数组去重的方法开发者社区·  1 月前    · 
纯真的炒饭  ·  MongoDB数据库中更新与删除数据 - ...·  1 月前    · 
体贴的红金鱼  ·  在 Office 加载项中使用 ...·  1 月前    · 
满身肌肉的八宝粥  ·  【Day31】ChatGPT請教教我:Jes ...·  1 周前    · 
害羞的滑板  ·  学习nest.js的第三天_nestjs ...·  1 月前    · 
风度翩翩的登山鞋  ·  解决 ...·  1 年前    · 
骑白马的毛巾  ·  Vue如何修改滚动条 - 知乎·  2 年前    · 
发财的熊猫  ·  Ombromanie:使用 Azure ...·  2 年前    · 
俊逸的青蛙  ·  getFileInformationByHa ...·  2 年前    · 
Code  ›  javascript - vue3 elementui 表格组件,过滤多选回显问题? -
table const
https://segmentfault.com/q/1010000043779995
刚失恋的鞭炮
2 年前
segmentfault segmentfault
注册登录
问答 博客 标签 活动
发现
✓ 使用“Bing”搜本站 使用“Google”搜本站 使用“百度”搜本站 站内搜索
注册登录
  1. 首页
  2. 问答
  3. javascript
  4. 问答详情

vue3 elementui 表格组件,过滤多选回显问题?

头像
unme2xgx
27 11
发布于
5 月 12 日
四川

各位老师好, 我遇到的问题描述一下:

1 在表格组件上添加搜索
2 过滤表格组件后,选择表格内容保存后之前表格所选的内容丢失
3 清除过滤字符后,表格不能回显过滤之前已经选择的条目,

下面我的组件里面的代码,请老师们指导,感谢感谢:

<template>
    <el-input v-model="searchRole" placeholder="输入角色名搜索" clearable />
    <el-table ref="multipleTableRef" :data="tableData" style="width: 100%" @selection-change="handleSelectionChange">
        <el-table-column type="selection" width="55" />
        <el-table-column prop="roleName" label="名称" />
        <el-table-column prop="sourceName" label="来源" />
    </el-table>
</template>
<script lang="ts" setup>
import { onMounted, ref, watch, computed } from 'vue'
import { ElTable } from 'element-plus'
import { cloneDeep } from 'lodash'
import { fetchRoleList } from '@/apis/account/role'
import { fetchAccountRoles, updateAccountRoles } from '@/apis/account/account'
const props = defineProps({
    accountId: String
const searchRole = ref('')
const tableData = computed(() => {
    if (roleList.value.length) {
        return roleList.value.filter(data => !searchRole.value || data.roleName.toLowerCase().includes(searchRole.value.toLowerCase()))
    return []
const multipleTableRef = ref<InstanceType<typeof ElTable>>()
const multipleSelection = ref([])
const handleSelectionChange = val => {
    multipleSelection.value = val
    console.log("multipleSelection.value",multipleSelection.value)
const remDuplicateObj = arr => {
    let newArr = []
    let obj = {}
    for (let i = 0; i < arr.length; i++) {
        if (!obj[arr[i].id]) {
            newArr.push(arr[i])
            obj[arr[i].id] = true
    return newArr
const roleList = ref([])
async function getRoles() {
    const res = await fetchRoleList(null)
    if (!res) return
    roleList.value = res.content
    getAccountRoles()
const accountRoles = ref([])
async function getAccountRoles() {
    const res = await fetchAccountRoles(props.accountId)
    if (!res) return
    accountRoles.value = cloneDeep(res.content)
    toggleSelection(res.content)
const toggleSelection = rows => {
    if (!rows) return
    // if (!multipleSelection.value) return
    const roleNames = rows.map(val => val.roleName)
    // const roleNames = multipleSelection.value.map(val => val.roleName)
    if (roleNames) {
        roleList.value.forEach(row => {
            if (roleNames.includes(row.roleName)) {
                // TODO: improvement typing when refactor table
                // eslint-disable-next-line @typescript-eslint/ban-ts-comment
                multipleTableRef.value!.toggleRowSelection(row, true)
    } else {
        multipleTableRef.value!.clearSelection()
const submitRoles = async () => {
    return new Promise<void>(async (resolve, reject) => {
        try {
            const data = {
                roles: multipleSelection.value.map(val => val.roleName)
            await updateAccountRoles(props.accountId, data)
            emit('changed', false)
            getAccountRoles()
            resolve()
        } catch (error) {
            reject()
const emit = defineEmits(['changed'])
watch(
    [() => multipleSelection.value],
    () => {
        const newRoles = multipleSelection.value.map(v => v.roleName)
        const oldRoles = accountRoles.value.map(v => v.roleName)
        const hasChanged = JSON.stringify(newRoles) !== JSON.stringify(oldRoles)
        emit('changed', hasChanged)
        deep: true
onMounted(() => {
    getRoles()
defineExpose({
    submitRoles
</script>
vue.js javascript
阅读 683
3 个回答
得票 最新
头像
zangeci
13.9k 5 17 29
发布于
5 月 12 日
福建
✓ 已被采纳

不要用 selection-change 事件,那个在数据变更时会清空,改用 select 事件,然后在变更时在 nextTick 中把上一次选中的 accountRoles 传入 toggleSelection 调用

头像
flexyan
267 1 4
发布于
5 月 12 日
四川

每次获取表格数据后 使用toggleRowSelection初始化已经勾选的

头像
乔治
9.4k 1 1 23
发布于
5 月 12 日
上海
<template>
  <el-input v-model="searchRole" placeholder="输入角色名搜索" clearable />
  <el-table
    ref="multipleTableRef"
    :data="tableData"
    style="width: 100%"
    @selection-change="handleSelectionChange"
    <el-table-column type="selection" width="55" />
    <el-table-column prop="roleName" label="名称" />
    <el-table-column prop="sourceName" label="来源" />
  </el-table>
</template>
<script lang="ts" setup>
import { onMounted, ref, watch, computed } from "vue";
import { ElTable } from "element-plus";
import { cloneDeep } from "lodash";
import { fetchRoleList } from "@/apis/account/role";
import { fetchAccountRoles, updateAccountRoles } from "@/apis/account/account";
const props = defineProps({
  accountId: String,
const searchRole = ref("");
const selectedRows = ref([]);
const tableData = computed(() => {
  if (roleList.value.length) {
    return roleList.value.filter(
      (data) =>
        !searchRole.value ||
        data.roleName
          .toLowerCase()
          .includes(searchRole.value.toLowerCase())
  return [];
const multipleTableRef = ref();
const handleSelectionChange = (val) => {
  selectedRows.value = val;
watch(searchRole, () => {
  const selectedRowKeys = selectedRows.value.map((row) => row.id);
  const rowsToSelect = tableData.value.filter((row) =>
    selectedRowKeys.includes(row.id)
 
推荐文章
讲道义的脸盆  ·  解析或序列化 XML - XML:可扩展标记语言 | MDN
1 月前
跑龙套的单杠  ·  分享6个对象数组去重的方法开发者社区
1 月前
纯真的炒饭  ·  MongoDB数据库中更新与删除数据 - 龙恩0707
1 月前
体贴的红金鱼  ·  在 Office 加载项中使用 Office 对话框 API - Office Add-ins | Microsoft Learn
1 月前
满身肌肉的八宝粥  ·  【Day31】ChatGPT請教教我:Jest 單元測試(下) - 完整語法&教學 - iT 邦幫忙::一起幫忙解決難題,拯救 IT 人的一天
1 周前
害羞的滑板  ·  学习nest.js的第三天_nestjs dto-CSDN博客
1 月前
风度翩翩的登山鞋  ·  解决 datetime数据在DataGridView里不显示秒的问题_51CTO博客_datagridview 日期控件
1 年前
骑白马的毛巾  ·  Vue如何修改滚动条 - 知乎
2 年前
发财的熊猫  ·  Ombromanie:使用 Azure Speech 和 TensorFlow.js Handposes 创建手影故事_javascript_Vue小助理-Vue
2 年前
俊逸的青蛙  ·  getFileInformationByHandleEx 函数 (winbase.h) - Win32 apps | Microsoft Learn
2 年前
今天看啥   ·   Py中国   ·   codingpro   ·   小百科   ·   link之家   ·   卧龙AI搜索
删除内容请联系邮箱 2879853325@qq.com
Code - 代码工具平台
© 2024 ~ 沪ICP备11025650号