Qual'è la differenza tra state e props in React?


559

Stavo guardando un corso Pluralsight su React e l'istruttore ha affermato che gli oggetti di scena non dovrebbero essere cambiati. Ora sto leggendo un articolo (uberVU / reazioni-guida) su oggetti di scena e stato e dice

Sia i puntelli che i cambiamenti di stato attivano un aggiornamento del rendering.

Più avanti nell'articolo dice:

I puntelli (abbreviazione di proprietà) sono la configurazione di un componente, se possibile le sue opzioni. Sono ricevuti dall'alto e immutabili.

  • Quindi gli oggetti di scena possono cambiare ma dovrebbero essere immutabili?
  • Quando dovresti usare gli oggetti di scena e quando dovresti usare lo stato?
  • Se disponi di dati di cui un componente React necessita, dovrebbe essere passato attraverso oggetti di scena o setup nel componente React tramite getInitialState?


7
questa è un'ottima domanda, in realtà nessuno sembra dare una risposta semplice: /
Thomas Decaux,

Risposte:


670

Puntelli e stato sono correlati. Lo stato di un componente diventerà spesso il sostegno di un componente figlio. I puntelli vengono passati al figlio all'interno del metodo di rendering del genitore come secondo argomento React.createElement()o, se si utilizza JSX, gli attributi di tag più familiari.

<MyChild name={this.state.childsName} />

Il valore dello stato del genitore di childsName diventa diventa il bambino this.props.name. Dal punto di vista del bambino, il nome prop è immutabile. Se deve essere modificato, il genitore dovrebbe semplicemente cambiare il suo stato interno:

this.setState({ childsName: 'New name' });

e React lo propagherà al bambino per te. Una domanda naturale di follow-on è: cosa succede se il bambino deve cambiare il suo nome prop? Questo di solito viene fatto attraverso eventi figlio e richiamate dei genitori. Il bambino potrebbe esporre un evento chiamato, ad esempio onNameChanged,. Il genitore si iscriverebbe quindi all'evento passando un gestore di callback.

<MyChild name={this.state.childsName} onNameChanged={this.handleName} />

Il figlio passerebbe il suo nuovo nome richiesto come argomento al callback dell'evento chiamando, ad esempio this.props.onNameChanged('New name'), e il genitore userebbe il nome nel gestore dell'evento per aggiornare il suo stato.

handleName: function(newName) {
   this.setState({ childsName: newName });
}

2
Grazie! Quindi un altro paio di domande: 1. perché la gente dice che gli oggetti di scena non dovrebbero cambiare? 2. dove metti i tuoi bootstrap dei dati? Nell'inizializzazione del componente come getInitialState o lo metti fuori dal componente e lo rendi disponibile quando sono disponibili i dati?
skaterdav85,

38
1. Questo è l'aspetto "funzionale" di React. Tutti i dati (quasi) scorrono verso il basso. Poiché il prop è di proprietà del genitore, solo il genitore dovrebbe cambiarlo. Idealmente, i bambini dovrebbero essere apolidi. In pratica ciò non è possibile (consultare la documentazione dei moduli sul sito di React). 2. Puoi alimentarlo nella parte superiore, che è una pratica consigliata, oppure puoi memorizzarlo in oggetti separati. Un approccio popolare è Flux, che utilizza oggetti singleton chiamati Stores. Questo fa parte di un modello architettonico più ampio. È anche open source da Facebook e progettato per funzionare con React.
Todd,

2
quindi i negozi sono proprio come grandi variabili globali?
SuperUberDuper

3
Sì, i negozi Flux sono cache lato client. Ci sono anche altri modelli come il Relay rilasciato di recente, da Facebook e Redux.
Todd,

6
Per ridurlo un po ': lo stato sono i dati dei componenti gestiti dall'interno, gli oggetti di scena sono i dati dei componenti gestiti dall'alto e passati.
Segna il

222

Per la comunicazione genitore-figlio, passa semplicemente oggetti di scena.

Usa lo stato per memorizzare i dati necessari per la tua pagina corrente nella vista del controller.

Usa gli oggetti di scena per trasferire i gestori di dati ed eventi ai componenti secondari.

Questi elenchi dovrebbero aiutarti a lavorare con i dati nei tuoi componenti.

puntelli

  • sono immutabili
    • che consente a React di eseguire controlli di riferimento rapidi
  • vengono utilizzati per trasferire i dati dal controller di visualizzazione
    • il tuo componente di primo livello
  • avere prestazioni migliori
    • usalo per passare i dati ai componenti figlio

Stato

  • dovrebbe essere gestito nel tuo controller di visualizzazione
    • il tuo componente di primo livello
  • è mutevole
  • ha prestazioni peggiori
  • non accedere ai componenti figlio
    • passalo invece con oggetti di scena

Per la comunicazione tra due componenti che non hanno una relazione genitore-figlio, è possibile impostare il proprio sistema di eventi globale. Iscriviti agli eventi in componentDidMount (), annulla l'iscrizione in componentWillUnmount () e chiama setState () quando ricevi un evento. Il modello di flusso è uno dei modi possibili per organizzarlo. - https://facebook.github.io/react/tips/communicate-between-components.html

Quali componenti dovrebbero avere lo stato?

La maggior parte dei componenti dovrebbe semplicemente prendere alcuni dati dagli oggetti di scena e renderli. Tuttavia, a volte è necessario rispondere all'input dell'utente, a una richiesta del server o al passare del tempo. Per questo usi lo stato.

Cerca di mantenere quanti più componenti possibile senza stato . In questo modo isolerai lo stato nella sua posizione più logica e ridurrai al minimo la ridondanza, semplificando il ragionamento sulla tua applicazione.

Un modello comune è quello di creare diversi componenti apolidi che semplicemente eseguono il rendering dei dati e hanno un componente stateful sopra di loro nella gerarchia che passa il suo stato ai propri figli tramite oggetti di scena. Il componente stateful racchiude tutta la logica di interazione, mentre i componenti senza stato si occupano del rendering dei dati in modo dichiarativo. - https://facebook.github.io/react/docs/interactivity-and-dynamic-uis.html#what-components-should-have-state

Cosa dovrebbe andare nello stato?

Lo stato deve contenere dati che i gestori di eventi di un componente possono modificare per attivare un aggiornamento dell'interfaccia utente. Nelle app reali questi dati tendono ad essere molto piccoli e serializzabili con JSON. Quando costruisci un componente stateful, pensa alla minima rappresentazione possibile del suo stato e archivia solo quelle proprietà in this.state. All'interno di render () è sufficiente calcolare qualsiasi altra informazione necessaria in base a questo stato. Scoprirai che pensare e scrivere applicazioni in questo modo tende a portare all'applicazione più corretta, poiché l'aggiunta di valori ridondanti o calcolati per dichiarare significa che è necessario mantenerli esplicitamente sincronizzati anziché fare affidamento su React che li calcola per te. - https://facebook.github.io/react/docs/interactivity-and-dynamic-uis.html#what-should-go-in-state


2
non sono d'accordo, andare tutti gli oggetti di scena è in realtà meno performante per trasmettere i dati. Basta impostare il negozio per i componenti figlio, quindi non devi fare i conti con un casino di oggetti di scena e quando gli oggetti di scena cambiano devi aggiornare i tuoi componenti. Basta aggiornare il tuo negozio e lasciare che il componente ottenga i suoi dati dal suo negozio.
Positivo

Puoi dirmi perché gli oggetti di scena sono più performanti degli stati. Grazie.
hqt

@hqt Penso che sia immutabile, il confronto interno per cambiare i valori è più veloce
Gaspar,

@BentOnCoding, buona giornata, per favore, puoi aiutarmi. Posso immaginare uno stato del genere Ogni volta che ci sono dati che cambieranno all'interno di un componente su INTERAZIONE UTENTE, è qui che viene utilizzato lo stato?
Dickens,

72

Puoi capirlo meglio collegandolo alle funzioni Plain JS.

In poche parole,

Stato è lo stato locale del componente a cui non è possibile accedere e modificare al di fuori del componente. È equivalente alle variabili locali in una funzione.

Semplice funzione JS

const DummyFunction = () => {
  let name = 'Manoj';
  console.log(`Hey ${name}`)
}

Componente di reazione

class DummyComponent extends React.Component {
  state = {
    name: 'Manoj'
  }
  render() {
    return <div>Hello {this.state.name}</div>;
  }

I puntelli , d'altra parte, rendono i componenti riutilizzabili dando ai componenti la possibilità di ricevere dati dal loro componente genitore sotto forma di oggetti di scena. Sono equivalenti ai parametri di funzione.

Semplice funzione JS

const DummyFunction = (name) => {
  console.log(`Hey ${name}`)
}

// when using the function
DummyFunction('Manoj');
DummyFunction('Ajay');

Componente di reazione

class DummyComponent extends React.Component {
  render() {
    return <div>Hello {this.props.name}</div>;
  }

}

// when using the component
<DummyComponent name="Manoj" />
<DummyComponent name="Ajay" />

Crediti: Manoj Singh Negi

Link all'articolo: React State vs Props spiegato


16
Questa è in realtà una risposta molto utile. Dopo aver letto questo, posso quindi capire le risposte più complete. Grazie.
Aaron,

1
Componente React = semplice funzione JS è un modo geniale per spiegarlo chiaramente. E con React che si sposta sempre più verso componenti funzionali, questo sta diventando sempre più letteralmente il caso.
JD Sandifer,

1
migliore spiegazione che ho letto, grazie
iWizard

48

Il riassunto dello stato contro gli oggetti di scena che mi piace di più è qui: reagire-guida . Di seguito è una versione modificata di quella pagina:


oggetti di scena vs stato

tl; dr Se un Componente deve modificare uno dei suoi attributi in un determinato momento, tale attributo dovrebbe far parte del suo stato, altrimenti dovrebbe essere solo un supporto per quel Componente.


oggetti di scena

I puntelli (abbreviazione di proprietà) sono una configurazione di un componente. Sono ricevuti dall'alto e immutabili per quanto riguarda il Componente che li riceve. Un componente non può cambiare i suoi oggetti di scena, ma è responsabile di mettere insieme gli oggetti di scena dei suoi componenti figlio. I puntelli non devono essere solo dati - le funzioni di callback possono essere passate come oggetti di scena.

stato

Lo stato è una struttura di dati che inizia con un valore predefinito quando viene montato un componente. Può essere mutato nel tempo, principalmente a causa di eventi dell'utente.

Un componente gestisce internamente il proprio stato. Oltre a stabilire uno stato iniziale, non ha nulla a che fare con lo stato dei suoi figli. È possibile concettualizzare lo stato come privato per quel componente.

Cambio di oggetti di scena e stato

                                                   stato degli oggetti di scena
    È possibile ottenere il valore iniziale dal componente principale? si si
    Può essere modificato dal componente principale? si No
    È possibile impostare i valori predefiniti all'interno del componente? * Sì Sì
    Può cambiare all'interno del componente? No sì
    È possibile impostare il valore iniziale per i componenti figlio? si si
    Può cambiare in Componenti figlio? si No
  • Si noti che sia i puntelli che i valori iniziali di stato ricevuti dai genitori sovrascrivono i valori predefiniti definiti all'interno di un componente.

Questo componente dovrebbe avere stato?

Lo stato è facoltativo. Poiché lo stato aumenta la complessità e riduce la prevedibilità, è preferibile un componente senza stato. Anche se chiaramente non puoi fare a meno dello stato in un'app interattiva, dovresti evitare di avere troppi componenti Stateful.

Tipi di componenti

Componente stateless Solo puntelli, nessuno stato. Non c'è molto altro oltre alla funzione render (). La loro logica ruota attorno agli oggetti di scena che ricevono. Questo li rende molto facili da seguire e da testare.

Componente con stato Sia puntelli che stato. Vengono utilizzati quando il componente deve conservare un certo stato. Questo è un buon posto per la comunicazione client-server (XHR, socket Web, ecc.), L'elaborazione dei dati e la risposta agli eventi dell'utente. Questo tipo di logistica dovrebbe essere incapsulato in un numero moderato di componenti stateful, mentre tutta la logica di visualizzazione e formattazione dovrebbe spostarsi a valle in molti componenti stateless.

fonti


1
cosa intendi con "indica il valore iniziale ricevuto dal genitore"? Per quanto ne so, lo stato è definito solo nell'ambito di un singolo componente e non può essere modificato direttamente dall'esterno.
Maxim Kuzmin,

@MaximKuzmin Credo che sia un riferimento al modello comune di prendere un oggetto come 'initialColor' per inizializzare uno stato come 'color'. Inizialmente allo stato viene dato il valore dal prop (ricevuto dal genitore) e successivamente continua a comportarsi come uno stato normale. Potrebbe essere un po 'confuso includerlo in un'introduzione allo stato rispetto agli oggetti di scena, ma è un modello importante da sapere.
JD Sandifer,

18

props (abbreviazione di "proprietà") e state sono entrambi semplici oggetti JavaScript. Mentre entrambi contengono informazioni che influenzano l'output del rendering, sono diversi in un modo importante: gli oggetti di scena vengono passati al componente (simile ai parametri della funzione) mentre lo stato viene gestito all'interno del componente (simile alle variabili dichiarate all'interno di una funzione).

Quindi semplicemente lo stato è limitato al tuo componente corrente ma i puntelli possono essere passati a qualsiasi componente tu desideri ... Puoi passare lo stato del componente corrente come prop ad altri componenti ...

Anche in React, abbiamo componenti apolidi che hanno solo oggetti di scena e non stato interno ...

L'esempio seguente mostra come funzionano nella tua app:

Parent (componente pieno di stato):

class SuperClock extends React.Component {

  constructor(props) {
    super(props);
    this.state = {name: "Alireza", date: new Date().toLocaleTimeString()};
  }

  render() {
    return (
      <div>
        <Clock name={this.state.name} date={this.state.date} />
      </div>
    );
  }
}

Figlio (componente senza stato):

const Clock = ({name}, {date}) => (
    <div>
      <h1>{`Hi ${name}`}.</h1>
      <h2>{`It is ${date}`}.</h2>
    </div>
);

11

La differenza chiave tra gli oggetti di scena e lo stato è che lo stato è interno e controllato dal componente stesso mentre gli oggetti di scena sono esterni e controllati da tutto ciò che rende il componente.

function A(props) {
  return <h1>{props.message}</h1>
}

render(<A message=”hello />,document.getElementById(“root”));


class A extends React.Component{  
  constructor(props) {  
    super(props)  
    this.state={data:"Sample Data"}  
  }  
  render() {
    return(<h2>Class State data: {this.state.data}</h2>)  
  } 
}

render(<A />, document.getElementById("root"));

State VS Props

  • Lo stato può essere modificato (mutabile)
  • Mentre i Puntelli non possono (Immutabili)

7

Fondamentalmente, la differenza è che lo stato è qualcosa di simile agli attributi in OOP : è qualcosa di locale in una classe (componente), usato per descriverlo meglio. I puntelli sono come parametri : vengono passati a un componente dal chiamante di un componente (il genitore): come se si chiamasse una funzione con determinati parametri.


5

Sia lo stato che i puntelli in reazione sono usati per controllare i dati in un componente, generalmente i puntelli sono impostati dal genitore e passati ai componenti figlio e sono riparati in tutto il componente. Per i dati che stanno per cambiare, dobbiamo usare lo stato. E gli oggetti di scena sono immutabili mentre gli stati sono mutabili , se vuoi cambiare oggetti di scena puoi farlo dal componente padre e poi passarlo ai componenti figlio.


4

come ho imparato lavorando con reagire.

  • puntelli sono utilizzati da un componente per ottenere dati da esterno ovvero un altro componente (puro, funzionale o classe) o di una classe generale o JavaScript / dattiloscritto codice

  • gli stati vengono utilizzati per gestire l'ambiente interno di un componente significa che i dati cambiano all'interno del componente


3

Props: Props non è altro che proprietà del componente e reagire al componente non è altro che una funzione javascript.

  class Welcome extends React.Component {
    render() {
      return <h1>Hello {this.props.name}</h1>;
    }
  }

elemento const =;

qui <Welcome name="Sara" />passando un oggetto {name: 'Sara'} come oggetti di scena del componente Welcome. Per passare i dati da un componente genitore al componente figlio usiamo i puntelli. I puntelli sono immutabili. Durante il ciclo di vita di un componente gli oggetti di scena non dovrebbero cambiare (considerali immutabili).

Stato: lo stato è accessibile solo all'interno del componente. Per tenere traccia dei dati all'interno del componente utilizziamo state. possiamo cambiare stato da setState. Se dobbiamo passare dallo stato al bambino, dobbiamo passarlo come oggetti di scena.

class Button extends React.Component {
  constructor() {
    super();
    this.state = {
      count: 0,
    };
  }

  updateCount() {
    this.setState((prevState, props) => {
      return { count: prevState.count + 1 }
    });
  }

  render() {
    return (<button
              onClick={() => this.updateCount()}
            >
              Clicked {this.state.count} times
            </button>);
  }
}

3

Stato:

  1. gli stati sono mutabili.
  2. gli stati sono associati ai singoli componenti non possono essere utilizzati da altri componenti.
  3. gli stati vengono inizializzati sul montaggio dei componenti.
  4. gli stati vengono utilizzati per il rendering delle modifiche dinamiche all'interno del componente.

oggetti di scena:

  1. gli oggetti di scena sono immutabili.
  2. puoi passare oggetti di scena tra i componenti.
  3. gli oggetti di scena sono usati principalmente per comunicare tra i componenti. Puoi passare direttamente da genitore a figlio. Per passare da figlio a genitore devi usare il concetto di alzare gli stati.

class Parent extends React.Component{
  render()
  {
     return(
        <div>
            <Child name = {"ron"}/>
        </div>
      );
  }
}

class Child extends React.Component{
{
    render(){
      return(
         <div>
              {this.props.name}
        </div>
      );
     }
}


{"message": "Sintassi non rilevataErrore: token imprevisto <", "nomefile": " stacksnippets.net/js ", "lineno": 17, "colno": 9}
Niko Jojo

2

Fondamentalmente, oggetti di scena e stato sono due modi in cui il componente può sapere cosa e come renderizzare. Quale parte dello stato dell'applicazione appartiene allo stato e quale a un archivio di livello superiore, è più correlato al design dell'app, piuttosto che al modo in cui React funziona. Il modo più semplice per decidere, IMO, è di pensare se questo particolare dato è utile per l'applicazione nel suo insieme o se si tratta di alcune informazioni locali. Inoltre, è importante non duplicare lo stato, quindi se alcuni dati possono essere calcolati dai puntelli, dovrebbero essere calcolati dai puntelli.

Ad esempio, supponiamo che tu abbia un controllo a discesa (che avvolge la selezione HTML standard per lo stile personalizzato), che può a) selezionare un valore dall'elenco eb) essere aperto o chiuso (cioè l'elenco delle opzioni visualizzato o nascosto). Supponiamo ora che la tua app visualizzi un elenco di elementi di qualche tipo e che i controlli dei menu a discesa filtrino le voci dell'elenco. Quindi, sarebbe meglio passare il valore del filtro attivo come prop e mantenere lo stato aperto / chiuso locale. Inoltre, per renderlo funzionale, passeresti un gestore onChange dal componente genitore, che sarebbe chiamato all'interno dell'elemento a discesa e invierebbe immediatamente informazioni aggiornate (nuovo filtro selezionato) al negozio. D'altra parte, lo stato aperto / chiuso può essere mantenuto all'interno del componente a discesa, perché al resto dell'applicazione non importa davvero se il controllo è aperto, fino a quando l'utente non ne modifica il valore.

Il seguente codice non funziona completamente, ha bisogno di css e gestione degli eventi click / blur / change a discesa, ma volevo mantenere un esempio minimo. Spero che aiuti a capire la differenza.

const _store = {
    items: [
    { id: 1, label: 'One' },
    { id: 2, label: 'Two' },
    { id: 3, label: 'Three', new: true },
    { id: 4, label: 'Four', new: true },
    { id: 5, label: 'Five', important: true },
    { id: 6, label: 'Six' },
    { id: 7, label: 'Seven', important: true },
    ],
  activeFilter: 'important',
  possibleFilters: [
    { key: 'all', label: 'All' },
    { key: 'new', label: 'New' },
    { key: 'important', label: 'Important' }
  ]
}

function getFilteredItems(items, filter) {
    switch (filter) {
    case 'all':
        return items;

    case 'new':
        return items.filter(function(item) { return Boolean(item.new); });

    case 'important':
        return items.filter(function(item) { return Boolean(item.important); });

    default:
        return items;
  }
}

const App = React.createClass({
  render: function() {
    return (
            <div>
            My list:

            <ItemList   items={this.props.listItems} />
          <div>
            <Dropdown 
              onFilterChange={function(e) {
                _store.activeFilter = e.currentTarget.value;
                console.log(_store); // in real life, some action would be dispatched here
              }}
              filterOptions={this.props.filterOptions}
              value={this.props.activeFilter}
              />
          </div>
        </div>
      );
  }
});

const ItemList = React.createClass({
  render: function() {
    return (
      <div>
        {this.props.items.map(function(item) {
          return <div key={item.id}>{item.id}: {item.label}</div>;
        })}
      </div>
    );
  }
});

const Dropdown = React.createClass({
    getInitialState: function() {
    return {
        isOpen: false
    };
  },

  render: function() {
    return (
        <div>
            <select 
            className="hidden-select" 
          onChange={this.props.onFilterChange}
          value={this.props.value}>
            {this.props.filterOptions.map(function(option) {
            return <option value={option.key} key={option.key}>{option.label}</option>
          })}
        </select>

        <div className={'custom-select' + (this.state.isOpen ? ' open' : '')} onClick={this.onClick}>
            <div className="selected-value">{this.props.activeFilter}</div>
          {this.props.filterOptions.map(function(option) {
            return <div data-value={option.key} key={option.key}>{option.label}</div>
          })}
        </div>
      </div>
    );
  },

  onClick: function(e) {
    this.setState({
        isOpen: !this.state.isOpen
    });
  }
});

ReactDOM.render(
  <App 
    listItems={getFilteredItems(_store.items, _store.activeFilter)} 
    filterOptions={_store.possibleFilters}
    activeFilter={_store.activeFilter}
    />,
  document.getElementById('root')
);

2

Lo stato è il modo in cui reagisce alle informazioni detenute dal componente.

Supponiamo che tu abbia un componente che deve recuperare alcuni dati dal server. Di solito si desidera informare l'utente se la richiesta è in elaborazione, se ha avuto esito negativo, ecc. Questa è un'informazione che è rilevante solo per quel componente specifico. È qui che entra in gioco lo stato.

Di solito il modo migliore per definire lo stato è il seguente:

class MyComponent extends React.Component {
  constructor() {
    super();
    this.state = { key1: value1, key2: value2 }    
  }
}

ma nelle implementazioni latest di reazioni native puoi semplicemente fare:

class MyComponent extends React.Component {
  state = { key1: value1, key2: value2 }    
}

Questi due esempi vengono eseguiti esattamente allo stesso modo, è solo un miglioramento della sintassi.

Quindi, cosa differisce dal solo usare gli attributi degli oggetti come abbiamo sempre nella programmazione OO? Di solito, le informazioni contenute nel tuo stato non sono pensate per essere statiche, cambieranno nel tempo e la tua Vista dovrà aggiornarsi per riflettere queste modifiche. State offre questa funzionalità in modo semplice.

Lo stato deve essere immutabile! e non posso sottolineare abbastanza questo. Cosa significa questo? Significa che non dovresti MAI fare qualcosa del genere.

 state.key2 = newValue;

Il modo corretto di farlo è:

this.setState({ key2: newValue });

Usando this.setState il componente esegue il ciclo di aggiornamento e se una parte dello stato cambia, il metodo di rendering del componente verrà richiamato nuovamente per riflettere queste modifiche.

Controlla i documenti di reazione per una spiegazione ancora più estesa: https://facebook.github.io/react/docs/state-and-lifecycle.html


2

I puntelli sono semplicemente una scorciatoia per le proprietà. I puntelli sono il modo in cui i componenti parlano tra loro. Se hai familiarità con React, dovresti sapere che i puntelli scorrono verso il basso dal componente genitore.

C'è anche il caso in cui puoi avere oggetti di scena predefiniti in modo che gli oggetti di scena siano impostati anche se un componente genitore non passa oggetti di scena.

Questo è il motivo per cui le persone si riferiscono a React come flusso di dati unidirezionale. Questo richiede un po 'di distrazione e probabilmente ne parlerò più avanti, ma per ora ricorda solo: i dati fluiscono da genitore a figlio. I puntelli sono immutabili (parola di fantasia per non cambiare)

Quindi siamo felici. I componenti ricevono i dati dal padre. Tutti ordinati, giusto?

Bene, non proprio. Cosa succede quando un componente riceve dati da qualcuno diverso dal genitore? Cosa succede se l'utente immette i dati direttamente al componente?

Bene, questo è il motivo per cui abbiamo stato.

STATO

I puntelli non dovrebbero cambiare, quindi procedi. Normalmente i componenti non hanno stato e quindi sono indicati come apolidi. Un componente che utilizza state è noto come stateful. Sentiti libero di gettare quel piccolo bocconcino alle feste e guardare le persone che si allontanano da te.

Quindi lo stato viene utilizzato in modo che un componente possa tenere traccia delle informazioni tra tutti i rendering che lo fa. Quando setState aggiorna l'oggetto stato e quindi esegue nuovamente il rendering del componente. È fantastico perché significa che React si prende cura del duro lavoro ed è incredibilmente veloce.

Come piccolo esempio di stato, ecco uno snippet da una barra di ricerca (vale la pena dare un'occhiata a questo corso se vuoi saperne di più su React)

Class SearchBar extends Component {
 constructor(props) {
  super(props);
this.state = { term: '' };
 }
render() {
  return (
   <div className="search-bar">
   <input 
   value={this.state.term}
   onChange={event => this.onInputChange(event.target.value)} />
   </div>
   );
 }
onInputChange(term) {
  this.setState({term});
  this.props.onSearchTermChange(term);
 }
}

SOMMARIO

Props e State fanno cose simili ma sono usate in diversi modi. La maggior parte dei componenti sarà probabilmente senza stato.

I puntelli vengono utilizzati per trasferire i dati da padre a figlio o dal componente stesso. Sono immutabili e quindi non saranno cambiati.

Lo stato viene utilizzato per i dati modificabili o i dati che cambieranno. Ciò è particolarmente utile per l'input dell'utente. Pensa ad esempio alle barre di ricerca. L'utente digiterà i dati e questo aggiornerà ciò che vedono.


2

In breve.

i valori degli oggetti di scena non possono essere cambiati [immutabile]

i valori di stato possono essere cambiati, usando il metodo setState [mutabile]


1

stato : è una proprietà mutabile speciale che contiene i dati di un componente. ha un valore predefinito quando viene montato il componente.

oggetti di scena - È una proprietà speciale che è immutabile per natura e utilizzata in caso di passaggio di valore da genitore a figlio. gli oggetti di scena sono solo un canale di comunicazione tra i componenti, che si spostano sempre dall'alto (padre) al culo (bambino).

di seguito sono riportati un esempio completo di combinazione di stato e oggetti di scena: -

<!DOCTYPE html>
    <html>
      <head>
        <meta charset="UTF-8" />
        <title>state&props example</title>

        <script src="https://unpkg.com/react@0.14.8/dist/react.min.js"></script>
        <script src="https://unpkg.com/react-dom@0.14.8/dist/react-dom.min.js"></script>
        <script src="https://unpkg.com/babel-standalone@6.15.0/babel.min.js"></script>

      </head>
      <body>
      <div id="root"></div>
        <script type="text/babel">

            var TodoList = React.createClass({
                render(){
                    return <div className='tacos-list'>
                                {
                                    this.props.list.map( ( todo, index ) => {
                                    return <p key={ `taco-${ index }` }>{ todo }</p>;
                            })}
                            </div>;
                }
            });

            var Todo = React.createClass({
                getInitialState(){
                    return {
                        list : [ 'Banana', 'Apple', 'Beans' ]       
                    }
                },
                handleReverse(){
                    this.setState({list : this.state.list.reverse()});
                },
                render(){
                    return <div className='parent-component'>
                              <h3 onClick={this.handleReverse}>List of todo:</h3>
                              <TodoList list={ this.state.list }  />
                           </div>;
                }
            });

            ReactDOM.render(
                <Todo/>,
                document.getElementById('root')
            );

        </script>
      </body>
      </html>

1

In generale, lo stato di un componente (genitore) è prop per il componente figlio.

  1. Lo stato risiede all'interno di un componente in cui i puntelli vengono passati da padre a figlio.
  2. I puntelli sono generalmente immutabili.

    class Parent extends React.Component {
        constructor() {
            super();
            this.state = {
                name : "John",
            }
        }
        render() {
            return (
                <Child name={this.state.name}>
            )
        }
    }
    
    class Child extends React.Component {
        constructor() {
            super();
        }
    
        render() {
            return(
                {this.props.name} 
            )
        }
    }

Nel codice sopra, abbiamo una classe parent (Parent) che ha il nome come stato che viene passato al componente child (classe Child) come prop e il componente child lo rende usando {this.props.name}


1

Alcuni dati vengono immessi dagli utenti da qualche parte nell'applicazione.

  1. il componente in cui vengono immessi i dati dovrebbe avere questi dati nel suo stato perché deve essere manipolato e modificato durante l'immissione dei dati

  2. in qualsiasi altra parte dell'applicazione i dati dovrebbero essere trasmessi come oggetti di scena a tutti gli altri componenti

Quindi sì, gli oggetti di scena stanno cambiando, ma sono cambiati alla "fonte" e quindi semplicemente scenderanno da lì. Quindi gli oggetti di scena sono immutabili nel contesto del componente che li riceve .

Ad esempio, una schermata di dati di riferimento in cui gli utenti modificano un elenco di fornitori lo gestiranno nello stato, il quale avrebbe un'azione che causerebbe il salvataggio dei dati aggiornati in ReferenceDataState che potrebbe essere di un livello inferiore all'AppState e quindi questo elenco di fornitori verrebbe passato come oggetti di scena a tutti i componenti che dovevano usarlo.


1

In React gli stati memorizzano sia i dati che i puntelli. La sua differenza con quest'ultima è che i dati memorizzati possono essere modificati con diverse modifiche. Questi non sono altro che oggetti scritti in JavaScript piatto, quindi possono contenere dati o codici, rappresentano le informazioni che si desidera modellare. Se hai bisogno di maggiori dettagli, ti consigliamo di vedere queste pubblicazioni Uso dello stato in React e Uso di oggetti di scena in React


1
  • oggetti di scena --- non puoi cambiarne il valore.
  • stati --- puoi cambiare il suo valore nel tuo codice, ma sarebbe attivo quando si verifica un rendering.

1

Alcune differenze tra "stato" e "oggetti di scena" nel reagire.

React controlla e esegue il rendering del DOM in base allo stato. Esistono due tipi di stati dei componenti: props è lo stato che trasferisce tra i componenti e state è lo stato interno dei componenti. I puntelli vengono utilizzati per il trasferimento di dati dal componente padre al componente figlio. I componenti hanno anche il loro stato interno: stato che può essere modificato solo all'interno del componente.

Generalmente lo stato di un determinato componente potrebbe essere l'elica del componente figlio, gli oggetti di scena verranno passati ai figli che è indicato nel metodo di rendering del componente padre


1

puntelli

  • puntelli utilizzano per passare i dati nel componente figlio

  • props cambia un valore al di fuori di un componente (componente figlio)

Stato

  • uso dello stato all'interno di un componente di classe

  • state cambia un valore all'interno di un componente

  • Se si esegue il rendering della pagina, si chiama setState per aggiornare DOM (aggiorna il valore della pagina)

Lo stato ha un ruolo importante nel reagire


0

In risposta alla domanda iniziale sull'immutabilità degli oggetti di scena, si dice che siano immutabili per quanto riguarda la componente figlio, ma sono modificabili nel genitore.


0

React Components utilizza lo stato per LEGGERE / SCRIVERE le variabili interne che possono essere modificate / mutate, ad esempio:

this.setState({name: 'Lila'})

React props è un oggetto speciale che consente al programmatore di ottenere variabili e metodi dal componente padre al componente figlio.

È qualcosa come una finestra e le porte di casa. I puntelli sono anche immutabili Il componente figlio non può modificarli / aggiornarli.

Ci sono un paio di metodi che aiutano ad ascoltare quando gli oggetti di scena vengono cambiati dal componente genitore.


0

Questo è il mio attuale punto di vista riguardo alla spiegazione tra stato e oggetti di scena

  1. Lo stato è come la variabile locale all'interno del componente. È possibile manipolare il valore di stato utilizzando set state. Ad esempio, è possibile passare il valore di stato al componente figlio.

  2. I puntelli sono il valore che si trova esattamente all'interno del tuo negozio di redux, questo in realtà proviene dallo stato originato dal riduttore. Il componente deve essere collegato a Redux per ottenere il valore dagli oggetti di scena. Puoi anche passare il valore dei tuoi oggetti di scena al componente figlio


0

La spiegazione semplice è: STATE è lo stato locale del componente, ad esempio color = "blue" o animazione = true ecc. Utilizzare this.setState per modificare lo stato del componente. PROPS è il modo in cui i componenti dialogano tra loro (inviano dati da padre a figlio) e rendono riutilizzabili i componenti.


0

Lo stato è i tuoi dati, è mutabile, puoi fare tutto ciò di cui hai bisogno, gli oggetti di scena sono dati di sola lettura, di solito quando passi oggetti di scena hai già a che fare con i tuoi dati e hai bisogno del componente figlio per renderli o se i tuoi oggetti di scena sono un la funzione per chiamarla per eseguire un'attività


0

Lo stato è l'origine della verità, dove vivono i tuoi dati. Si può dire che lo stato si manifesta tramite oggetti di scena.

Fornire oggetti di scena ai componenti è ciò che mantiene l'interfaccia utente in sintonia con i tuoi dati. Un componente è in realtà solo una funzione che restituisce markup.

Dati gli stessi oggetti di scena (dati da visualizzare) produrrà sempre lo stesso markup .

Quindi gli oggetti di scena sono come le condutture che trasportano i dati dall'origine ai componenti funzionali.


0

Props: rappresenta i dati di "sola lettura", che sono immutabili e si riferiscono ad attributi del componente parent.

Stato: rappresenta i dati mutabili, che influiscono in definitiva su ciò che viene visualizzato sulla pagina e gestito internamente dal componente stesso e cambia gli straordinari comunemente a causa dell'input dell'utente.


1
c'è solo 1 professionista? e 1 con?
Libro di Zeus,

0

La differenza principale è che lo stato è privato di un componente e può essere modificato all'interno di quel componente solo mentre gli oggetti di scena sono solo valore statico e chiave per il componente figlio che viene passato attraverso il componente padre e non può essere modificato all'interno del componente figlio

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.