Reagire con Redux? E la questione del "contesto"?


91

Normalmente pubblico materiale relativo al codice su Stack, ma questa è più una domanda su quali sono i pensieri generali della comunità.

Sembra che ci siano molte persone che sostengono l'uso di Redux con React per gestire dati / stato, ma durante la lettura e l'apprendimento di entrambi mi sono imbattuto in qualcosa che non sembra proprio corretto.

Redux

In fondo a questa pagina: http://redux.js.org/docs/basics/UsageWithReact.html (Passing the Store) si consiglia di utilizzare la "magia" di React 'Context'.

Un'opzione sarebbe passarlo come sostegno a ogni componente del contenitore. Tuttavia diventa noioso, poiché devi cablare l'archiviazione anche attraverso i componenti di presentazione solo perché capita di eseguire il rendering di un contenitore in profondità nell'albero dei componenti.

L'opzione che consigliamo è quella di utilizzare uno speciale componente React Redux chiamato per rendere magicamente il negozio disponibile a tutti i componenti del contenitore ...

Reagire

Nella pagina React Context ( https://facebook.github.io/react/docs/context.html ) ha un avviso in alto:

Il contesto è una funzionalità avanzata e sperimentale. È probabile che l'API cambi nelle versioni future.

Quindi in basso:

Proprio come è meglio evitare le variabili globali quando si scrive codice chiaro, nella maggior parte dei casi dovresti evitare di usare il contesto ...

Non utilizzare il contesto per passare i dati del modello attraverso i componenti. Il threading dei dati attraverso l'albero in modo esplicito è molto più facile da capire ...

Così...

Redux consiglia di utilizzare la funzionalità React 'Context' piuttosto che passare il storelungo a ciascun componente tramite 'props'. Mentre React consiglia il contrario.

Inoltre, sembra che Dan Abramov (il creatore di Redux) ora lavori per Facebook (il creatore di React), solo per confondermi di più.

  • Sto leggendo tutto bene ..?
  • Qual è il consenso generale attuale su questo tema ..?

9
Ahh questa è una bella domanda, sono molto curioso di sentire anche i punti di vista degli altri! Ho un po 'paura che venga chiuso a causa dell'aspetto della discussione. Spero davvero che non lo sia.
mjohnsonengr

Risposte:


91

Il contesto è una funzionalità avanzata ed è soggetta a modifiche. In alcuni casi le sue comodità superano i suoi svantaggi, quindi alcune librerie come React Redux e React Router scelgono di fare affidamento su di esso nonostante la natura sperimentale.

La parte importante qui è la parola biblioteche . Se il contesto cambia il suo comportamento, noi autori di biblioteche dovremo adattarci . Tuttavia, fintanto che la libreria non ti chiede di utilizzare direttamente l'API di contesto, tu come utente non dovresti preoccuparti delle modifiche ad essa.

React Redux utilizza il contesto internamente ma non espone questo fatto nell'API pubblica. Quindi dovresti sentirti molto più sicuro usando il contesto tramite React Redux che direttamente perché se cambia, l'onere dell'aggiornamento del codice sarà su React Redux e non su te.

In definitiva, React Redux supporta ancora il passaggio sempre allo store come prop, quindi se vuoi evitare completamente il contesto, hai quella scelta. Tuttavia direi che questo è poco pratico.

TLDR: Evita di usare il contesto direttamente a meno che tu non sappia veramente cosa stai facendo. L'uso di una libreria che fa affidamento sul contesto internamente è relativamente sicuro.


1
Ben detto Dan. Il rischio è che se React rimuove del tutto il contesto in una versione futura, probabilmente richiederebbe una rielaborazione per aggiornare qualsiasi app Redux esistente. È improbabile che Redux sia in grado di proteggere gli utenti da un tale cambiamento. Dato che ora sei con Facebook, la buona notizia è che mi aspetto che avrai un sacco di preavviso se il contesto dovesse mai svanire.
Cory House

6
React non rimuoverà il contesto. Voglio dire, è tecnicamente possibile, ma l'intera ragione per cui esiste è perché numerosi prodotti all'interno di FB ne avevano bisogno. Quindi, a meno che non ci sia una soluzione equivalente, non andrà via. Ma la sua esatta API potrebbe cambiare ed è ciò da cui proteggiamo gli utenti.
Dan Abramov

5
Un'altra nota importante è che React prevede di utilizzare il contesto più che meno in futuro. Pensiamo che potrebbe rivelarsi utile per lo stile, le animazioni, la gestione dei gesti, ecc.
Dan Abramov,

È interessante notare tuttavia, quando si ottengono librerie di componenti React (ad esempio Material-ui), allora naturalmente non faranno parte del modello di stato dell'applicazione, ma sono ancora un albero di componenti React lo stesso, con gli stessi requisiti di mantenendo il proprio modello di stato e flusso di dati separato dall'applicazione "principale". Quindi stanno facendo uso della caratteristica del contesto come unico mezzo (per loro) per trasmettere i dati al loro bambino.
stephenwil

1
@DanAbramov e la nuova API di contesto? È ancora sconsigliato l'uso?
Stanislav Mayorov

5

Non conosco altri, ma preferisco usare il decoratore di connessione di react-redux per avvolgere i miei componenti in modo che solo gli oggetti di scena del negozio di cui ho bisogno vengano passati nel mio componente. Ciò giustifica l'uso del contesto in un certo senso perché non lo sto consumando (e so, di regola, qualsiasi codice di cui sono responsabile non lo consumerà).

Quando provo i miei componenti, provo il componente non avvolto. Poiché react-redux ha superato solo gli oggetti di scena di cui avevo bisogno su quel componente, ora so esattamente di quali oggetti ho bisogno quando scrivo i test.

Suppongo che il punto sia che non vedo mai la parola contesto nel mio codice, non la consumo, quindi in una certa misura non mi influenza! Questo non dice nulla sull'avvertimento "sperimentale" di Facebook .. Se il contesto scomparisse, sarei fregato come tutti gli altri fino a quando Redux non fosse aggiornato.


Interessante ... Capisco cosa intendi riguardo all'uso di "Reagire-Redux" Providere connectastrarre tutto il materiale relativo al contesto. Immagino che con Dan Abramov ora in FB ti aspetteresti che se Context cambiasse Redux e "react-redux" sarebbe stato aggiornato ... Ma non ci sono garanzie, e l'avvertimento "sperimentale" di FB è ancora visibile a tutti.
Stephen, lo scorso

Sicuramente spero che se FB non mantiene il redux nel ciclo nel caso in cui succeda qualcosa al contesto, un collaboratore open source da qualche parte più familiare con il redux lo farà; se no, lo scoprirò e lo farò da solo!
mjohnsonengr

Ho chiesto a Dan i suoi pensieri tramite Twitter ... Bella risposta, sulla stessa linea ... Usa la libreria che usa Context, non usarla direttamente.
Stephen, lo scorso

1

C'è un modulo npm che rende davvero facile aggiungere redux al contesto di react

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>
    );
  }
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.