Selector de tres niveles con carga dinámica en uniapp usando multiSelector

En el desarrollo de aplicaciones con uniapp, la selección de direcciones jerárquicas como provincias, ciudades y distritos es un requisito común. El componente picker ofrece una solución eficiente, especialmente con el modo multiSelector, que permite crear selectores de múltiples columnas con datos interactivos. Este enfoque facilita la implementación de una interfaz donde las selecciones en una columna afectan dinámicamente el contenido de las columnas siguientes.

Diseño de estructuras de datos para selecciones jerárquicas

La elección de la estructura de datos influye significativamente en el rendimiento y la mentenibilidad. Una opción común es la estructura anidada, donde cada nivel contiene un arreglo de hijos. Por ejemplo:


const estructuraAnidada = [
  {
    etiqueta: 'Provincia A',
    identificador: 'PA001',
    subniveles: [
      {
        etiqueta: 'Ciudad B',
        identificador: 'CB001',
        subniveles: [
          { etiqueta: 'Distrito C', identificador: 'DC001' },
          { etiqueta: 'Distrito D', identificador: 'DC002' }
        ]
      }
    ]
  }
];

Esta representación es intuitiva y se adapta bien a respuestas de APIs. Alternativamente, una estructura plana puede optimizar el acceso a datos mediante objetos indexados, aunque requiere una gestión más manual de las relaciones.

Implementación de carga dinámica para mejor rendimiento

Cargar todos los datos de una vez puede ralentizar la inicialización, especialmente con conjuntos de datos extensos. La carga dinámica resuelve esto al recuperar solo la información necesaria en cada paso. Inicialmente, solo se cargan las provincias:


export default {
  data() {
    return {
      datosComplejos: [],
      columnasVisibles: [[], [], []],
      indicesActuales: [0, 0, 0],
      estadoCarga: false
    };
  },
  async onLoad() {
    this.estadoCarga = true;
    try {
      const provincias = await this.obtenerProvincias();
      this.columnasVisibles[0] = provincias.map(item => ({
        texto: item.nombre,
        valor: item.codigo
      }));
      // Pre-cargar ciudades para la provincia seleccionada inicialmente
      if (provincias.length > 0) {
        this.cargarCiudades(provincias[0].codigo);
      }
    } catch (error) {
      console.error('Error al cargar provincias:', error);
    } finally {
      this.estadoCarga = false;
    }
  },
  methods: {
    async obtenerProvincias() {
      // Simulación de llamada a API
      return [
        { nombre: 'Región Norte', codigo: 'RN01' },
        { nombre: 'Región Sur', codigo: 'RS02' }
      ];
    },
    async cargarCiudades(provinciaId) {
      const ciudades = await this.obtenerCiudadesPorProvincia(provinciaId);
      this.columnasVisibles[1] = ciudades.map(item => ({
        texto: item.nombre,
        valor: item.codigo
      }));
      if (ciudades.length > 0) {
        this.cargarDistritos(ciudades[0].codigo);
      }
    },
    async cargarDistritos(ciudadId) {
      const distritos = await this.obtenerDistritosPorCiudad(ciudadId);
      this.columnasVisibles[2] = distritos.map(item => ({
        texto: item.nombre,
        valor: item.codigo
      }));
    }
  }
};

Este método garantiza que solo se carguen los datos del nivel actual y el siguiente, reduciendo el consumo de recursos. La interacción del usuario con el selector activa la carga progresiva, manteniendo la interfaz ágil.

Manejo de eventos y actualización de columnas

Para sincronizar las columnas según la selección del usuario, se pueden capturar cambios en el índice de cada columna y actualizar los datos correspondiantes. Esto asegura que al seleccionar una provincia, las ciudades y distritos se actualicen en tiempo real sin recargar toda la estructura.

Etiquetas: uniapp multiSelector dynamic-data-loading hierarchical-selector picker-component

Publicado el 6-7 18:53