ZBLOG

根据您提供的代码,右边已选状态没有正确显示的原因可能在于 targetKeysselectedKeys 的处理不当。<a-transfer> 组件通常会将目标键(即已选项)与其相关联的数据进行渲染,因此要确保这两个值之间的关系是清晰的。

解决方案

  1. 确保数据源包含所有必要的数据:确保 dataSource 中每个项目都有一个唯一的 key 属性,以便组件可以识别它们。

  2. 更新handleChange方法:在右侧选中的元素更改时,我们需要适当地设置 selectedKeystargetKeys.

  3. 修复数据绑定:确保在使用 v-model 时,数据模型是正确连接的。

以下是针对上述问题的一些调整:

<template>
    <div style="margin-top: 40px">
      <a-transfer
        v-model:target-keys="targetKeys"
        :selected-keys="selectedKeys"
        :data-source="dataSource"
        :titles="['待选状态', '已选状态']"
        :render="renderItem"
        @change="handleChange"
        style="width: 100%; height: 300px; overflow-y: auto;"
      />
    </div>
</template>

<script setup>
import { ref, reactive, h, onMounted } from 'vue';
import { message } from 'ant-design-vue';
import { useRoute } from 'vue-router';
import { queryTagList, getCustomerTags } from '@/utils';

const targetKeys = ref([]);
const selectedKeys = ref([]);
const route = useRoute();
const custId = ref('');
const dataSource = ref([]);

const renderItem = (item) => {
  return h('span', { style: { color: item.color } }, item.title);
};

const handleChange = (nextTargetKeys, direction, moveKeys) => {
  console.log('targetKeys:', nextTargetKeys);
  console.log('direction:', direction);
  console.log('moveKeys:', moveKeys);

  if (direction === 'right') {
    if (nextTargetKeys.length > 1) {
      message.warning('只可选择一个标签');
      const lastSelectedKey = moveKeys[moveKeys.length - 1];
      targetKeys.value = [lastSelectedKey];
    } else {
      targetKeys.value = nextTargetKeys;
    }
    
    // 更新 selected keys
    selectedKeys.value = nextTargetKeys; // 此行可能需要添加以保持一致性
  } else if (direction === 'left') {
    targetKeys.value = nextTargetKeys; 
    // 如果移除标签时,也同步更新 selected keys
    selectedKeys.value = nextTargetKeys; // 此行可能需要添加以保持一致性
  }
};

const fetchAvailableTags = () => {
  queryTagList().then((response) => {
    if (response.success) {
      dataSource.value = response.data.map((tag) => ({
        key: tag.id,
        title: tag.tagsDescription,
        color: tag.color || '#000',
      }));
    } else {
      message.error(response.message);
    }
  });
};

const fetchSelectedTags = () => {
  getCustomerTags({ customerId: custId.value }).then((response) => {
    if (response.success) {
      const tagsData = response.data.map((tag) => tag.id);
      
      selectedKeys.value = tagsData;
      targetKeys.value = tagsData; // 确保两者初始时相同
    } else {
      message.error(response.message);
    }
  });
};

onMounted(() => {
  custId.value = route.query.custId;
  
   fetchAvailableTags();
   fetchSelectedTags();
});
</script>

注意事项:

  • 在每次移动标签后,需考虑是否要更新 selected_keys 与目标键(target_keys)保持一致。
  • 检查您的 API 返回的数据格式,以确保它能被你的组件理解并正确渲染。
  • 确保组件 <a-transfer> 已经正常引入并且配置无误。

这样做之后,应能够使右边的 “已选状态” 正确显示。


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://sdn.0voice.com/?id=7466

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?