美文网首页
vue element Select组件远程搜索绑定值为对象时,

vue element Select组件远程搜索绑定值为对象时,

作者: 活泼lee | 来源:发表于2019-10-31 19:56 被阅读0次

    项目中遇到这么个需求,由于选项数据量过大,采用远程搜索的方式,相当于没有初始的下拉数组options选项数组,保存时需要传给后端id和userName两个字段。

    此时我的value绑定的为item(选项对象),注意下列例子为 多选 情况

    绑定值为对象

    当我再次编辑需要回显时,我拿到的数据后如何去让组件正确回显呢?当我把拿到的数据以对象数组的形式赋值给v-model绑定的变量中,此时会发现:组件的tag上并无label显示,显示为空,如图所示

    有值,但不显示label
    注意,官方案例中获取选中的值为
       [{
          userId: '1',
          userName : 'user004'  
        }, {
          userId: '2',
          userName : 'user005'
        }]
    
    以下我的代码中出现的ids和str是根据我们业务存取规则设定的临时变量
    //userId= value; 
    //userName = label; 
    //item = { userId: 1, userName = "user004"}
    ids = ['1', '2'];
    str = [ 'user004' ,  'user005' ]
    
    

    下面提供两个方法

    1.给下拉选项options赋值

    将回显数据添加到options中。图中this.personOptions为select-options对应的数据

    由于下拉选项options中没有值所以无法正确显示,那么第一种思路我们就把options中添加数据,使其能找到对应的选中项从而正确显示

    但是这个方法有个缺陷,

    image

    在select组件获焦但未远程搜索时,下拉选项会有选项出现,就是我们刚刚添加的两项,下面再提供一种方法

    2.看源码理解组件是如何渲染的

    先前使用给$res.selectDom.selected赋值

    $res.selectDom.selected.push({
      currentLabel: **,
      currentValue: {
        userId: **,
        userName: **
      },
      value: {
        userId: **,
        userName: **
      }
    })
    

    ,但发现最后selected中各项的currentLabel并未被赋值,猜想组件渲染过程中有过程将此部分重新赋值,方法失败

    后找到element的select.vue发现

    setSelected方法

    设置选中的方法中,多选时(this.multiple == true时),通过getOption方法处理value值后返回this.selected = result

    getOption方法

    而在getOption方法中看到有个很关键的地方:this.cachedOptions,通过遍历并比对找到对应的option并return,猜想this.cachedOptions就是当前组件后台隐匿储存的下拉选项集合,那我们可以通过在这个集合中把我们需要显示的选项添加进去,即可通过组件的setSelected方法去让label渲染到组件上,

    所以最终解决方法为:在拿到数据后执行下面代码

    for (let i=0; i<str.length; i++) {
      this.ruleForm.person.push({ //data中赋值
        userId: ids[i],
        userName: str[i]
      })
      this.$refs.selectDom.cachedOptions.push({
        currentLabel: str[i],
        currentValue: {
          userId: ids[i],
          userName: str[i]
        },
        label:str[i],
        value: {
          userId: ids[i],
          userName: str[i]
        },
      })
    }
    
    

    循环向cachedOptions中添加选项,这样就可以了


    相关文章

      网友评论

          本文标题:vue element Select组件远程搜索绑定值为对象时,

          本文链接:https://www.haomeiwen.com/subject/wktxbctx.html