好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

关于vue-treeselect绑值、回显等常见问题的总结

vue-treeselect绑值、回显常见问题

最近vue-treeselect使用的比较多,分享一波

可以用在表单里,也可以用在可编辑的表格内

这里以表单里的举例

在main.js中引入

import ElTreeSelect from ‘el-tree-select'
import Treeselect from ‘@riophae/vue-treeselect'
import ‘@riophae/vue-treeselect/dist/vue-treeselect.css'
Vue.use(ElTreeSelect)
Vue.component(‘TreeSelect', Treeselect)

最主要的几点就是

1、绑值:value=[form.astdeptId],主要绑的就是id或者code,通过id或code找到对应的label回显

2、options是数据源,正常调接口获取就行了

3、append-to-body="true"这个最好加上,可能会遇到下拉的弹窗打不开或者只有一点点高的情况

4、normalizer就是把我们自己的后端返的数据格式按树插件需要的格式转换

5、select点击事件里赋值

6、插槽slot=[option-label] 是下拉框的值

7、插槽slot=[value-label] 是输入框回显的值

<el-form-item label="上级部门:">
              <TreeSelect
                :value="form.astdeptId"
                :options="zoneCodeOptions"
                clearable            
                no-options-text="暂无可用选项"
                :append-to-body="true"
                :normalizer="tenantIdnormalizer"
                open-direction="bottom"
                placeholder="请选择父级节点"
                @select="node => tenantIdHandleSelect(node)"
              >
                <div slot="option-label" slot-scope="{ node }" style="white-space: nowrap; font-size: 14px">
                  {{ node.raw.name ? node.raw.name : '' }}
                </div>
                <div slot="value-label" slot-scope="{ node }">{{ node.raw.name ? node.raw.name : '' }}</div>
              </TreeSelect>
            </el-form-item>

打印node,拿对应的id,label和children

?tenantIdnormalizer(node) {
??
? ? ? if (node.children && !node.children.length) {
? ? ? ? delete node.children
? ? ? }
? ? ? return {
? ? ? ? id: node.astdeptId,
? ? ? ? label: node.name,
? ? ? ? children: node.children,
? ? ? }
? ? },

赋值给 this.form.astdeptId

? ? tenantIdHandleSelect(node) {
? ? ? this.form.astdeptId = node.astdeptId
? ? ? this.form.name = node.name
? ? },

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;
? ? ? ? ? }
? ? ? ? }
? ? ? }

有需要的各位随意取用吧 

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

查看更多关于关于vue-treeselect绑值、回显等常见问题的总结的详细内容...

  阅读:63次