Skip to content

Commit a406989

Browse files
authored
Merge pull request #1937 from juhoan/fine-tune-osa6c
Fine-tune osa6c.md
2 parents 7ff8e7f + 063754b commit a406989

File tree

1 file changed

+25
-26
lines changed

1 file changed

+25
-26
lines changed

src/content/6/fi/osa6c.md

Lines changed: 25 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ lang: fi
77

88
<div class="content">
99

10-
Laajennetaan sovellusta siten, että muistiinpanot talletetaan backendiin. Käytetään osasta 2 tuttua [json-serveriä](/osa2/palvelimella_olevan_datan_hakeminen).
10+
Laajennetaan sovellusta siten, että muistiinpanot talletetaan backendiin. Käytetään osasta 2 tuttua [JSON Serveriä](/osa2/palvelimella_olevan_datan_hakeminen).
1111

1212
Tallennetaan projektin juuren tiedostoon <i>db.json</i> tietokannan alkutila:
1313

@@ -28,7 +28,7 @@ Tallennetaan projektin juuren tiedostoon <i>db.json</i> tietokannan alkutila:
2828
}
2929
```
3030

31-
Asennetaan projektiin json-server
31+
Asennetaan projektiin JSON Server
3232

3333
```bash
3434
npm install json-server --save-dev
@@ -43,7 +43,7 @@ ja lisätään tiedoston <i>package.json</i> osaan <i>scripts</i> rivi
4343
}
4444
```
4545

46-
Käynnistetään json-server komennolla _npm run server_.
46+
Käynnistetään JSON Server komennolla _npm run server_.
4747

4848
Tehdään sitten tuttuun tapaan <i>axiosia</i> hyödyntävä backendistä dataa hakeva metodi tiedostoon <i>services/notes.js</i>:
4949

@@ -60,7 +60,7 @@ const getAll = async () => {
6060
export default { getAll }
6161
```
6262

63-
Asennetaan myös axios projektiin
63+
Asennetaan myös axios projektiin:
6464

6565
```bash
6666
npm install axios
@@ -144,7 +144,7 @@ noteService.getAll().then(notes =>
144144
// ...
145145
```
146146

147-
Monen actionin dispatchaaminen vaikuttaa hieman epäkäytännölliseltä. Lisätään action creatori <em>setNotes</em>, jonka avulla muistiinpanojen taulukon voi suoraan korvata. Saamme <em>createSlice</em>-funktion avulla haluamamme action creatorin, kun määrittelemme <em>setNotes</em>-actionin:
147+
Monen actionin dispatchaaminen vaikuttaa hieman epäkäytännölliseltä. Lisätään action creator <em>setNotes</em>, jonka avulla muistiinpanojen taulukon voi suoraan korvata. Saamme <em>createSlice</em>-funktion avulla haluamamme action creatorin, kun määrittelemme <em>setNotes</em>-actionin:
148148

149149
```js
150150
// ...
@@ -211,15 +211,15 @@ noteService.getAll().then(notes =>
211211
)
212212
```
213213

214-
> **HUOM:** miksi emme käyttäneet koodissa promisejen ja _then_-metodilla rekisteröidyn tapahtumankäsittelijän sijaan awaitia?
214+
> **HUOM:** Miksi emme käyttäneet koodissa promisejen ja _then_-metodilla rekisteröidyn tapahtumankäsittelijän sijaan awaitia?
215215
>
216216
> await toimii ainoastaan <i>async</i>-funktioiden sisällä, ja <i>index.js</i>:ssä oleva koodi ei ole funktiossa, joten päädyimme tilanteen yksinkertaisuuden takia tällä kertaa jättämään <i>async</i>:in käyttämättä.
217217
218218
Päätetään kuitenkin siirtää muistiinpanojen alustus <i>App</i>-komponentiin, eli kuten yleensä dataa palvelimelta haettaessa, käytetään <i>effect hookia</i>:
219219

220220
```js
221221
import { useEffect } from 'react' // highlight-line
222-
import NewNote from './components/NowNote'
222+
import NewNote from './components/NewNote'
223223
import Notes from './components/Notes'
224224
import VisibilityFilter from './components/VisibilityFilter'
225225
import noteService from './services/notes' // highlight-line
@@ -247,7 +247,7 @@ const App = () => {
247247
export default App
248248
```
249249

250-
Hookin useEffect käyttö aiheuttaa eslint-varoituksen:
250+
Hookin useEffect käyttö aiheuttaa ESLint-varoituksen:
251251

252252
![](../../images/6/26ea.png)
253253

@@ -265,7 +265,7 @@ const App = () => {
265265
}
266266
```
267267

268-
Nyt komponentin _App_ sisällä määritelty muuttuja <i>dispatch</i> eli käytännössä Redux-storen dispatch-funktio on lisätty useEffectille parametrina annettuun taulukkoon. **Jos** dispatch-muuttujan sisältö muuttuisi ohjelman suoritusaikana, suoritettaisiin efekti uudelleen, näin ei kuitenkaan ole, eli varoitus on tässä tilanteessa oikeastaan aiheeton.
268+
Nyt komponentin _App_ sisällä määritelty muuttuja <i>dispatch</i> eli käytännössä Redux-storen dispatch-funktio on lisätty useEffectille parametrina annettuun taulukkoon. **Jos** dispatch-muuttujan sisältö muuttuisi ohjelman suoritusaikana, suoritettaisiin efekti uudelleen. Näin ei kuitenkaan ole, eli varoitus on tässä tilanteessa oikeastaan aiheeton.
269269

270270
Toinen tapa päästä eroon varoituksesta olisi disabloida se kyseisen rivin kohdalta:
271271

@@ -283,9 +283,9 @@ const App = () => {
283283
}
284284
```
285285

286-
Yleisesti ottaen eslint-virheiden disabloiminen ei ole hyvä idea, joten vaikka kyseisen eslint-säännön tarpeellisuus onkin aiheuttanut [kiistelyä](https://github.com/facebook/create-react-app/issues/6880), pitäydytään ylemmässä ratkaisussa.
286+
Yleisesti ottaen ESLint-virheiden disabloiminen ei ole hyvä idea, joten vaikka kyseisen ESLint-säännön tarpeellisuus onkin aiheuttanut [kiistelyä](https://github.com/facebook/create-react-app/issues/6880), pitäydytään ylemmässä ratkaisussa.
287287

288-
Lisää hookien riippuvuuksien määrittelyn tarpeesta [Reactin dokumentaatiossa](https://reactjs.org/docs/hooks-faq.html#is-it-safe-to-omit-functions-from-the-list-of-dependencies).
288+
Lisää hookien riippuvuuksien määrittelyn tarpeesta on [Reactin dokumentaatiossa](https://reactjs.org/docs/hooks-faq.html#is-it-safe-to-omit-functions-from-the-list-of-dependencies).
289289

290290
Voimme toimia samoin myös uuden muistiinpanon luomisen suhteen. Laajennetaan palvelimen kanssa kommunikoivaa koodia:
291291

@@ -360,7 +360,7 @@ Sovelluksen tämänhetkinen koodi on [GitHubissa](https://github.com/fullstack-h
360360

361361
#### 6.13 anekdootit ja backend, step1
362362

363-
Hae sovelluksen käynnistyessä anekdootit json-serverillä toteutetusta backendistä.
363+
Hae sovelluksen käynnistyessä anekdootit JSON Serverillä toteutetusta backendistä.
364364

365365
Backendin alustavan sisällön saat esim. [täältä](https://github.com/fullstack-hy2020/misc/blob/master/anecdotes.json).
366366

@@ -372,23 +372,23 @@ Muuta uusien anekdoottien luomista siten, että anekdootit talletetaan backendii
372372

373373
<div class="content">
374374

375-
### Asynkroniset actionit ja redux thunk
375+
### Asynkroniset actionit ja Redux Thunk
376376

377-
Lähestymistapamme on melko hyvä, mutta siinä mielessä ikävä, että palvelimen kanssa kommunikointi tapahtuu komponentit määrittelevien funktioiden koodissa. Olisi parempi, jos kommunikointi voitaisiin abstrahoida komponenteilta siten, että niiden ei tarvitsisi kuin kutsua sopivaa <i>action creatoria</i>, esim. <i>App</i> alustaisi sovelluksen tilan seuraavasti:
377+
Lähestymistapamme on melko hyvä, mutta siinä mielessä ikävä, että palvelimen kanssa kommunikointi tapahtuu komponentit määrittelevien funktioiden koodissa. Olisi parempi, jos kommunikointi voitaisiin abstrahoida komponenteilta siten, että niiden ei tarvitsisi kuin kutsua sopivaa <i>action creatoria</i>. Esim. <i>App</i> voisi alustaa sovelluksen tilan seuraavasti:
378378

379379
```js
380380
const App = () => {
381381
const dispatch = useDispatch()
382382

383383
useEffect(() => {
384384
dispatch(initializeNotes())
385-
},[dispatch])
385+
}, [dispatch])
386386

387387
// ...
388388
}
389389
```
390390

391-
ja <i>NoteForm</i> loisi uuden muistiinpanon seuraavasti:
391+
<i>NoteForm</i> puolestaan loisi uuden muistiinpanon seuraavasti:
392392

393393
```js
394394
const NewNote = () => {
@@ -405,9 +405,9 @@ const NewNote = () => {
405405
}
406406
```
407407

408-
Molemmat komponentit dispatchaisivat ainoastaan actionin, välittämättä siitä, että taustalla tapahtuu todellisuudessa palvelimen kanssa tapahtuvaa kommunikointia. Tämän kaltaisten <i>asynkronisten actioneiden</i> käyttö onnistuu [Redux Thunk](https://github.com/reduxjs/redux-thunk)-kirjaston avulla. Kirjaston käyttö ei vaadi ylimääräistä konfiguraatiota, kun Redux-store on luotu Redux Toolkitin <em>configureStore</em>-funktiolla.
408+
Molemmat komponentit dispatchaisivat ainoastaan actionin välittämättä siitä, että taustalla tapahtuu todellisuudessa palvelimen kanssa tapahtuvaa kommunikointia. Tämän kaltaisten <i>asynkronisten actioneiden</i> käyttö onnistuu [Redux Thunk](https://github.com/reduxjs/redux-thunk)-kirjaston avulla. Kirjaston käyttö ei vaadi ylimääräistä konfiguraatiota, kun Redux-store on luotu Redux Toolkitin <em>configureStore</em>-funktiolla.
409409

410-
Asennetaan kirjasto
410+
Asennetaan kirjasto:
411411

412412
```
413413
npm install redux-thunk
@@ -437,7 +437,7 @@ export const initializeNotes = () => {
437437
export default noteSlice.reducer
438438
```
439439

440-
Sisemmässä funktiossaan, eli <i>asynkronisessa actionissa</i>, operaatio hakee ensin palvelimelta kaikki muistiinpanot ja sen jälkeen <i>dispatchaa</i> muistiinpanot storeen lisäävän actionin, <em>setNotes</em>.
440+
Sisemmässä funktiossaan eli <i>asynkronisessa actionissa</i> operaatio hakee ensin palvelimelta kaikki muistiinpanot ja sen jälkeen <i>dispatchaa</i> muistiinpanot storeen lisäävän actionin, <em>setNotes</em>.
441441

442442
Komponentti <i>App</i> voidaan nyt määritellä seuraavasti:
443443

@@ -448,7 +448,7 @@ const App = () => {
448448
// highlight-start
449449
useEffect(() => {
450450
dispatch(initializeNotes())
451-
},[dispatch])
451+
}, [dispatch])
452452
// highlight-end
453453

454454
return (
@@ -461,7 +461,7 @@ const App = () => {
461461
}
462462
```
463463

464-
Ratkaisu on elegantti, muistiinpanojen alustuslogiikka on eriytetty kokonaan React-komponenttien ulkopuolelle.
464+
Ratkaisu on elegantti, sillä muistiinpanojen alustuslogiikka on eriytetty kokonaan React-komponenttien ulkopuolelle.
465465

466466
Korvataan seuraavaksi <em>createSlice</em>-funktion avulla toteutettu <em>createNote</em> -action creator saman nimisellä asynkronisella action creatorilla:
467467

@@ -519,7 +519,7 @@ export const createNote = content => {
519519
export default noteSlice.reducer
520520
```
521521

522-
Periaate on jälleen sama, ensin suoritetaan asynkroninen operaatio, ja sen valmistuttua <i>dispatchataan</i> storen tilaa muuttava action. Redux Toolkit tarjoaa monia työkaluja asynkronisen tilanhallinnan helpottamiseksi. Tähän käyttötarkoitukseen soveltuvat mm. [createAsyncThunk](https://redux-toolkit.js.org/api/createAsyncThunk)-funktio ja [RTK Query](https://redux-toolkit.js.org/rtk-query/overview)-API.
522+
Periaate on jälleen sama. Ensin suoritetaan asynkroninen operaatio, ja sen valmistuttua <i>dispatchataan</i> storen tilaa muuttava action. Redux Toolkit tarjoaa monia työkaluja asynkronisen tilanhallinnan helpottamiseksi. Tähän käyttötarkoitukseen soveltuvat mm. [createAsyncThunk](https://redux-toolkit.js.org/api/createAsyncThunk)-funktio ja [RTK Query](https://redux-toolkit.js.org/rtk-query/overview) -API.
523523

524524
Komponentti <i>NewNote</i> muuttuu seuraavasti:
525525

@@ -537,13 +537,13 @@ const NewNote = () => {
537537
return (
538538
<form onSubmit={addNote}>
539539
<input name="note" />
540-
<button type="submit">lisää</button>
540+
<button type="submit">add</button>
541541
</form>
542542
)
543543
}
544544
```
545545

546-
Siistitään lopuksi vielä hieman <i>index.js</i>-tiedostoa, siirtämällä Redux-storen luontiin liittyvän koodin omaan, <i>store.js</i>-tiedostoonsa:
546+
Siistitään lopuksi vielä hieman <i>index.js</i>-tiedostoa siirtämällä Redux-storen luontiin liittyvä koodi erilliseen <i>store.js</i>-tiedostoon:
547547

548548
```js
549549
import { configureStore } from '@reduxjs/toolkit'
@@ -593,7 +593,6 @@ Muuta Redux-storen alustus tapahtumaan Redux Thunk -kirjaston avulla toteutettuu
593593

594594
Muuta myös uuden anekdootin luominen tapahtumaan Redux Thunk -kirjaston avulla toteutettuihin asynkronisiin actioneihin.
595595

596-
597596
#### 6.17 anekdootit ja backend, step5
598597

599598
Äänestäminen ei vielä talleta muutoksia backendiin. Korjaa tilanne Redux Thunk -kirjastoa hyödyntäen.
@@ -615,7 +614,7 @@ Toteuta action creator, joka mahdollistaa notifikaation antamisen seuraavasti:
615614
dispatch(setNotification(`you voted '${anecdote.content}'`, 10))
616615
```
617616

618-
eli ensimmäisenä parametrina on renderöitävä teksti ja toisena notifikaation näyttöaika sekunneissa.
617+
Ensimmäisenä parametrina on renderöitävä teksti ja toisena notifikaation näyttöaika sekunneissa.
619618

620619
Ota paranneltu notifikaatiotapa käyttöön sovelluksessasi.
621620

0 commit comments

Comments
 (0)