ReactJS - Select múltiple: setear valores en componentDidMount

 
Vista:
sin imagen de perfil

Select múltiple: setear valores en componentDidMount

Publicado por Antonio (1 intervención) el 10/01/2022 18:14:56
Buen día compañeros. Llevó unas semanas aprendiendo React.js y viendo algunos cursos, Internet, proyectos legacy y la documentación oficial, voy sacando los requerimientos. En esta ocasión, llevo varios días tratando de resolver un inconveniente con un Select con la opción IsMulti = true. Al ser parte de un CRUD básico, debe permitirme guardar, editar e eliminar opciones del mismo Select.

Mi escenario es el siguiente: logro guardar el listado de opciones sin problemas cuando estoy realizando el INSERT; pero, en el UPDATE no logro hacer que se carguen las diferentes opciones provenientes de la base de datos en el evento componentDidMount().

El código que estoy usando para setear las opciones que vienen desde la consulta en la BD, es el siguiente:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
componentDidMount() {
         this.getListaProductos();
}
 
//Esta función tiene la consulta que selecciona los productos
async getListaProductos() {
    let response = await fetch(selectORM, apiCall(
        "Productos",
        "SELECT", [{ field: "*" }], [{ value: "" }]
    ))
        .then(response => response.json())
        .then(data => {
            if (typeof data === 'string') {
                // window.location.href = '/error';
            } else {
                let opcionesProductos = data.item;
                opcionesProductos = opcionesProductos.map(p => {
                    return { value: p.IdProducto, label: `${p.Descripcion}` }
                });
                this.setState({ opcionesProductos });
 
                this.getListaProductosEdit(this.props.listaCategorias.IdCategoria);
            }
        })
        .catch(err => {
            console.log('ERR:' + err);
            // window.location.href = '/expire';
        });
}
 
handleSelectChangeProceso = (ProcesoSelected) => {
   this.setState({ ProcesoSelected });
}
 
async getListaProcesosEdit(IdCategoria) {
    //Aquí uso la misma lógica para traer los registros a la base de datos a partir de la categoría seleccionada y
    let response = await fetch(selectORM, apiCall(
        `FN_ProductosCategoria(${IdCategoria})`,
        "SELECT", [{ field: "*" }], [{ value: "" }],
        ""
    ))
        .then(response => response.json())
        .then(data => {
            if (typeof data === 'string') {
                // window.location.href = '/expire';
            } else {
                let opcionesProdCategorias = data.item;
                let ProductosSelectedTmp = [];
 
                opcionesProdCategorias = opcionesProdCategorias.map(p => {
                    ProductosSelectedTmp.push({ value: p.IdProducto, label: `${p.Descripcion}` });
 
                    if (ProductoSelectedTmp !== null && ProductoSelectedTmp !== undefined) {
                        //this.handleSelectChangeProducto(5); //Prueba enviado un valor fijo llamando el evento
                    }
 
                    return { value: p.IdProducto, label: `${p.Descripcion}` }
                });
 
                this.setState({ opcionesProductos });
            }
        })
        .catch(err => {
            console.log('ERR:' + err);
            // window.location.href = '/expire';
        });
}
 
render(){
let { opcionesProductos, ProductoSelected } = this.state;
<Select isMulti = {true}
           className={this.state.obligatorios !== true ? "basic-single" : "basic-singleError"}
           value={this.state.ProcesoSelected.value }
           //value={opcionesProcesos.filter(({ value }) => value === this.state.ProcesoSelected.value)}
           //defaultValue={1, 3, 5, 6}
           //value={opcionesProcesos.filter(({ value }) => value === this.state.ProcesoSelected.value)}
           //value={opcionesProcesos.filter(({ value }) => this.state.ProcesoSelected.value.includes)}
           //defaultInputValue={'Hola mundo'}
           defaultValue={'7'}
           //defaultValue={[opcionesProcesos[0].value]}
           onChange={this.handleSelectChangeProceso}
           name="select"
           isDisabled={this.state.isDisabled}
           placeholder="Procesos"
           options={opcionesProcesos}
           style={{ color: '#979797', borderRadius: '0px', width: '100%' }}
           closeMenuOnSelect={false}
 />
}


El INSERT es funcional; es el paso de setear los que están en la base de datos en el mismo "Select IsMulti= true" lo que me está dando problemas.

Cualquier sugerencia o comentario, será bienvenida. Gracias
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder