¿Reaccionar con Redux? ¿Qué pasa con la cuestión del "contexto"?

90

Normalmente publico cosas relacionadas con el código en Stack, pero esta es más una pregunta sobre cuáles son los pensamientos generales de la comunidad.

Parece que hay mucha gente que defiende el uso de Redux con React para administrar datos / estado, pero mientras leía y aprendía ambos, me encontré con algo que no parece correcto.

Redux

En la parte inferior de esta página: http://redux.js.org/docs/basics/UsageWithReact.html (Pasando la tienda) recomienda usar la "Magia" de React 'Context'.

Una opción sería pasarlo como un accesorio a cada componente del contenedor. Sin embargo, se vuelve tedioso, ya que tiene que almacenar cables incluso a través de componentes de presentación solo porque representan un contenedor en lo profundo del árbol de componentes.

La opción que recomendamos es usar un componente especial de React Redux llamado para hacer que la tienda esté disponible mágicamente para todos los componentes del contenedor ...

Reaccionar

En la página React Context ( https://facebook.github.io/react/docs/context.html ) tiene una advertencia en la parte superior:

El contexto es una característica avanzada y experimental. Es probable que la API cambie en futuras versiones.

Luego en la parte inferior:

Así como es mejor evitar las variables globales al escribir código claro, debe evitar el uso de contexto en la mayoría de los casos ...

No utilice el contexto para pasar los datos de su modelo a través de componentes. Pasar sus datos a través del árbol de forma explícita es mucho más fácil de entender ...

Entonces...

Redux recomienda usar la función React 'Context' en lugar de pasarla storea cada componente a través de 'props'. Mientras que React recomienda lo contrario.

Además, parece que Dan Abramov (el creador de Redux) ahora trabaja para Facebook (el creador de React), solo para confundirme más.

  • ¿Estoy leyendo todo esto bien ...?
  • ¿Cuál es el consenso general actual sobre este tema ...?
Stephen Last
fuente
8
Ahh, esta es una gran pregunta, ¡tengo mucha curiosidad por escuchar los puntos de vista de los demás también! Me temo que se cerrará debido al aspecto de la discusión. Realmente espero que no sea así.
mjohnsonengr

Respuestas:

90

El contexto es una función avanzada y está sujeta a cambios. En algunos casos, sus comodidades superan sus desventajas, por lo que algunas bibliotecas como React Redux y React Router eligen confiar en él a pesar de la naturaleza experimental.

La parte importante aquí son las bibliotecas de palabras . Si el contexto cambia su comportamiento, nosotros , como autores de bibliotecas, tendremos que ajustarnos . Sin embargo, siempre que la biblioteca no le pida que use directamente la API de contexto, usted, como usuario, no debería tener que preocuparse por los cambios.

React Redux usa el contexto internamente, pero no expone este hecho en la API pública. Por lo tanto, debería sentirse mucho más seguro usando el contexto a través de React Redux que directamente porque si cambia, la carga de actualizar el código estará en React Redux y no en usted.

En última instancia, React Redux todavía admite siempre pasar store como un accesorio, por lo que si desea evitar por completo el contexto, tiene esa opción. Sin embargo, diría que esto no es práctico.

TLDR: Evite usar el contexto directamente a menos que realmente sepa lo que está haciendo. Usar una biblioteca que depende del contexto internamente es relativamente seguro.

Dan Abramov
fuente
1
Bien dicho Dan. El riesgo es que si React elimina el contexto por completo en una versión futura, es probable que sea necesario volver a trabajar para actualizar cualquier aplicación Redux existente. Es poco probable que Redux pueda proteger a los usuarios de tal cambio. Dado que ahora está en Facebook, la buena noticia es que espero que reciba un aviso con mucha anticipación si el contexto desaparece.
Cory House
6
React no eliminará el contexto. Quiero decir, es técnicamente posible, pero la única razón por la que existe es porque numerosos productos dentro de FB lo necesitaban. Entonces, a menos que haya una solución equivalente, no desaparecerá. Pero su API exacta puede cambiar, que es de lo que protegemos a los usuarios.
Dan Abramov
5
Otra nota importante es que React planea usar el contexto más en lugar de menos en el futuro. Creemos que podría resultar útil para el estilo, las animaciones, el manejo de gestos, etc.
Dan Abramov
Sin embargo, es interesante notar que cuando obtienes bibliotecas de componentes React (por ejemplo, Material-ui), naturalmente no formarán parte del modelo de estado de tu aplicación, pero seguirán siendo un árbol de componentes React de todos modos, con los mismos requisitos de manteniendo su propio modelo de estado y flujo de datos separados de la aplicación "principal". Por lo tanto, están haciendo uso de la función de contexto como el único medio (para ellos) de transmitir datos a su jerarquía infantil.
Stephenwil
1
@DanAbramov ¿qué pasa con la nueva API de contexto? ¿Todavía no se recomienda su uso?
Stanislav Mayorov
4

No sé sobre otros, pero prefiero usar el decorador de conexión de react-redux para envolver mis componentes de modo que solo los accesorios de la tienda que necesito se pasen a mi componente. Esto justifica el uso del contexto en cierto sentido porque no lo estoy consumiendo (y sé, por regla general, que cualquier código del que esté a cargo no lo consumirá).

Cuando pruebo mis componentes, pruebo el componente no empaquetado. Debido a que react-redux solo pasó los accesorios que necesitaba en ese componente, ahora sé exactamente qué accesorios necesito cuando estoy escribiendo las pruebas.

Supongo que el punto es que nunca veo la palabra contexto en mi código, no la consumo, así que hasta cierto punto, ¡no me afecta! Esto no dice nada sobre la advertencia "experimental" de Facebook. Si el contexto desapareciera, estaría tan jodido como todos los demás hasta que Redux fuera actualizado.

mjohnsonengr
fuente
Interesante ... Veo lo que quieres decir con 'react-redux' usando Providery connectabstraer todas las cosas del contexto. Supongo que con Dan Abramov ahora en FB, esperarías que si Context cambiara Redux y 'react-redux' se actualizaría ... Pero no hay garantías, y la advertencia "experimental" de FB todavía está ahí para que todos la vean.
Stephen Last
Ciertamente tengo la esperanza de que si FB no mantiene react-redux en el bucle en caso de que algo suceda con el contexto, un colaborador de código abierto en algún lugar más familiarizado con redux que yo; si no, lo resolveré y lo haré yo mismo.
mjohnsonengr
Le pregunté a Dan por sus pensamientos a través de Twitter ... Buena respuesta, en la misma línea ... Use la biblioteca que usa Context, no la use directamente.
Stephen Last
1

Hay un módulo npm que hace que sea realmente fácil agregar redux al contexto de reacción

https://github.com/jamrizzi/redux-context-provider

https://www.npmjs.com/package/redux-context-provider

import React, { Component } from 'react';
import ReduxContextProvider from 'redux-context-provider';
import createStore from './createStore';
import actions from './actions';
import Routes from './routes';

export default class App extends Component {
  render() {
    return (
      <ReduxContextProvider store={store} actions={actions}>
        <Routes />
      </ReduxContextProvider>
    );
  }
}
Jam Risser
fuente