Saltar al contenido

API React Context y evitar re-renderizaciones

Es importante entender el código de forma correcta antes de aplicarlo a tu proyecto y si ttienes algo que aportar puedes compartirlo con nosotros.

Solución:

Hay algunas formas de evitar volver a renderizar, también hacer que su administración de estado sea “similar a redux”. Te mostraré cómo lo he estado haciendo, lejos de ser un redux, porque redux ofrece muchas funcionalidades que no son tan triviales de implementar, como la capacidad de enviar acciones a cualquier reductor desde cualquier acción o combineReducers, etc. muchos otros.

Crea tu reductor

export const initialState = 
  ...
;

export const reducer = (state, action) => 
  ...
;

Cree su componente ContextProvider

export const AppContext = React.createContext(someDefaultValue)

export function ContextProvider(props) 

  const [state, dispatch] = useReducer(reducer, initialState)

  const context = 
    someValue: state.someValue,
    someOtherValue: state.someOtherValue,
    setSomeValue: input => dispatch('something'),
  

  return (
    
      props.children
    
  );

Use su ContextProvider en el nivel superior de su aplicación, o donde lo desee

function App(props) 
  ...
  return(
    
      ...
    
  )

Escribir componentes como componente funcional puro

De esta manera, solo se volverán a procesar cuando esas dependencias específicas se actualicen con nuevos valores.

const MyComponent = React.memo((
    somePropFromContext,
    setSomePropFromContext,
    otherPropFromContext, 
    someRegularPropNotFromContext,  
) => 
    ... // regular component logic
    return(
        ... // regular component return
    )
);

Tener una función para seleccionar accesorios del contexto (como mapa redux…)

function select()
  const  someValue, otherValue, setSomeValue  = useContext(AppContext);
  return 
    somePropFromContext: someValue,
    setSomePropFromContext: setSomeValue,
    otherPropFromContext: otherValue,
  

Escribir un HOC connectToContext

function connectToContext(WrappedComponent, select)
  return function(props)
    const selectors = select();
    return 
  

Ponlo todo junto

import connectToContext from ...
import AppContext from ...

const MyComponent = React.memo(...
  ...
)

function select()
  ...


export default connectToContext(MyComponent, select)

Uso



//inside MyComponent:
...
  

Demostración que hice en otra pregunta de StackOverflow

Demostración en codesandbox

El re-render evitado

MyComponent se volverá a representar solo si los accesorios específicos del contexto se actualizan con un nuevo valor; de lo contrario, permanecerá allí. El código dentro select se ejecutará cada vez que cualquier valor de las actualizaciones de contexto, pero no hace nada y es barato.

Otras soluciones

Sugiero revisar esto Evitar renderizaciones con React.memo y useContext hook.

Según tengo entendido, la API de contexto no está destinada a evitar volver a renderizar, sino que se parece más a Redux. Si desea evitar volver a renderizar, tal vez considere PureComponent o gancho de ciclo de vida shouldComponentUpdate.

Aquí hay un excelente enlace para mejorar el rendimiento, también puede aplicar lo mismo a la API de contexto

Reseñas y calificaciones

¡Haz clic para puntuar esta entrada!
(Votos: 2 Promedio: 3.5)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *