Básicamente se utiliza a-tree-select, se establece la altura y el ancho del cuadro desplegable y se resuelve la posición de la barra de desplazamiento cuando se hace eco.

1. Uso básico

1. Efectos de interfaz

![Inserte descripción de la imagen aquí](https://img-blog.csdnimg.cn/35851e814583472bb366d6173f9a52d4.png

2. Implementación del código

<template>
  <div>
    <div class="box">
      <a-tree-select
        v-model="name"
        :replaceFields="replaceFields"
        :tree-data="treeData"
        class="tree-select"
      >
      </a-tree-select>
    </div>
  </div>
</template>

<script>
import {
    
     getPkProperty } from '@/api/process-cfg/process-cfg.js'
export default {
    
    
  data() {
    
    
    return {
    
    
      replaceFields: {
    
    
        children: 'subclasses',
        title: 'dsp_class_name',
        key: 'class_name',
        value: 'class_name'
      },
      treeData: [],
      name: ''
    }
  },
  created() {
    
    
    this.getSortData()
  },
  methods: {
    
    
    async getSortData() {
    
    
      let result = await getPkProperty()
      this.treeData = result.subclasses
    }
  }
}
</script>

<style>
.box {
    
    
  margin: 100px;
  width: 500px;
  height: 500px;
}

.tree-select {
    
    
  width: 200px;
}
</style>

3. Problema 1: el cuadro desplegable ocupa toda la pantalla

1) Efecto del problema
inserte la descripción de la imagen aquí
2) Efecto ideal
inserte la descripción de la imagen aquí
3) Código completo

Descripción: establezca dropdownStyle (estilo de menú desplegable), agregue el siguiente código y usted mismo puede ajustar la altura.:dropdown-style="{ maxHeight: '400px', overflow: 'auto' }"

<template>
  <div>
    <div class="box">
      <a-tree-select
        v-model="name"
        :dropdown-style="{ maxHeight: '400px', overflow: 'auto' }" 
        :replaceFields="replaceFields"
        :tree-data="treeData"
        class="tree-select"
      >
      </a-tree-select>
    </div>
  </div>
</template>

<script>
import {
    
     getPkProperty } from '@/api/process-cfg/process-cfg.js'
export default {
    
    
  data() {
    
    
    return {
    
    
      replaceFields: {
    
    
        children: 'subclasses',
        title: 'dsp_class_name',
        key: 'class_name',
        value: 'class_name'
      },
      treeData: [],
      name: ''
    }
  },
  created() {
    
    
    this.getSortData()
  },
  methods: {
    
    
    async getSortData() {
    
    
      let result = await getPkProperty()
      this.treeData = result.subclasses
    }
  }
}
</script>

<style>
.box {
    
    
  margin: 100px;
  width: 500px;
  height: 500px;
}

.tree-select {
    
    
  width: 200px;
}
</style>

4. Problema 4: cuando el contenido del menú es demasiado largo, el ancho del menú desplegable se vuelve infinitamente más amplio.

1) Efecto problema
inserte la descripción de la imagen aquí
2) Efecto ideal

Descripción: tiene el mismo ancho que el cuadro de texto y aparecerá una barra de desplazamiento horizontal cuando el contenido sea demasiado largo.

inserte la descripción de la imagen aquí
3) código completo

Descripción: establezca dropdownMatchSelectWidth (el menú desplegable y el selector tienen el mismo ancho).:dropdownMatchSelectWidth="true"

<template>
  <div>
    <div class="box">
      <a-tree-select
        v-model="name"
        :dropdownMatchSelectWidth="true"
        :dropdown-style="{ maxHeight: '400px', overflow: 'auto' }"
        :replaceFields="replaceFields"
        :tree-data="treeData"
        class="tree-select"
      >
      </a-tree-select>
    </div>
  </div>
</template>

<script>
import {
    
     getPkProperty } from '@/api/process-cfg/process-cfg.js'
export default {
    
    
  data() {
    
    
    return {
    
    
      replaceFields: {
    
    
        children: 'subclasses',
        title: 'dsp_class_name',
        key: 'class_name',
        value: 'class_name'
      },
      treeData: [],
      name: ''
    }
  },
  created() {
    
    
    this.getSortData()
  },
  methods: {
    
    
    async getSortData() {
    
    
      let result = await getPkProperty()
      this.treeData = result.subclasses
    }
  }
}
</script>

<style>
.box {
    
    
  margin: 100px;
  width: 500px;
  height: 500px;
}

.tree-select {
    
    
  width: 200px;
}
</style>

2. Eco de datos, posicionamiento de la barra de desplazamiento

1. Efectos de interfaz

Descripción: repite el último contenido seleccionado, expande el nodo y su nodo principal de forma predeterminada y coloca automáticamente la barra de desplazamiento en el nodo seleccionado.

inserte la descripción de la imagen aquí

2. Implementación del código

Idea: 1) Establecer el nodo expandido predeterminado treeDefaultExpandedKeys2) Colocar la barra de desplazamiento en el nodo seleccionado

2.1 Obtener el nodo expandido predeterminado

Idea:
1) Según la clave del nodo seleccionado, busque las claves de todos los nodos principales de este nodo. Aquí se utiliza el método encapsulado en la biblioteca xe-utils .
2) Dado que findTreeel método tiene un formato de datos específico, necesitamos formatear los datos (clave: id, niño: 'niños'), y el lado derecho es el formateado.
3) El método de formato es mapTree.

2.1.1 Implementación del código

getExpandKeys(id) {
    
    
      // 1.数据格式化
      let newTree = XEUtils.mapTree(
        this.treeData, // 格式化树数据
        (item) => {
    
    
          return {
    
    
            id: item.class_name // id对应的字段名
          }
        },
        {
    
    
          children: 'subclasses', // 子数组对应的字段名
          mapChildren: 'children' // 子数组格式化后的名称
        }
      )
      // 2.找到节点路径
      let data = XEUtils.findTree(newTree, (item) => item.id === id)
      // 3.获取默认展开节点
      this.treeDefaultExpandedKeys = data.nodes.map((item) => item.id)
}

2.1.2 Descripción

1) método mapTree

  • API
    inserte la descripción de la imagen aquí
  • Datos formateados: solo id (clave), la submatriz son hijos
    inserte la descripción de la imagen aquí

2) método encontrarárbol

  • API
    inserte la descripción de la imagen aquí
  • Visualización de datos de retorno:
    inserte la descripción de la imagen aquí

2.2 Establecer la posición de la barra de desplazamiento

2.2.1 Nota: Busque el nombre del estilo seleccionado; consulte la figura siguiente.

inserte la descripción de la imagen aquí

2.2.2 Implementación del código

 setTimeout(() => {
    
    
        this.treeDefaultExpandedKeys = data.nodes.map((item) => item.id)
      }, 500)
      setTimeout(() => {
    
    
        if (
          document.getElementsByClassName('ant-select-tree-node-selected')
            .length > 0
        ) {
    
    
          document
            .getElementsByClassName('ant-select-tree-node-selected')[0]
            .scrollIntoView()
        }
 }, 1000)

3. Código completo

<template>
  <div>
    <div class="box">
      <a-tree-select
        v-model="name"
        :dropdownMatchSelectWidth="true"
        :dropdown-style="{ maxHeight: '400px', overflow: 'auto' }"
        :replaceFields="replaceFields"
        :treeDefaultExpandedKeys="treeDefaultExpandedKeys"
        :tree-data="treeData"
        class="tree-select"
        v-if="treeData.length > 0"
      >
      </a-tree-select>
    </div>
  </div>
</template>

<script>
import {
    
     getPkProperty } from '@/api/process-cfg/process-cfg.js'
import XEUtils from 'xe-utils'
export default {
    
    
  data() {
    
    
    return {
    
    
      replaceFields: {
    
    
        children: 'subclasses',
        title: 'dsp_class_name',
        key: 'class_name',
        value: 'class_name'
      },
      treeData: [],
      name: '',
      treeDefaultExpandedKeys: []
    }
  },
  async created() {
    
    
    await this.getSortData()
    await this.echoData()
  },
  methods: {
    
    
    async getSortData() {
    
    
      let result = await getPkProperty()
      this.treeData = result.subclasses
    },
    async echoData() {
    
    
      // 1.获取回显数据
      this.name = '国外花键轴磨床'
      // 2.获取默认展开节点
      this.getExpandKeys(this.name)
    },
    getExpandKeys(id) {
    
    
      // 1.数据格式化
      let newTree = XEUtils.mapTree(
        this.treeData,
        (item) => {
    
    
          return {
    
    
            id: item.class_name
          }
        },
        {
    
    
          children: 'subclasses',
          mapChildren: 'children'
        }
      )
      // 2.找到节点路径
      let data = XEUtils.findTree(newTree, (item) => item.id === id)
      // 3.设置展开的key
      setTimeout(() => {
    
    
        this.treeDefaultExpandedKeys = data.nodes.map((item) => item.id)
      }, 500)
      setTimeout(() => {
    
    
        if (
          document.getElementsByClassName('ant-select-tree-node-selected')
            .length > 0
        ) {
    
    
          document
            .getElementsByClassName('ant-select-tree-node-selected')[0]
            .scrollIntoView()
        }
      }, 1000)
    }
  }
}
</script>

<style>
.box {
    
    
  margin: 100px;
  width: 500px;
  height: 500px;
}

.tree-select {
    
    
  width: 200px;
}
</style>

Supongo que te gusta

Origin blog.csdn.net/qq_45325810/article/details/129492434
Recomendado
Clasificación