当前位置: 代码网 > it编程>编程语言>Javascript > vue3-treeselect数据绑定失败的解决方案

vue3-treeselect数据绑定失败的解决方案

2024年06月11日 Javascript 我要评论
vue3-treeselect数据绑定失败目标插件https://github.com/megafetis/vue3-treeselect问题描述是用这个插件做数据绑定的时候会出现这样的问题,当第一次

vue3-treeselect数据绑定失败

目标插件

https://github.com/megafetis/vue3-treeselect

问题描述

是用这个插件做数据绑定的时候会出现这样的问题,当第一次赋值(v-model)时,可以实现选中,但当数据变化时,选中的数据还是之前的数据,不会自动的切换选中的数据。

              <treeselect
                v-model="form.parentid"
                :options="deptoptions"
                :normalizer="normalizer"
                placeholder="选择上级部门"
                ref="depttree"
              />

即代码中的form-parentid变化时,仍然显示选中之前的数据。

解决方案

手动选中

depttree.value?.select(depttree.value?.getnode(row.deptid));

这里的depttree是获取的treeselectdom对象

const depttree: ref<typeof treeselect | null> = ref(null);

vue3-treeselect绑定数据有bug问题

vue3-treeselect,在第一次绑定值的时候没有问题,但是第二次开始无法绑定,知道各位有没有什么好的解决方法。

所以,我重写了个简单的,没那么多功能的就只有v-model,options,placeholder,normalizer4个参数,下面把代码贴出来,需要注意的是,placeholder,normalizer这俩是非必须项,如果不需要可以不写,placeholder不写,默认是空,normalizer不写默认是

{
id: ‘id',
label: ‘label',
children: ‘children',
}

不过大佬们看看代码估计也就懂了

<template>
  <div class="tree-container">
    <el-select
      ref="singletree"
      v-model="singleselecttreeval"
      class="vab-tree-select"
      clearable
      :placeholder="placeholder"
      popper-class="select-tree-popper"
      value-key="id"
      @clear="selecttreeclearhandle('single')"
    >
      <el-option :value="singleselecttreekey">
        <el-tree
          id="singleselecttree"
          ref="singleselecttree"
          :current-node-key="singleselecttreekey"
          :data="selecttreedata"
          :default-expanded-keys="selecttreedefaultselectedkeys"
          :highlight-current="true"
          :node-key="selecttreedefaultprops.id"
          :props="selecttreedefaultprops"
          @node-click="selecttreenodeclick"
        >
          <template #defalut="{ node }" class="vab-custom-tree-node">
            <span class="vab-tree-item">{{ node.label }}</span>
          </template>
        </el-tree>
      </el-option>
    </el-select>
  </div>
</template>
<script>
  import { onbeforemount, onmounted, reactive, torefs, watch } from 'vue'

  export default {
    name: 'vabsingleselecttree',
    props: {
      //这里是绑定参数
      modelvalue: {
        type: number,
        default: undefined,
      },
      //这里是数组
      options: {
        type: array,
        default: undefined,
      },
      //placeholder
      placeholder: {
        type: string,
        default: '',
      },
      //这里是转换方法
      normalizer: {
        type: object,
        default: undefined,
      },
    },
    emits: ['update:modelvalue'],
    // { emit }
    setup(props, { emit }) {
      //$emit('update:modelvalue', $event.target.value)
      const state = reactive({
        singleselecttree: null,
        singletree: null,
        singleselecttreekey: props.modelvalue,
        singleselecttreeval: null,
        selecttreedata: props.options,
        selecttreedefaultselectedkeys: [],
        selecttreedefaultprops: props.normalizer,
      })
      onbeforemount(() => {
        defaultnormalizer()
      })
      //首次加载
      onmounted(() => {
        initialize()
      })
      watch(props, (newvalue) => {
        //这里props里的值不会自动赋值给state中常量,只有第一次过来的时候才会赋值之后需要手动赋值
        state.singleselecttreekey = newvalue.modelvalue
        state.selecttreedata = newvalue.options
        initialize()
      })

      //防止不写normalizer报错
      const defaultnormalizer = () => {
        if (!state.selecttreedefaultprops) {
          state.selecttreedefaultprops = {
            id: 'id',
            label: 'label',
            children: 'children',
          }
        }
      }
      //初始化
      const initialize = () => {
        if (state.singleselecttreekey != null) {
          state['singleselecttree'].setcurrentkey(state.singleselecttreekey) // 设置默认选中
          let node = state['singleselecttree'].getnode(
            state.singleselecttreekey
          )
          state.singleselecttreeval =
            node.data[state.selecttreedefaultprops['label']]
          state.singleselecttreekey =
            node.data[state.selecttreedefaultprops['id']]
        } else {
          selecttreeclearhandle()
        }
      }
      // 清除单选树选中
      const selecttreeclearhandle = () => {
        state.selecttreedefaultselectedkeys = []
        clearselected()
        emit('update:modelvalue', null)
        state.singleselecttreeval = ''
        state.singleselecttreekey = null
        state['singleselecttree'].setcurrentkey(null) // 设置默认选中
      }
      const clearselected = () => {
        const allnode = document.queryselectorall(
          '#singleselecttree .el-tree-node'
        )
        allnode.foreach((element) => element.classlist.remove('is-current'))
      }
      const selecttreenodeclick = (data) => {
        state.singleselecttreeval = data[state.selecttreedefaultprops['label']]
        state.singleselecttreekey = data[state.selecttreedefaultprops['id']]
        emit('update:modelvalue', state.singleselecttreekey)
        state['singletree'].blur()
        //data
        // if (data.rank >= this.selectlevel) {
        //
        // }
      }
      return {
        ...torefs(state),
        selecttreeclearhandle,
        selecttreenodeclick,
        defaultnormalizer,
        initialize,
      }
    },
  }
</script>

<style scoped></style>
/* .vab-hey-message */
    .vab-hey-message {
      @mixin vab-hey-message {
        min-width: 246px;
        padding: 15px;
        background-color: $base-color-white;
        border-color: $base-color-white;
        box-shadow: 0 5px 10px rgba(0, 0, 0, 0.15);

        .el-message__content {
          padding-right: $base-padding;
          color: #34495e;
        }

        .el-icon-close {
          color: #34495e;

          &:hover {
            opacity: 0.8;
          }
        }
      }

有需要的各位随意取用!

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com