el-table的select回显问题

javascript 复制代码
<template>
  <Dialog v-model="dialogVisible" title="井权限" width="800">
    <el-form ref="formRef" v-loading="formLoading" :model="formData" label-width="auto">
      <el-form-item :label="t('searchbar.roleNameLabel')">
        <el-tag>{{ formData.name }}</el-tag>
      </el-form-item>
      <el-form-item :label="t('searchbar.roleCodeLabel')">
        <el-tag>{{ formData.code }}</el-tag>
      </el-form-item>
      <el-form-item :label="t('action.permissionScope')">
        <el-select v-model="formData.dataScope">
          <el-option value="" />
          <el-input
            v-model="queryParams.wellName"
            placeholder="搜索井名"
            clearable
            style="margin-left: 10px; width: 200px"
          />
          <el-button @click="handleQuery">
            <Icon class="mr-5px" icon="ep:search" />
            {{ t('action.search') }}
          </el-button>
          <el-table
            :data="wellList"
            style="width: 100%"
            @selection-change="handleSelectionChange"
            @row-click="handleRowClick"
            ref="wellTable"
            :row-key="getRowKeys"
            :reserve-selection="true"
          >
            <el-table-column type="selection" width="55" :reserve-selection="true" />
            <el-table-column prop="wellName" label="井名" width="150" />
            <el-table-column prop="builder" label="建设方" width="200" />
            <el-table-column prop="servePlace" label="服务地区" width="200" />
            <el-table-column prop="oilProduction" label="采油厂" />
          </el-table>
        </el-select>
      </el-form-item>
    </el-form>
    <template #footer>
      <el-button :disabled="formLoading" type="primary" @click="submitForm">
        {{ t('action.confirm') }}
      </el-button>
      <el-button @click="dialogVisible = false">{{ t('action.cancel') }}</el-button>
    </template>
  </Dialog>
</template>

<script lang="ts" setup>
import { ref, reactive, nextTick } from 'vue';
import { useI18n } from 'vue-i18n';
import * as RoleApi from '@/api/system/role';
import * as PermissionApi from '@/api/system/permission';
import { SiteApi } from '@/api/base/site';
import { SystemDataScopeEnum } from '@/utils/constants';

defineOptions({ name: 'SystemRoleDataPermissionForm' });

const { t } = useI18n();
const message = useMessage();

const dialogVisible = ref(false);
const formLoading = ref(false);
const formData = reactive({
  id: 0,
  name: '',
  code: '',
  dataScope: '',
  dataScopeDeptIds: [],
  selection: undefined,
});

const queryParams = reactive({
  reportIndex: 1,
  pageNo: 1,
  pageSize: 10,
  wellName: '',
});

const formRef = ref();
const wellList = ref([]);
const wellTable = ref(null);
const selectedRows = ref<any[]>([]);

/** 打开弹窗 */
const open = async (row: RoleApi.RoleVO) => {
  dialogVisible.value = true;
  resetForm();

  formData.id = row.id;
  formData.name = row.name;
  formData.code = row.code;
  formData.dataScope = '';

  const wellCodes = await PermissionApi.getRoleWellList(row.id);
  wellList.value = await SiteApi.getSiteList(queryParams.wellName);

  // 根据 wellCodes 筛选选中行
  selectedRows.value = wellList.value.filter((well) => wellCodes.includes(well.wellCode));

  // 设置 formData.dataScope 为选中行的 wellName,用逗号分隔
  formData.dataScope = selectedRows.value.map((row) => row.wellName).join(',');

  // 使用 nextTick 确保表格渲染完成后再设置选中状态
  await nextTick();
  selectedRows.value.forEach((row) => {
    wellTable.value.toggleRowSelection(row, true);
  });
};

defineExpose({ open });

/** 提交表单 */
const emit = defineEmits(['success']);

/** 搜索按钮操作 */
const handleQuery = async () => {
  wellList.value = await SiteApi.getSiteList(queryParams.wellName);
};

/** 确定按钮操作 */
const submitForm = async () => {
  formLoading.value = true;
  try {
    const data = {
      roleId: formData.id,
      dataScope: 1,
      selection: formData.selection,
      dataScopeDeptIds:
        formData.dataScope !== SystemDataScopeEnum.DEPT_CUSTOM ? [] : treeRef.value.getCheckedKeys(false),
    };
    await PermissionApi.assignRoleWellScope(data);
    message.success(t('common.updateSuccess'));
    dialogVisible.value = false;
    emit('success');
  } finally {
    formLoading.value = false;
  }
};

/** 选中操作 */
const handleSelectionChange = (selection) => {
  formData.selection = selection;
  formData.dataScope = selection.map((i) => i.wellName).join(',');
  selectedRows.value = selection;
};

/** 行点击事件 */
const handleRowClick = (row) => {
  const index = selectedRows.value.findIndex((item) => item.wellCode === row.wellCode);
  if (index === -1) {
    selectedRows.value.push(row);
  } else {
    selectedRows.value.splice(index, 1);
  }
};

/** 获取唯一键 */
const getRowKeys = (row) => {
  return row.wellCode;
};

/** 重置表单 */
const resetForm = () => {
  formData.id = 0;
  formData.name = '';
  formData.code = '';
  formData.dataScope = '';
  formData.dataScopeDeptIds = [];
  formRef.value?.resetFields();
};
</script>

getRowKeys为关键

相关推荐
qq_17776737几秒前
React Native鸿蒙跨平台数据使用监控应用技术,通过setInterval每5秒更新一次数据使用情况和套餐使用情况,模拟了真实应用中的数据监控场景
开发语言·前端·javascript·react native·react.js·ecmascript·harmonyos
烬头88213 分钟前
React Native鸿蒙跨平台应用实现了onCategoryPress等核心函数,用于处理用户交互和状态更新,通过计算已支出和剩余预算
前端·javascript·react native·react.js·ecmascript·交互·harmonyos
程序员清洒2 小时前
Flutter for OpenHarmony:Text — 文本显示与样式控制
开发语言·javascript·flutter
雨季6662 小时前
Flutter 三端应用实战:OpenHarmony 简易“动态内边距调节器”交互模式深度解析
javascript·flutter·ui·交互·dart
会飞的战斗鸡3 小时前
JS中的链表(含leetcode例题)
javascript·leetcode·链表
方也_arkling3 小时前
别名路径联想提示。@/统一文件路径的配置
前端·javascript
qq_177767373 小时前
React Native鸿蒙跨平台剧集管理应用实现,包含主应用组件、剧集列表、分类筛选、搜索排序等功能模块
javascript·react native·react.js·交互·harmonyos
qq_177767374 小时前
React Native鸿蒙跨平台自定义复选框组件,通过样式数组实现选中/未选中状态的样式切换,使用链式调用替代样式数组,实现状态驱动的样式变化
javascript·react native·react.js·架构·ecmascript·harmonyos·媒体
web打印社区4 小时前
web-print-pdf:突破浏览器限制,实现专业级Web静默打印
前端·javascript·vue.js·electron·html
烬头88214 小时前
React Native鸿蒙跨平台采用了函数式组件的形式,通过 props 接收分类数据,使用 TouchableOpacity实现了点击交互效果
javascript·react native·react.js·ecmascript·交互·harmonyos