Sfida creare una lista di cose da fare in React

Sei pronto a mettere alla prova la tua conoscenza di React? In questo video tratto dal mio corso su App Web moderne con React e Redux, ti verrà chiesto di creare una semplice app per la lista di cose da fare in React. In particolare, dovrai trasferire i dati a un componente figlio in cui verrà aggiornato e rinviato al componente principale.

Se non sei sicuro di come farlo, non preoccuparti, puoi saltare alla soluzione. Ti illustrerò dettagliatamente l'intero processo per mostrarti come è stato fatto!

Sfida: creare una lista di cose da fare in React

 

La sfida

In questa sfida, creerai una semplice app lista di cose da fare in React. 

Abbiamo due componenti già costruiti: a Lista di cose da fare componente e a TodoItem componente.

Il Lista di cose da fare il componente ha solo una lista di cose da fare nel suo stato, e ognuno ha a testo proprietà e a fatto proprietà. Quindi possiamo rendere la nostra lista di cose da fare in TodoItem componente. 

Quindi nel TodoItem componente, viene semplicemente visualizzato un elemento di elenco con una casella di input che ha il valore. Se questo elemento delle attività è fatto, il valore non è modificabile, è di sola lettura. Quindi abbiamo un pulsante che possiamo usare per "Finire" o "Unfinisci" un compito. 

In questo momento, sta funzionando bene sul lato destro, ma non possiamo effettivamente cambiare queste cose nello stato del nostro Lista di cose da fare componente. Quindi se provo a fare cambiamenti in questi elementi di input, non succede nulla. Se clicco finire, il testo sul pulsante non cambia come dovrebbe. E posso ancora selezionare il testo nei campi di input e, se potessi effettivamente apportare modifiche, sarebbe modificabile

Tutto ciò deve essere cablato correttamente. E questa è la tua sfida! Ecco il CodePen con tutto il codice sorgente con cui lavorare. 

Forcella la penna e prova a capire la tua soluzione! Oppure continua a leggere e ti guiderò attraverso di esso.

La soluzione

Iniziare biforcando il CodePen originale e assegnandogli un nome diverso, ad es. aggiungendo "LA MIA SOLUZIONE".

Abbiamo un paio di cose diverse che dobbiamo fare qui. Primo, dentro il nostro TodoItem componente, dobbiamo essere in grado di apportare modifiche a questi dati. Ciò significa che dobbiamo avere un al clic gestore per il pulsante e un onChange gestore per l'elemento di input.

Ma poi abbiamo bisogno di un modo per trasferire tali modifiche al genitore Lista di cose da fare componente. Quindi questo significa Lista di cose da fare ha bisogno di passare una funzione fino a TodoItem, in modo che possa chiamare quella funzione. 

Creazione di una funzione updateTodo

Quindi inizieremo aggiungendo un updateTodo funzione in Lista di cose da fare con qualche testo fittizio per ora, che aggiorneremo in seguito. E ora che abbiamo creato updateTodo, possiamo usarlo dentro TodoItem

Quindi, come potrebbe funzionare? Bene, iniziamo con il pulsante. Aggiungeremo un al clic gestore, e aggiungeremo this.handleClick

Quindi ora dobbiamo scrivere il nostro handleClick funzione. Il handleClick la funzione sta per apportare una modifica al fare proprietà che è stata tramandata a TodoItem

Quando si fa clic su questo, vogliamo invertire qualsiasi valore fatto è. Quindi se è falso, passa a true, e se è vero, passa a false. E poi, ovviamente, vogliamo passare a quelli appena aggiornati fare oggetto di backup attraverso il updateTodo funzione. 

Possiamo ottenere il nostro newTodo facendo Object.assign, in modo tale da non mutare i dati. E coperemo tutte le proprietà nella nostra attività, che è in realtà this.props.todo.

Ma poi vogliamo essere sicuri di sovrascrivere il fatto proprietà, che dovrebbe essere il contrario o il negativo di this.props.todo.done

Quindi questo è il nostro newTodo. E poi possiamo fare this.props.updateTodo, e lo passeremo nostro newTodo.

OK, quindi questo è gestire il clic. Ora andiamo giù e scriviamo il nostro updateTodo ora, in modo che possiamo effettivamente vedere questo in azione. In questo momento, se clicco finire, puoi vedere che il nostro nuovo oggetto to-do è stato stampato dove done è impostato su true, ma non lo vediamo ancora nell'interfaccia utente. Questo perché, ora, abbiamo bisogno di salvare questo nuovo fare di nuovo nel nostro Todos stato.

Impostazione dello stato

Quindi andiamo avanti e scriviamo un updateTodo funzione, e ci vorrà newTodo come il suo parametro. E dentro, lo faremo this.setState

Ora, imposterò lo stato in un modo che potresti non aver visto prima. Stiamo per passare una funzione per impostare lo stato anziché passare un oggetto. Questo è effettivamente considerato una buona pratica in React e potrebbe essere l'unico modo per impostare lo stato in futuro. La funzione che passi setState riceverà lo stato corrente come parametro. Quindi possiamo ricevere quello stato come parametro per questa funzione, e quindi restituiamo il nostro nuovo stato da questa funzione.

Questo è in realtà un modo più affidabile per creare un nuovo stato basato sul vecchio stato. Si può quasi pensare a una sorta di funzione di riduzione, all'interno della nostra setState chiamata. 

Quindi andremo avanti e restituiremo un nuovo oggetto qui. E poiché questo è tutto ciò che faremo da questa funzione, possiamo in realtà racchiudere tra parentesi le parentesi graffe in modo che sappia che questo è un oggetto e non il blocco funzione. 

Prendiamo la nostra esistente state.todos, e mapperemo su ciascuno di essi fare lì, e se il todo.id è uguale al newTodo.id, allora sappiamo che questo è il fare oggetto che dobbiamo sostituire. Quindi possiamo sostituirlo con il newTodo, e altrimenti possiamo solo restituire il vecchio fare, perché non è quello che stiamo cercando di sostituire. 

E poi abbiamo solo bisogno di cambiare la nostra updateTodo funzione a cui fare riferimento this.updateTodo.

Ora, se clicchi finire, vedrai che il pulsante diventa Unfinish, e questo perché todo.done è ora vero invece di falso. Inoltre, il testo "wash floor" è ora un po 'oscurato e non è più modificabile. Se clicco Unfinish, torna a Fine e la casella di testo è nuovamente modificabile.

Rendere il testo modificabile

Il nostro prossimo passo è rendere il testo modificabile aggiungendo un onChange gestore.

Sul ingresso linea, aggiungeremo onChange = this.handleChange. E poi abbiamo bisogno di scrivere handleChange

Inizieremo creando un newTodo e copiare tutte le proprietà da this.props.todo, e poi handleChange passerà il nostro oggetto evento. Stiamo andando a impostare il testo essere e.target.value. E poi sotto quello che faremo this.props.updateTodo, e lo passeremo il newTodo

Quindi, se cambiamo il testo, funziona perfettamente. Ora possiamo dire di comprare uova al posto del latte e possiamo dire di lavare l'auto al posto del pavimento. Quindi, ora stiamo apportando modifiche a un oggetto in un componente figlio e passando di nuovo tali modifiche al componente principale, dove possono essere memorizzate.

Semplificare il codice

Quindi ora funziona come volevamo, ma c'è ancora un'altra cosa che voglio fare. Noterai che il handleChange funzione e il handleClick la funzione ha un sacco di codice simile. Ho spesso avuto componenti figlio come questo in cui vogliamo aggiornare un oggetto in qualche modo e poi passarlo a un genitore, e scoprirai che un modello comune per farlo sta usando Object.assign in questo modo.

Quindi quello che faremo per mettere ordine in ordine è creare una nuova funzione chiamata sendDelta. In questo caso, delta è solo il termine per qualsiasi cosa debba cambiare tra questa cosa da fare e la nuova cosa da fare di cui abbiamo bisogno. Quindi quello che possiamo fare qui è passare il nostro delta, o il nostro oggetto solo per le proprietà che devono cambiare, a sendDelta

Quindi basta copiare il codice da handleClick e incollarlo sendDelta. Il delta è fondamentalmente l'ultimo argomento a cui siamo passati Object.assign, quindi possiamo andare avanti e sostituire il codice evidenziato sotto con delta, e poi manda quello. 

Quindi ora dentro handleClick e handleChange, possiamo semplicemente sostituire la maggior parte del codice con this.sendDelta, come mostrato di seguito. Come puoi vedere, è molto più conciso.

Quindi questa è la soluzione! Per il codice sorgente completo, è possibile fare riferimento alla soluzione CodePen mostrata di seguito:

Certo, potresti aver trovato una soluzione diversa. Se è così, è grandioso. In ogni caso, ora abbiamo creato con successo un componente figlio che può modificare i suoi dati e quindi inviare tali modifiche di backup per l'archiviazione sul componente principale.

Guarda il corso completo

Nel corso completo, Applicazioni Web moderne con React e Redux, imparerai come utilizzare React e Redux per creare un'applicazione web completa. Inizierai con l'architettura più semplice possibile e creerai lentamente l'app, funzione per caratteristica. Alla fine, avrai creato un'app flashcard completa per l'apprendimento tramite ripetizione spaziale, e avrai anche imparato molto su React e Redux, oltre ad affinare le tue abilità ES6 (ECMAScript 2015).

Puoi seguire questo corso subito con un abbonamento a Envato Elements. Con una sola tariffa mensile bassa, puoi accedere non solo a questo corso, ma anche alla nostra libreria in crescita di oltre 1.000 corsi video e eBook leader del settore su Envato Tuts+. 

Inoltre ora ottieni download illimitati dall'enorme libreria Envato Elements di oltre 460.000 risorse creative. Crea con caratteri, foto, grafica e modelli univoci e realizza progetti migliori più velocemente.