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; } } }
有需要的各位随意取用!
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
发表评论