2021-01-29 ElementUI el-select绑定对象报错<transition-group> children must be keyed: <ElTag&gt...

症状是选择的时候会同时选取所有的选项,同时控制台报错<transition-group> children must be keyed: <ElTag>。

简而言之,是因为没有指定el-select的value-key属性,或者没有正确指定el-select的value-key属性。按照官网的说法:

如果 Select 的绑定值为对象类型,请务必指定 value-key 作为它的唯一性标识。

参数 说明 类型 可选值 默认值
value-key 作为 value 唯一标识的键名,绑定值为对象类型时必填 string — value
正确的使用方法如下:

<template>
    <!--value-key的值对应于item里的唯一字段-->
    <el-select v-model="value"
               value-key="label">
        <el-option v-for="item in options"
                   :label="item.label"
                   :key="item.label"
                   :value="item"/>
    </el-select>
</template>

<script>
    export default {
        data() {
            return {
                options: [{
                    value: '选项1',
                    label: '黄金糕'
                }, {
                    value: '选项2',
                    label: '双皮奶'
                }],
                value: {}
            }
        }
    }
</script>

如果允许同时选择多个选项,添加multiple属性,并且把value改成[]即可:

<template>
    <el-select v-model="value"
               value-key="label"
               multiple>
        <el-option v-for="item in options"
                   :label="item.label"
                   :key="item.label"
                   :value="item"/>
    </el-select>
</template>

<script>
    export default {
        data() {
            return {
                options: [{
                    value: '选项1',
                    label: '黄金糕'
                }, {
                    value: '选项2',
                    label: '双皮奶'
                }],
                value: []
            }
        }
    }
</script>

可能还有一个需要注意的地方,就是value-key的位置,一定要放在el-select上,而不是el-option上;放错位置是不会生效的。

这是自己的代码。

      <el-form-item label="" prop="createBy">
        <el-select
          v-model="query.createBy"
          clearable
          placeholder="活码创建人"
          multiple 
          value-key="userId"
          ref="select"
          popper-class="depart-member-mulitiple-select"
        >
          <el-option
            :key="item.userId"
            :label="item.name"
            :value="item"
            disabled
            v-for="(item,index) in options"
            v-show="index==0"
          >
            <ChooseCompany   
            v-if="index==0" @selectMan="ChoosePeople"></ChooseCompany>
          </el-option>
        </el-select>
      </el-form-item>
image.png

有一个注意的地方,只设置一个option,但是要query.createBy的值是外界传入的 ,要显示tag,外界传入的值必须在options的数组内,但是赋值options后回陈胜多个option,灵活使用v-show和v-if,v-if会重新创建请求后台数据,但是又要显示option,所以要v-show。

<script src="//unpkg.com/vue/dist/vue.js"></script>
<script src="//unpkg.com/element-ui@2.15.0/lib/index.js"></script>
<div id="app">
<template>
  <el-select v-model="value1" @change="getWord"  placeholder="请选择" value-key="label">
    <el-option
      v-for="item in options"
      :key="item.value"
                
      :label="item.label"
      :value="item">
    </el-option>
  </el-select>

  <el-select
    v-model="value2"
    multiple
             value-key="label"
    collapse-tags
    style="margin-left: 20px;"
    placeholder="请选择">
    <el-option
      v-for="item in options"
      :key="item.value"
      :label="item.label"
      :value="item">
    </el-option>
  </el-select>
</template>
</div>
var Main = {
    methods:{
      getWord(val){
        console.log(444,val)
      }
    },
    data() {
      return {
        options: [{
          value: '选项1',
          label: '黄金糕'
        }, {
          value: '选项2',
          label: '双皮奶'
        }, {
          value: '选项3',
          label: '蚵仔煎'
        }, {
          value: '选项4',
          label: '龙须面'
        }, {
          value: '选项5',
          label: '北京烤鸭'
        }],
        value1: {},
        value2: [{
          value: '选项4',
          label: '龙须面'
        }, {
          value: '选项5',
          label: '北京烤鸭'
        }]
      }
    }
  }
var Ctor = Vue.extend(Main)
new Ctor().$mount('#app')

选中的值要在options中,不然tag没有值

options的数据要小改,如果大改就会引起select重新渲染,重新load请求。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。