Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

188
Views
Creando un createSelector en Redux que no vuelve a renderizar componentes no relacionados

Tengo un creador de documentos simple que permite a los usuarios crear múltiples campos de dos tipos (campo de entrada y campo de etiqueta). También pueden reorganizar el campo arrastrando y soltando. Mi estructura de datos se basa en la guía Redux sobre normalización de datos.

El campo LISTA es de tipo de entrada (por ejemplo, ID de niños 21 y 22): onChange enviará la acción y permitirá que el texto de entrada se modifique sin volver a representar otros campos.

Con el campo ETIQUETA, permitimos a los usuarios seleccionar de una lista desplegable de solo 3 etiquetas (Peligro, Resbaladizo, Inflamable). Seleccionando uno con eliminarlo de la lista desplegable para evitar etiquetas duplicadas. Por ejemplo, si hay "Peligro" y "Resbaladizo" en el campo, el campo desplegable solo mostrará una opción "Inflamable". Para lograr esto, uso createSelector para obtener todos los elementos secundarios y filtrarlos según su elemento principal (fieldId). Esto me da una serie de etiquetas existentes ["Peligro", "Resbaladizo"] en ese ID de campo. Esta matriz se usará para filtrar desde una matriz desplegable fija de tres opciones con useEffect.

Ahora, cada vez que actualice el texto de entrada, también se volverá a representar el campo ETIQUETA (basado en el perfilador de Chrome React).

No afecta el rendimiento, pero siento que me falta algo con mi createSelector .

 Example: export const documentSlice = createSlice({ name: "document", initialState: { fields: { 1: { id: 1, children: [11, 12] }, 2: { id: 2, children: [21, 22] }, }, children: { 11: { id: 11, type: "LABEL", text: "Danger", fieldId: 1 }, 12: { id: 11, type: "LABEL", text: "Slippery", fieldId: 1 }, 21: { id: 21, type: "LIST", text: "", fieldId: 2 }, 22: { id: 22, type: "LIST", text: "", fieldId: 2 }, }, fieldOrder:[1,2] }, });

crearSelector

 export const selectAllChildren = (state) => state.document.children; export const selectFieldId = (state, fieldId) => fieldId; export const getChildrenByFieldId = createSelector( [selectAllChildren, selectFieldId], (children, fieldId) => { const filterObject = (obj, filter, filterValue) => Object.keys(obj).reduce( (acc, val) => obj[val][filter] !== filterValue ? acc : [...acc, obj[val].text], [] ); const existingChildren = filterObject(children, "fieldId", filterId); return existingChildren; } );
about 4 years ago · Juan Pablo Isaza
1 answers
Answer question

0

Después de leer más, esto es lo que finalmente funciona para mí. Con suerte, alguien lo encontrará útil.

  1. Dados los datos normalizados, la función de reducción de objetos se puede simplificar.
 slice.js export const getChildrenByFieldId = createSelector( [selectAllChildren, selectFieldId], (children, fieldId) => { // get the children from fields entry => array [11,12] const childrenIds = state.document.fields[fieldId].children let existingChildrenText = []; // loop through the created array [11,12] childrenIds.forEach((childId) => { // pull data from the individual children entry const childText = children[childId].text; existingChildrenText.push(childText); }); return existingChildrenText; } );
  1. Para evitar volver a renderizar, podemos usar la comparación de igualdad superficial en la matriz de salida para comparar solo los valores de la matriz.
 //app.js import { shallowEqual, useSelector } from "react-redux"; const childrenTextData = useSelector((state) => { return getChildrenByFieldId(state, blockId); }, shallowEqual);
about 4 years ago · Juan Pablo Isaza Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!