關(guān)于vue-treeselect綁值、回顯等常見(jiàn)問(wèn)題的總結(jié)
vue-treeselect綁值、回顯常見(jiàn)問(wèn)題
最近vue-treeselect使用的比較多,分享一波
可以用在表單里,也可以用在可編輯的表格內(nèi)
這里以表單里的舉例
在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)
最主要的幾點(diǎn)就是
1、綁值:value=“form.astdeptId”,主要綁的就是id或者code,通過(guò)id或code找到對(duì)應(yīng)的label回顯
2、options是數(shù)據(jù)源,正常調(diào)接口獲取就行了
3、append-to-body="true"這個(gè)最好加上,可能會(huì)遇到下拉的彈窗打不開(kāi)或者只有一點(diǎn)點(diǎn)高的情況
4、normalizer就是把我們自己的后端返的數(shù)據(jù)格式按樹(shù)插件需要的格式轉(zhuǎn)換
5、select點(diǎn)擊事件里賦值
6、插槽slot=“option-label” 是下拉框的值
7、插槽slot=“value-label” 是輸入框回顯的值
<el-form-item label="上級(jí)部門(mén):">
<TreeSelect
:value="form.astdeptId"
:options="zoneCodeOptions"
clearable
no-options-text="暫無(wú)可用選項(xiàng)"
:append-to-body="true"
:normalizer="tenantIdnormalizer"
open-direction="bottom"
placeholder="請(qǐng)選擇父級(jí)節(jié)點(diǎn)"
@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,拿對(duì)應(yīng)的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綁定數(shù)據(jù)有bug問(wèn)題
問(wèn)題,Vue3-treeSelect,在第一次綁定值的時(shí)候沒(méi)有問(wèn)題,但是第二次開(kāi)始無(wú)法綁定,知道各位有沒(méi)有什么好的解決方法,我比較菜搞不太懂。
所以,我重寫(xiě)了個(gè)簡(jiǎn)單的,沒(méi)那么多功能的就只有v-model,options,placeholder,normalizer4個(gè)參數(shù),下面把代碼貼出來(lái),需要注意的是,placeholder,normalizer這倆是非必須項(xiàng),如果不需要可以不寫(xiě),
placeholder不寫(xiě),默認(rèn)是空,normalizer不寫(xiě)默認(rèn)是
{
id: ‘id',
label: ‘label',
children: ‘children',
}不過(guò)大佬們看看代碼估計(jì)也就懂了
<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: {
? ? ? //這里是綁定參數(shù)
? ? ? modelValue: {
? ? ? ? type: Number,
? ? ? ? default: undefined,
? ? ? },
? ? ? //這里是數(shù)組
? ? ? options: {
? ? ? ? type: Array,
? ? ? ? default: undefined,
? ? ? },
? ? ? //placeholder
? ? ? placeholder: {
? ? ? ? type: String,
? ? ? ? default: '',
? ? ? },
? ? ? //這里是轉(zhuǎn)換方法
? ? ? 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里的值不會(huì)自動(dòng)賦值給state中常量,只有第一次過(guò)來(lái)的時(shí)候才會(huì)賦值之后需要手動(dòng)賦值
? ? ? ? state.singleSelectTreeKey = newValue.modelValue
? ? ? ? state.selectTreeData = newValue.options
? ? ? ? initialize()
? ? ? })
? ? ? //防止不寫(xiě)Normalizer報(bào)錯(cuò)
? ? ? const defaultNormalizer = () => {
? ? ? ? if (!state.selectTreeDefaultProps) {
? ? ? ? ? state.selectTreeDefaultProps = {
? ? ? ? ? ? id: 'id',
? ? ? ? ? ? label: 'label',
? ? ? ? ? ? children: 'children',
? ? ? ? ? }
? ? ? ? }
? ? ? }
? ? ? //初始化
? ? ? const initialize = () => {
? ? ? ? if (state.singleSelectTreeKey != null) {
? ? ? ? ? state['singleSelectTree'].setCurrentKey(state.singleSelectTreeKey) // 設(shè)置默認(rèn)選中
? ? ? ? ? let node = state['singleSelectTree'].getNode(
? ? ? ? ? ? state.singleSelectTreeKey
? ? ? ? ? )
? ? ? ? ? state.singleSelectTreeVal =
? ? ? ? ? ? node.data[state.selectTreeDefaultProps['label']]
? ? ? ? ? state.singleSelectTreeKey =
? ? ? ? ? ? node.data[state.selectTreeDefaultProps['id']]
? ? ? ? } else {
? ? ? ? ? selectTreeClearHandle()
? ? ? ? }
? ? ? }
? ? ? // 清除單選樹(shù)選中
? ? ? const selectTreeClearHandle = () => {
? ? ? ? state.selectTreeDefaultSelectedKeys = []
? ? ? ? clearSelected()
? ? ? ? emit('update:modelValue', null)
? ? ? ? state.singleSelectTreeVal = ''
? ? ? ? state.singleSelectTreeKey = null
? ? ? ? state['singleSelectTree'].setCurrentKey(null) // 設(shè)置默認(rèn)選中
? ? ? }
? ? ? 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;
? ? ? ? ? }
? ? ? ? }
? ? ? }有需要的各位隨意取用吧
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- 關(guān)于vue-treeselect的基本用法
- vue-treeselect顯示unknown的問(wèn)題及解決
- vue組件vue-treeselect箭頭和叉圖標(biāo)變大問(wèn)題及解決
- element-ui+vue-treeselect下拉框的校驗(yàn)過(guò)程
- 關(guān)于下拉類(lèi)型多選組件Vue-Treeselect(鍵名轉(zhuǎn)換)
- 如何修改vue-treeSelect的高度
- vue-treeselect無(wú)法點(diǎn)擊問(wèn)題(點(diǎn)擊無(wú)法出現(xiàn)拉下菜單)
- VUE插件vue-treeselect的使用及說(shuō)明
相關(guān)文章
Vue+ElementUI踩坑之動(dòng)態(tài)顯示/隱藏表格的列el-table-column問(wèn)題
這篇文章主要介紹了Vue+ElementUI踩坑之動(dòng)態(tài)顯示/隱藏表格的列el-table-column問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-11-11
vue項(xiàng)目中引入noVNC遠(yuǎn)程桌面的方法
下面小編就為大家分享一篇vue項(xiàng)目中引入noVNC遠(yuǎn)程桌面的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-03-03
vue-cli如何快速構(gòu)建vue項(xiàng)目
本篇文章主要介紹了vue-cli如何快速構(gòu)建vue項(xiàng)目,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-04-04
詳解Vue項(xiàng)目部署遇到的問(wèn)題及解決方案
這篇文章主要介紹了詳解Vue項(xiàng)目部署遇到的問(wèn)題及解決方案,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-01-01
vuejs實(shí)現(xiàn)遞歸樹(shù)型菜單組件
本篇文章主要介紹了vuejs實(shí)現(xiàn)遞歸樹(shù)型菜單組件,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-01-01
vue.js使用Element-ui實(shí)現(xiàn)導(dǎo)航菜單
這篇文章主要為大家詳細(xì)介紹了vue.js使用Element-ui中實(shí)現(xiàn)導(dǎo)航菜單,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-09-09
vue2實(shí)現(xiàn)數(shù)據(jù)請(qǐng)求顯示loading圖
這篇文章主要為大家詳細(xì)介紹了vue2實(shí)現(xiàn)數(shù)據(jù)請(qǐng)求顯示loading圖,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-11-11

