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

有需要的各位随意取用吧 

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

关于vue-treeselect绑值、回显等常见问题的总结的更多相关文章

  1. vue-treeselect显示unknown的问题及解决

    这篇文章主要介绍了vue-treeselect显示unknown的问题及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

  2. ajax实现文件异步上传并回显文件相关信息功能示例

    这篇文章主要介绍了ajax实现文件异步上传并回显文件相关信息功能,结合实例形式分析了基于jQuery $.ajax方法的文件异步上传以及后台java程序对文件信息的读取与显示相关操作技巧,需要的朋友可以参考下

  3. vue组件vue-treeselect箭头和叉图标变大问题及解决

    这篇文章主要介绍了vue组件vue-treeselect箭头和叉图标变大问题及解决方案,具有很好的参考价值,希望对大家有所帮助。

  4. vant的Uploader 文件上传,图片数据回显问题

    这篇文章主要介绍了vant的Uploader 文件上传,图片数据回显问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

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

    这篇文章主要介绍了关于vue-treeselect绑值、回显等常见问题的总结,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

  6. element-ui+vue-treeselect下拉框的校验过程

    这篇文章主要介绍了element-ui+vue-treeselect下拉框的校验过程,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

  7. element table跨分页多选及回显的实现示例

    本文主要介绍了element table跨分页多选及回显的实现示例,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  8. vue el-select绑定对象时,回显内容不正确,始终是最后一项的解决

    这篇文章主要介绍了vue el-select绑定对象时,回显内容不正确,始终是最后一项的问题及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

  9. 利用node+koa+axios实现图片上传和回显功能

    这篇文章为大家详细介绍了如何利用node+koa+axios实现图片上传和回显功能,主要实现简单的图片上传和静态内容的访问,感兴趣的可以了解一下

  10. vue ElementUI级联选择器回显问题解决

    这篇文章主要介绍了vue ElementUI级联选择器回显问题解决,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下

随机推荐

  1. js中‘!.’是什么意思

  2. Vue如何指定不编译的文件夹和favicon.ico

    这篇文章主要介绍了Vue如何指定不编译的文件夹和favicon.ico,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

  3. 基于JavaScript编写一个图片转PDF转换器

    本文为大家介绍了一个简单的 JavaScript 项目,可以将图片转换为 PDF 文件。你可以从本地选择任何一张图片,只需点击一下即可将其转换为 PDF 文件,感兴趣的可以动手尝试一下

  4. jquery点赞功能实现代码 点个赞吧!

    点赞功能很多地方都会出现,如何实现爱心点赞功能,这篇文章主要为大家详细介绍了jquery点赞功能实现代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  5. AngularJs上传前预览图片的实例代码

    使用AngularJs进行开发,在项目中,经常会遇到上传图片后,需在一旁预览图片内容,怎么实现这样的功能呢?今天小编给大家分享AugularJs上传前预览图片的实现代码,需要的朋友参考下吧

  6. JavaScript面向对象编程入门教程

    这篇文章主要介绍了JavaScript面向对象编程的相关概念,例如类、对象、属性、方法等面向对象的术语,并以实例讲解各种术语的使用,非常好的一篇面向对象入门教程,其它语言也可以参考哦

  7. jQuery中的通配符选择器使用总结

    通配符在控制input标签时相当好用,这里简单进行了jQuery中的通配符选择器使用总结,需要的朋友可以参考下

  8. javascript 动态调整图片尺寸实现代码

    在自己的网站上更新文章时一个比较常见的问题是:文章插图太宽,使整个网页都变形了。如果对每个插图都先进行缩放再插入的话,太麻烦了。

  9. jquery ajaxfileupload异步上传插件

    这篇文章主要为大家详细介绍了jquery ajaxfileupload异步上传插件,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  10. React学习之受控组件与数据共享实例分析

    这篇文章主要介绍了React学习之受控组件与数据共享,结合实例形式分析了React受控组件与组件间数据共享相关原理与使用技巧,需要的朋友可以参考下

返回
顶部