使用element UI的穿梭框组件时将官方给的代码粘贴后出现最后一个数据不显示的问题

我在使用element UI的穿梭框组件时将官方给的代码粘贴后出现最后一个数据不显示的问题



<template>
  <div>
  <p style="text-align: center; margin: 0 0 20px">使用 render-content 自定义数据项</p>
  <div style="text-align: center">
    <el-transfer
      style="text-align: left; display: inline-block"
      v-model="value"
      filterable
      :left-default-checked="[2, 3]"
      :right-default-checked="[1]"
      :render-content="renderFunc"
      :titles="['Source', 'Target']"
      :button-texts="['到左边', '到右边']"
      :format="{
        noChecked: '${total}',
        hasChecked: '${checked}/${total}'
      }"
      @change="handleChange"
      :data="data2">
      <el-button class="transfer-footer" slot="left-footer" size="small">操作</el-button>
      <el-button class="transfer-footer" slot="right-footer" size="small">操作</el-button>
    </el-transfer>
  </div>
  <p style="text-align: center; margin: 50px 0 20px">使用 scoped-slot 自定义数据项</p>
  <div style="text-align: center">
    <el-transfer
      style="text-align: left; display: inline-block"
      v-model="value4"
      filterable
      :left-default-checked="[2, 3]"
      :right-default-checked="[1]"
      :titles="['Source', 'Target']"
      :button-texts="['到左边', '到右边']"
      :format="{
        noChecked: '${total}',
        hasChecked: '${checked}/${total}'
      }"
      @change="handleChange"
      :data="data">
      <span slot-scope="{ option }">{{ option.key }} - {{ option.label }}</span>
      <el-button class="transfer-footer" slot="left-footer" size="small">操作</el-button>
      <el-button class="transfer-footer" slot="right-footer" size="small">操作</el-button>
    </el-transfer>
  </div>
  </div>
</template>

<style>
  .transfer-footer {
    margin-left: 20px;
    padding: 6px 5px;
  }
</style>

<script>
  export default {
    data() {
      const generateData = _ => {
        const data = [];
        for (let i = 1; i <= 15; i++) {
          data.push({
            key: i,
            label: `备选项 ${ i }`,
            disabled: i % 4 === 0
          });
        }
        return data;
      };
      return {
        data2: generateData(),
        value: [1],
        value4: [1],
        renderFunc(h, option) {
          return <span>{ option.key } - { option.label }</span>;
        }
      };
    },

    methods: {
      handleChange(value, direction, movedKeys) {
        console.log(value, direction, movedKeys);
      }
    }
  };
</script>




img

如图所示,第15个不显示这是什么原因啊,求帮助

我看了一些官方的案例是展示第十五个项的,能贴出来完整的代码吗?


console.log

参考结合GPT4.0、文心一言,如有帮助,恭请采纳。

根据你的代码中,最后一个数据不显示的问题可能是因为 filterable 属性。当 filterable 属性设置为 true 时,穿梭框会显示一个搜索框,用户可以在其中输入关键字以过滤数据。然而,当搜索时,如果某个数据项的标签不包含搜索关键字,那么这个数据项就会被隐藏起来。
而在你的代码中,最后一个数据项的标签是 "备选项 15",当用户在搜索框中输入关键字时,如果这个关键字不在 "备选项 15" 中,那么这个数据项就会被隐藏起来,导致最后一个数据不显示。
大致建议:
1、在 el-transfer 组件中,@change 事件使用了未定义的 handleChange 方法。可以先检查下组件里的 methods 中是否定义了这个方法。

2、在 renderFunc 方法中,使用了 this.data2 来访问数据,但根据提供的代码,并没有定义 data2 这个变量。可以检查下,在组件的 data 中是否定义了 data2。

3、在使用 slot-scope 时,需要给每个 el-transfer 组件添加一个唯一的 name 属性,否则在使用 slot-scope 时会出现问题。

【以下回答由 GPT 生成】

首先请确认你是否正确引入了element UI的穿梭框组件及相关依赖。如果没有正确引入,可以尝试重新引入或查看控制台是否报错。

如果引入没有问题,根据你提供的代码,我注意到在两个el-transfer组件中的:data属性都赋值为data2,这可能导致同一个数据被绑定到两个穿梭框中。你可以尝试给两个组件分别绑定不同的数据。

以下是修改后的代码示例:

<template>
  <div>
    <p style="text-align: center; margin: 0 0 20px;">使用 render-content 自定义数据项</p>
    <div style="text-align: center">
      <el-transfer
        style="text-align: left; display: inline-block"
        v-model="value1" <!-- 修改v-model绑定 -->
        filterable
        :left-default-checked="[2, 3]"
        :right-default-checked="[1]"
        :render-content="renderFunc"
        :titles="['Source', 'Target']"
        :button-texts="['到左边', '到右边']"
        :format="{
          noChecked: '${total}',
          hasChecked: '${checked}/${total}'
        }"
        @change="handleChange"
        :data="data1"> <!-- 修改data绑定 -->
        <el-button class="transfer-footer" slot="left-footer" size="small">操作</el-button>
        <el-button class="transfer-footer" slot="right-footer" size="small">操作</el-button>
      </el-transfer>
    </div>
    <p style="text-align: center; margin: 50px 0 20px;">使用 scoped-slot 自定义数据项</p>
    <div style="text-align: center">
      <el-transfer
        style="text-align: left; display: inline-block"
        v-model="value2" <!-- 修改v-model绑定 -->
        filterable
        :left-default-checked="[2, 3]"
        :right-default-checked="[1]"
        :render-content="renderFunc"
        :titles="['Source', 'Target']"
        :button-texts="['到左边', '到右边']"
        :format="{
          noChecked: '${total}',
          hasChecked: '${checked}/${total}'
        }"
        @change="handleChange"
        :data="data2"> <!-- 修改data绑定 -->
        <el-button class="transfer-footer" slot="left-footer" size="small">操作</el-button>
        <el-button class="transfer-footer" slot="right-footer" size="small">操作</el-button>
      </el-transfer>
    </div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      value1: [], <!-- 修改value的命名 -->
      value2: [], <!-- 修改value的命名 -->
      data1: [{ key: 1, label: "备选项1" }, { key: 2, label: "备选项2" }, { key: 3, label: "备选项3" }], <!-- 修改data命名 -->
      data2: [{ key: 1, label: "备选项1" }, { key: 2, label: "备选项2" }, { key: 3, label: "备选项3" }]
    };
  },
  methods: {
    renderFunc(h, option) {
      return (
        <span>
          {option.key} - {option.label}
        </span>
      );
    },
    handleChange(value) {
      console.log(value);
    }
  }
};
</script>

通过以上修改,你应该能够在两个穿梭框中正确显示数据了。如果问题仍然存在,请检查一下element UI的版本是否兼容当前环境,或者尝试在控制台查看是否有任何错误消息。



【相关推荐】



如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

参考gpt:
结合自己分析给你如下建议:
原因一:你的数据项的key属性不是唯一的,导致穿梭框组件无法正确识别和渲染数据。根据element UI的文档(https://blog.csdn.net/qq_45990346/article/details/118409154) 穿梭框组件的data属性需要是一个对象数组,每个对象必须有一个key属性作为数据的唯一性标识。如果你的数据项的key属性有重复的值,那么穿梭框组件可能会忽略掉其中的一些数据项,导致最后一个数据不显示。
原因二:你的数据项的label属性为空或者不合法,导致穿梭框组件无法正确显示数据。根据element UI的文档,穿梭框组件的data属性需要是一个对象数组,每个对象必须有一个label属性作为显示文本。如果你的数据项的label属性为空或者不是一个字符串类型,那么穿梭框组件可能会无法显示该数据项,导致最后一个数据不显示。
原因三:你的数据项的disabled属性为true,导致穿梭框组件禁止转移该数据。根据element UI的文档,穿梭框组件的data属性需要是一个对象数组,每个对象可以有一个可选的disabled属性表示该项数据是否禁止转移。如果你的数据项的disabled属性为true,那么穿梭框组件会将该数据项置灰,并且无法被选中或者移动,导致最后一个数据不显示。
为了解决这个问题,我建议你检查一下你传入穿梭框组件的data属性是否符合要求,是否有以上提到的问题。如果有,你可以尝试修改一下你的数据源,确保每个数据项都有唯一且合法的key和label属性,并且没有被禁止转移。

确认一下 data2 是否正确定义并且包含正确的数据。你可以在 data 选项中添加 data2,如下:

data() {
  const generateData = _ => {
    const data = [];
    for (let i = 1; i <= 15; i++) {
      data.push({
        key: i,
        label: `备选项 ${ i }`,
        disabled: i % 4 === 0
      });
    }
    return data;
  };
  return {
    data2: generateData(), // 添加这一行
    value: [1],
    value4: [1],
    renderFunc(h, option) {
      return <span>{ option.key } - { option.label }</span>;
    }
  };
},


和官方代码对比,你最外层多了个div,建议你先把官方代码直接复制黏贴,确保官方代码能正常显示了在进行改造

自己解决了,问题是在按需引入的时候,没有引入elementUI官方的样式库