From aa1c92bddab80a01de5cf4f132fb1456dc3c3e5a Mon Sep 17 00:00:00 2001
From: Miro Rauhala <4082806+mirorauhala@users.noreply.github.com>
Date: Mon, 2 May 2022 09:36:09 +0000
Subject: [PATCH 01/80] Translate installation
---
beta/src/pages/learn/installation.md | 42 ++++++++++++++--------------
beta/src/sidebarLearn.json | 22 +++++++--------
2 files changed, 31 insertions(+), 33 deletions(-)
diff --git a/beta/src/pages/learn/installation.md b/beta/src/pages/learn/installation.md
index f19f389d6..fc8c1cc9b 100644
--- a/beta/src/pages/learn/installation.md
+++ b/beta/src/pages/learn/installation.md
@@ -1,55 +1,55 @@
---
-title: Installation
+title: Asennus
---
-React has been designed from the start for gradual adoption, and you can use as little or as much React as you need. Whether you want to get a taste of React, add some interactivity to an HTML page, or start a complex React-powered app, this section will help you get started.
+React on suunniteltu alusta alkaen asteittaiseen käyttöönottoon. Voit käyttää niin paljon tai vähän Reactia kuin tarvitset. Halusitpa sitten koittaa Reactia, lisätä vähän interaktiivisuutta HTML sivuun, tai aloittaa monimutkaisen React-käyttöisen sovelluksen, tämä osio auttaa sinua pääsemään alkuun.
-* [How to add React to an HTML page](/learn/add-react-to-a-website)
-* [How to start a standalone React project](/learn/start-a-new-react-project)
-* [How to set up your editor](/learn/editor-setup)
-* [How to install React Developer Tools](/learn/react-developer-tools)
+- [How to add React to an HTML page](/learn/add-react-to-a-website)
+- [How to start a standalone React project](/learn/start-a-new-react-project)
+- [How to set up your editor](/learn/editor-setup)
+- [How to install React Developer Tools](/learn/react-developer-tools)
-## Try React {/*try-react*/}
+## Kokeile Reactia {/* try-react */}
-You don't need to install anything to play with React. Try editing this sandbox!
+Reactia kokeillaksesi sinun ei tarvitse asentaa mitään. Kokeile muokata tätä hiekkalaatikkoa!
```js
-function Greeting({ name }) {
- return
Hello, {name}
;
+function Tervehdys({nimi}) {
+ return
Hei, {nimi}
;
}
export default function App() {
- return
+ return ;
}
```
-We use sandboxes throughout these docs as teaching aids. Sandboxes can help familiarize you with how React works and help you decide if React is right for you. Outside of the React documentation, there are many online sandboxes that support React: for example, [CodeSandbox](https://codesandbox.io/s/new), [Stackblitz](https://stackblitz.com/fork/react), or [CodePen](
-https://codepen.io/pen/?template=wvdqJJm).
+Käytämme hiekkalaatikkoja osana dokumentaatiota opetuksen tukena. Hiekkalaatikot auttaa tutustumaan Reactin toimintaan sekä auttaa päättämään sopiiko React sinulle.
+Reactin dokumentaation ulkopuolelta löytyy monia hiekkalaatikkoja, jotka tukevat Reactia: esimerkiksi [CodeSandbox](https://codesandbox.io/s/new), [Stackblitz](https://stackblitz.com/fork/react), tai [CodePen](https://codepen.io/pen/?template=wvdqJJm).
-### Try React locally {/*try-react-locally*/}
+## Kokeile Reactia paikallisesti {/* try-react-locally */}
-To try React locally on your computer, [download this HTML page](https://raw.githubusercontent.com/reactjs/reactjs.org/main/static/html/single-file-example.html). Open it in your editor and in your browser!
+Kokeile Reactia paikallisesti omalla tietokoneellasi [lataamalla tämä HTML sivu](https://raw.githubusercontent.com/reactjs/reactjs.org/main/static/html/single-file-example.html). Avaa se editorissasi sekä selaimesasi!
-## Add React to a page {/*add-react-to-a-page*/}
+## Lisää React sivuun {/* add-react-to-a-page */}
-If you're working with an existing site and just need to add a little bit of React, you can [add React with a script tag.](/learn/add-react-to-a-website)
+Jos työskentelet olemassaolevan sivun kanssa ja tarvitset vain vähäsen Reactia, voit [lisätä Reactin script -tagilla.](/learn/add-react-to-a-website)
-## Start a React project {/*start-a-react-project*/}
+## Aloita React -projekti {/* start-a-react-project */}
-If you're ready to [start a standalone project](/learn/start-a-new-react-project) with React, you can set up a minimal toolchain for a pleasant developer experience. You can also start with a framework that makes a lot of decisions for you out of the box.
+Jos olet valmis [aloittamaan itsenäisen projektin](/learn/start-a-new-react-project) Reactilla, voit pystyttää minimaalisen ympäristön miellyttävää kehittäjäkokemusta varten. Voit myös aloittaa käyttämällä ohjelmistokehystä, joka teke paljon päätöksiä puolestasi.
-## Next steps {/*next-steps*/}
+## Seuraavat vaiheet {/* next-steps */}
-Where you start depends on how you like to learn, what you need to accomplish, and where you want to go next! Why not read [Thinking in React](/learn/thinking-in-react)--our introductory tutorial? Or you can jump to [Describing the UI](/learn/describing-the-ui) to play with more examples and learn each topic step by step. There is no wrong way to learn React!
+Se mistä aloitat riippuu pitkälti miten haluat oppia, mitä sinun täytyy saavuttaa, ja minne haluat edetä seuraavaksi! Mikset lukisi [Ajattelua Reactissa](/learn/thinking-in-react) -johdantoa? Tai voit myös hypätä [Käyttöliittymän kuvaukseen](/learn/describing-the-ui) kokeillaksesi esimerkeillä ja oppiaksesi aiheen vaihe vaiheelta. Ei ole väärää tapaa oppia Reactia!
diff --git a/beta/src/sidebarLearn.json b/beta/src/sidebarLearn.json
index 25463d85c..8e37bf5ac 100644
--- a/beta/src/sidebarLearn.json
+++ b/beta/src/sidebarLearn.json
@@ -1,5 +1,5 @@
{
- "title": "Learn React",
+ "title": "Opi React",
"heading": true,
"path": "/learn",
"routes": [
@@ -8,7 +8,7 @@
"path": "",
"routes": [
{
- "title": "Installation",
+ "title": "Asennus",
"path": "/learn/installation",
"routes": [
{
@@ -32,10 +32,12 @@
{
"title": "Quick Start",
"path": "/learn",
- "routes": [{
- "title": "Thinking in React",
- "path": "/learn/thinking-in-react"
- }]
+ "routes": [
+ {
+ "title": "Thinking in React",
+ "path": "/learn/thinking-in-react"
+ }
+ ]
},
{
"title": "Describing the UI",
@@ -114,9 +116,7 @@
{
"title": "Managing State",
"path": "/learn/managing-state",
- "tags": [
- "intermediate"
- ],
+ "tags": ["intermediate"],
"routes": [
{
"title": "Reacting to Input with State",
@@ -151,9 +151,7 @@
{
"title": "Escape Hatches",
"path": "/learn/escape-hatches",
- "tags": [
- "advanced"
- ],
+ "tags": ["advanced"],
"routes": [
{
"title": "Referencing Values with Refs",
From bf6ecc18f0b8fa0398d4cc9457657a0ff28850b8 Mon Sep 17 00:00:00 2001
From: Miro Rauhala <4082806+mirorauhala@users.noreply.github.com>
Date: Mon, 2 May 2022 13:59:12 +0000
Subject: [PATCH 02/80] Add glossary
---
beta/GLOSSARY.md | 11 +++++++++++
1 file changed, 11 insertions(+)
create mode 100644 beta/GLOSSARY.md
diff --git a/beta/GLOSSARY.md b/beta/GLOSSARY.md
new file mode 100644
index 000000000..d8a523349
--- /dev/null
+++ b/beta/GLOSSARY.md
@@ -0,0 +1,11 @@
+# Glossary / Sanasto
+
+
+## React specific
+
+- **React hook**: React hookki
+
+## General
+
+- **build tool**: käännöstyökalu
+- **framework**: ohjelmistokehys
From 93e4b120068dd66a9b288a72bfdd5e0475a687d7 Mon Sep 17 00:00:00 2001
From: Miro Rauhala <4082806+mirorauhala@users.noreply.github.com>
Date: Mon, 2 May 2022 13:59:43 +0000
Subject: [PATCH 03/80] WIP: Quick start
---
beta/src/pages/learn/index.md | 332 +++++++++++++++-------------------
1 file changed, 141 insertions(+), 191 deletions(-)
diff --git a/beta/src/pages/learn/index.md b/beta/src/pages/learn/index.md
index d85ad22e2..2aa15be40 100644
--- a/beta/src/pages/learn/index.md
+++ b/beta/src/pages/learn/index.md
@@ -1,71 +1,65 @@
---
-title: Quick Start
+title: Pika-aloitus
---
-Welcome to the React documentation! This page will give you an introduction to the 80% of React concepts that you will use on a daily basis.
+Tervetuloa Reactin dokumentaatioon. Tällä sivulla esitellään 80% Reactin konsepteista, joita käytät päivittäin.
-- How to create and nest components
-- How to add markup and styles
-- How to display data
-- How to render conditions and lists
-- How to respond to events and update the screen
-- How to share data between components
+- Miten luodaan ja sijoitetaan komponentteja
+- Miten lisätään merkintäkoodia ja tyylejä
+- Miten tietoja näytetään
+- Miten renderöidään listoja ja ehtoja
+- Miten vastataan tapahtumiin ja päivitetään ruutua
+- Miten tietoa jaetaan komponenttien välillä
-## Creating and nesting components {/*components*/}
+## Komponenttien luominen ja sijoittaminen {/* components */}
-React apps are made out of components. A component is a piece of the UI (user interface) that has its own logic and appearance. A component can be as small as a button, or as large as an entire page.
+React sovellukset koostuvat komponenteista. Komponentti on pala käyttöliittymää (UI, user interface), jolla on sen oma logiikka ja ulkomuoto. Komponentti voi olla pieni kuin vaikka painonappi tai suuri kuin koko sivu.
-React components are JavaScript functions that return markup:
+React komponentit ovat JavaScript funktioita jotka palauttavat merkintäkoodin:
```js
-function MyButton() {
- return (
-
- );
+function Painonappi() {
+ return ;
}
```
-Now that you've declared `MyButton`, you can nest it into another component:
+Nyt kun on esitelty `Painonappi` -komponentti, voidaan se sijoittaa toisen komponentin sisään:
```js {5}
export default function MyApp() {
return (
-
Welcome to my app
-
+
Tervetuloa sovellukseeni
+
);
}
```
-Notice that `` starts with a capital letter. That's how you know it's a React component. React component names must always start with a capital letter, while HTML tags must be lowercase.
+Huomaa, että `` alkaa isolla alkukirjaimella. Tästä voit päätellä, että kyseessä on React komponentti. React komponentin nimen on aina alettava isolla alkukirjaimella, kun taas HTML tagit alkavat pienellä alkukirjaimella.
-Have a look at the result:
+Katsotaanpa lopputulosta:
```js
-function MyButton() {
- return (
-
- );
+function Painonappi() {
+ return ;
}
export default function MyApp() {
return (
-
Welcome to my app
-
+
Tervetuloa sovellukseeni
+
);
}
@@ -73,91 +67,87 @@ export default function MyApp() {
-The `export default` keywords specify the main component in the file. If you're not familiar with some piece of JavaScript syntax, [MDN](https://developer.mozilla.org/en-US/docs/web/javascript/reference/statements/export) and [javascript.info](https://javascript.info/import-export) have great references.
+Avainsanat `export default` määrittävät tiedoston pääkomponentin. Mikäli JavaScript syntaksi ei ole tuttua, [MDN](https://developer.mozilla.org/en-US/docs/web/javascript/reference/statements/export) ja [javascript.info](https://javascript.info/import-export) ovat hyviä tietolähteitä.
-## Writing markup with JSX {/*writing-markup-with-jsx*/}
+## Merkintäkoodin kirjoittaminen JSX:llä {/* writing-markup-with-jsx */}
-The markup syntax you've seen above is called JSX. It is optional, but most React projects use JSX for its convenience. All of the [tools we recommend for local development](/learn/installation) support JSX out of the box.
+Merkintäkoodi jota näit ylhäällä kutsutaan nimeltään JSX. Sen käyttö on valinnaista, mutta useimmat React projektit käyttävät JSX:ää sen mukavuuden vuoksi. Kaikki [työkalut, joita suosittelemme paikalliseen kehitykseen](/learn/installation) tukevat JSX:ää oletuksena.
-JSX is stricter than HTML. You have to close tags like ` `. Your component also can't return multiple JSX tags. You have to wrap them into a shared parent, like a `
...
` or an empty `<>...>` wrapper:
+JSX on tarkempaa kuin HTML. Sinun täytyy sulkea tagit kuten ` `. Komponenttisi ei myöskään voi palauttaa useampia JSX tageja, vaan ne täytyy kääriä yhden pääelementin sisään, kuten `
>
);
}
```
-If you have a lot of HTML to port to JSX, you can use an [online converter](https://transform.tools/html-to-jsx).
+Mikäli sinulla on paljon HTML merkintäkoodia muutettavana JSX koodiksi, voit käyttää [verkkomuunninta](https://transform.tools/html-to-jsx).
-## Adding styles {/*adding-styles*/}
+## Tyylien lisääminen {/* adding-styles */}
-In React, you specify a CSS class with `className`. It works the same way as HTML [`class`](https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/class) attribute:
+Reactissa voit määritellä CSS luokat käyttämällä `className` attribuuttia. Se toimii samoin kuin HTML kielen [`class`](https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/class) attribuutti:
```js
```
-Then you write the CSS rules for it in a separate CSS file:
+Tämän jälkeen kerrot tyylimäärittelyt erilisessä CSS tiedostossa:
```css
-/* In your CSS */
+/* CSS koodissasi */
.avatar {
border-radius: 50%;
}
```
-React does not prescribe how you add CSS files. In the simplest case, you'll add a [``](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/link) tag to your HTML. If you use a build tool or a framework, consult its documentation to learn how to add a CSS file to your project.
+React ei määrää miten lisäät CSS tiedostot. Yksinkertaisimmillaan lisäät [``](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/link) tagin HTML merkintäkoodiin. Jos käytät käännöstyökalua tai ohjelmistokehystä, konsultoi niiden dokumentaatiota löytääksesi tavan lisätä CSS tiedostoja projektiisi.
-## Displaying data {/*displaying-data*/}
+## Tiedon näyttäminen {/* displaying-data */}
-JSX lets you put markup into JavaScript. Curly braces let you "escape back" into JavaScript so that you can embed some variable from your code and display it to the user. For example, this will display `user.name`:
+JSX mahdollistaa merkintäkoodin käytön JavaScriptissa. Aaltosulkeilla antaa sinun "peruuttaa takaisin" JavaScriptiin, jotta voit upottaa jonkun muuttujan koodistasi ja näytää sen käyttäjälle. Esimerkiksi, tämä tulostaa `kayttaja.nimi`:
```js {3}
-return (
-
- {user.name}
-
-);
+return
{kayttaja.nimi}
;
```
-You can also "escape into JavaScript" from JSX attributes, but you have to use curly braces *instead of* quotes. For example, `className="avatar"` passes the `"avatar"` string as the CSS class, but `src={user.imageUrl}` reads the JavaScript `user.imageUrl` variable value, and then passes that value as the `src` attribute:
+Voit myös "peruuttaa takaisin JavaScriptiin" JSX attribuutissa, mutta tässä täytyy käyttää aaltosulkeita lainausmerkkien sijaan. Esimerkiksi `className="avatar"` syöttää `"avatar"` merkkijonon CSS luokaksi, mutta `src={kayttaja.kuvanUrl}` lukee JavaScriptissa `kayttaja.kuvanUrl` muuttujan arvon ja palauttaa sen `src` attribuuttiin:
```js {3,4}
-return (
-
-);
+return ;
```
-You can put more complex expressions inside the JSX curly braces too, for example, [string concatenation](https://javascript.info/operators#string-concatenation-with-binary):
+JSX aaltosulkeisiin voi laittaa myös laajempia lausekkeita, esimerkiksi [merkkijonojen yhdistämistä](https://javascript.info/operators#string-concatenation-with-binary):
+
```js
-const user = {
- name: 'Hedy Lamarr',
- imageUrl: 'https://i.imgur.com/yXOvdOSs.jpg',
- imageSize: 90,
+const kayttaja = {
+ nimi: 'Hedy Lamarr',
+ kuvanUrl: 'https://i.imgur.com/yXOvdOSs.jpg',
+ kuvanKoko: 90,
};
-export default function Profile() {
+export default function Profiili() {
return (
<>
-
{user.name}
+
{kayttaja.nimi}
>
@@ -177,193 +167,162 @@ export default function Profile() {
-In the above example, `style={{}}` is not a special syntax, but a regular `{}` object inside the `style={ }` JSX curly braces. You can use the `style` attribute when your styles depend on JavaScript variables.
+Ylläolevasta esimerkissä `style={{}}` ei ole erityistä syntaksia, vaan normaali `{}` olio JSX aaltosulkeiden `style={ }` sisällä. Voit käyttää `style` attribuuttia kun tyylisi riippuu JavaScript muuttujista.
-## Conditional rendering {/*conditional-rendering*/}
+## Ehdollinen renderöinti {/* conditional-rendering */}
-In React, there is no special syntax for writing conditions. Instead, you'll use the same techniques as you use when writing regular JavaScript code. For example, you can use an [`if`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/if...else) statement to conditionally include JSX:
+Reactissa ei ole erityistä syntaksia ehtolauseiden kirjoittamiseen. Sen sijaan voit käyttää samoja tekniikoita kuin mitä käytät kirjoittaessasi tavallista JavaScript koodia. Esimerkiksi, voit käyttää [`if`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/if...else) lausetta sisällyttämään JSX koodia ehdollisesti:
```js
-let content;
-if (isLoggedIn) {
- content = ;
+let sisalto;
+if (onkoKirjautunutSisaan) {
+ sisalto = ;
} else {
- content = ;
+ sisalto = ;
}
-return (
-
- {content}
-
-);
+return
{sisalto}
;
```
-If you prefer more compact code, you can use the [conditional `?` operator](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Conditional_Operator). Unlike `if`, it works inside JSX:
+Mikäli suosit kompaktimpaa koodia, voit käyttää [`?` operaattoria](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Conditional_Operator). Toisin kuin `if, se toimii myös JSX:n sisällä:
```js
-
- {isLoggedIn ? (
-
- ) : (
-
- )}
-
+
{onkoKirjautunutSisaan ? : }
```
-When you don't need the `else` branch, you can also use a shorter [logical `&&` syntax](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Logical_AND#short-circuit_evaluation):
+Kun et tarvitse `else` osaa, voit käyttää lyhyempäää [loogista `&&` syntaksia](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Logical_AND#short-circuit_evaluation):
```js
-
- {isLoggedIn && }
-
+
{onkoKirjautunutSisaan && }
```
-All of these approaches also work for conditionally specifying attributes. If you're unfamiliar with some of this JavaScript syntax, you can start by always using `if...else`.
+Kaikki nämä tavat toimivat myös attribuuttien ehdolliseen määrittelyyn. Jos jokin tässä käyty JavaScript syntaksi ei ole tuttua, voit aina aloittaa käyttämällä `if...else`.
-## Rendering lists {/*rendering-lists*/}
+## Listojen renderöinti {/* rendering-lists */}
-You will rely on JavaScript features like [`for` loop](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for) and the [array `map()` function](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map) to render lists of components.
+Tulet käyttämään JavaScriptin ominaisuuksia kuten [`for` silmukkaa](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for) sekä [array `map()` funktiota](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map) komponenttilistojen renderöintiin.
-For example, let's say you have an array of products:
+Esimerkiksi, sanotaan, että sinulla on lista tuotteista:
```js
-const products = [
- { title: 'Cabbage', id: 1 },
- { title: 'Garlic', id: 2 },
- { title: 'Apple', id: 3 },
+const tuotteet = [
+ {otsikko: 'Kaali', id: 1},
+ {otsikko: 'Valkosipuli', id: 2},
+ {otsikko: 'Omena', id: 3},
];
```
-Inside your component, use the `map()` function to transform an array of products into an array of `
` items:
+Komponentin sisällä voit käyttää `map()` funktiota muuttaaksesi tuotelistan listaksi `
` has a `key` attribute. For each item in a list, you should pass a string or a number that uniquely identifies that item among its siblings. Usually, a key should be coming from your data, such as a database ID. React will rely on your keys to understand what happened if you later insert, delete, or reorder the items.
+Huomaa miten `
` elementillä on `key` attribuutti. Jokaiselle listan kohteelle tulisi antaa merkkijono tai numero, joka yksilöllisesti erottaa kohteen sen sisaruksista. Useimiten, avain tulisi suoraan tietolähteestä, kuten tietokannan ID kentästä. React hyödyntää avaimiasi ymmärtääkseen mitä tapahtui jos myöhemmin lisäät, poistat tai uudelleenjärjestät kohteita.
```js
-const products = [
- { title: 'Cabbage', isFruit: false, id: 1 },
- { title: 'Garlic', isFruit: false, id: 2 },
- { title: 'Apple', isFruit: true, id: 3 },
+const tuotteet = [
+ {otsikko: 'Kaali', onHedelma: false, id: 1},
+ {otsikko: 'Valkosipuli', onHedelma: false, id: 2},
+ {otsikko: 'Omena', onHedelma: true, id: 3},
];
-export default function ShoppingList() {
- const listItems = products.map(product =>
+export default function Ostoslista() {
+ const listaKohteet = tuotteet.map((tuote) => (
;
}
```
-## Responding to events {/*responding-to-events*/}
+## Vastaaminen tapahtumiin {/* responding-to-events */}
-You can respond to events by declaring event handler functions inside your components:
+Voit vastata tapahtumiin määrittelemällä tapahtumakäsittelijän komponettiesi sisällä:
```js {2-4,7}
-function MyButton() {
- function handleClick() {
- alert('You clicked me!');
+function Painonappi() {
+ function kunKlikataan() {
+ alert('Napsautit minua!');
}
- return (
-
- );
+ return ;
}
```
-Notice how `onClick={handleClick}` has no parentheses at the end! Do not _call_ the event handler function: you only need to *pass it down*. React will call your event handler when the user clicks the button.
+Huomaa miten `onClick={kunKlikataan}` ei sisällä sulkeita lopussa! Älä kutsu tapahtumakäsittelijää: sinun täytyy ainoastaan _antaa se_. React kutsuu tapahtumakäsittelijääsi kun käyttäjä napsauttaa painiketta.
-## Updating the screen {/*updating-the-screen*/}
+## Ruudun päivittäminen {/* updating-the-screen */}
-Often, you'll want your component to "remember" some information and display it. For example, maybe you want to count the number of times a button is clicked. To do this, add *state* to your component.
+Usein haluat, että komponenttisi "muistaa" jotain tietoa ja näyttää sitä. Esimerkiksi, ehkäpä haluat laskea montako kertaa painiketta on napsautettu. Tehdäksesi tämän, lisää tila eli _state_ komponenttiisi.
-First, import [`useState`](/apis/usestate) from React:
+Ensiksi, importtaa [`useState`](/apis/usestate) Reactista:
```js {1,4}
-import { useState } from 'react';
+import {useState} from 'react';
```
-Now you can declare a *state variable* inside your component:
+Nyt voit määritellä tilamuuttujan komponentin sisällä:
```js
-function MyButton() {
+function Painonappi() {
const [count, setCount] = useState(0);
```
-You will get two things from `useState`: the current state (`count`), and the function that lets you update it (`setCount`). You can give them any names, but the convention is to call them like `[something, setSomething]`.
+Saat kaksi asiaa `useState`:lta. Tämänhetkisen tilan (`count`), ja funktion jolla voit päivittää sitä (`setCount`). Voit antaa niille mitkä tahansa nimet, mutta käytäntö on kutsua niitä seuraavasti: `[something, setSomething]`.
-The first time the button is displayed, `count` will be `0` because you passed `0` to `useState()`. When you want to change state, call `setCount()` and pass the new value to it. Clicking this button will increment the counter:
+Ensimmäisen kerran kun painike näytetään, `count` on `0` koska `useState()` määrittelyssä annettiin `0`. Kun haluat muuttaa tilaa, kutsu `setCount()` funktiota ja anna sille uusi arvo. Painiketta napsauttamalla luku kasvaa:
```js {5}
-function MyButton() {
+function Painonappi() {
const [count, setCount] = useState(0);
- function handleClick() {
+ function kunKlikataan() {
setCount(count + 1);
}
- return (
-
- );
+ return ;
}
```
-React will call your component function again. This time, `count` will be `1`. Then it will be `2`. And so on.
+React kutsuu komponenttifunktiota uudelleen. Silloin `count` on `1`. Sitten se tulee olemaan `2`. Ja niin edellleen.
-If you render the same component multiple times, each will get its own state. Try clicking each button separately:
+Jos renderöit saman komponentin useasti, kullakin komponentilla on oma tilansa. Kokeile napsauttaa painikkeita erikseen:
```js
-import { useState } from 'react';
+import {useState} from 'react';
-function MyButton() {
+function Painonappi() {
const [count, setCount] = useState(0);
- function handleClick() {
+ function kunKlikataan() {
setCount(count + 1);
}
- return (
-
- );
+ return ;
}
export default function MyApp() {
return (
-
Counters that update separately
-
-
+
Laskurit, jotka päivittyvät erikseen
+
+
);
}
@@ -378,35 +337,34 @@ button {
-Notice how each button "remembers" its own `count` state and doesn't affect other buttons.
+Huomaa miten kukin painike "muistaa" sen oman `count` tilan eikä se vaikuta muihin painikkeisiin.
-## Using Hooks {/*using-hooks*/}
+## Hookkien käyttäminen {/* using-hooks */}
-Functions starting with `use` are called Hooks. `useState` is a built-in Hook provided by React. You can find other built-in Hooks in the [React API reference](/apis). You can also write your own Hooks by combining the existing ones.
+Funktiot jotka alkavat sanalla `use` ovat hookkeja. `useState` on Reactin sisäänrakennettu hookki. Löydät lisää sisäänrakennettuja hookkeja [React API referenssistä](/apis). VOit myös kirjoittaa omia hookkeja olemassaolevia yhdistelemällä.
-Hooks are more restrictive than regular functions. You can only call Hooks *at the top level* of your components (or other Hooks). If you want to `useState` in a condition or a loop, extract a new component and put it there.
+Hookit ovat rajoittavampia kuin normaalit funktiot. Voit kutsua hookkeja _ainoastaan_ komponentin päätasolta (tai muista hookeista). Jos haluat käyttää `useState` hookkia ehdollisesti tai loopissa, luo uusi komponentti ja sijoita se sinne.
-## Sharing data between components {/*sharing-data-between-components*/}
+## Tiedon jakaminen komponenttien välillä {/* sharing-data-between-components */}
-In the previous example, each `MyButton` had its own independent `count`, and when each button was clicked, only the `count` for the button clicked changed:
+Aikaisemmassa esimerkissä jokaisella `Painonappi` komponentilla oli sen oma `count` tila, sekä kun yksittäistä painiketta napsautettiin, vain sen painikkeen `count` tila muuttui:
-Before clicking, each MyButton has a count value set to zero.
-
+Ennen napsautusta, jokaisella Painonappi komponentilla tila on asetettuna nollaksi.
-After clicking, only one MyButton count value has updated.
+Napsautuksen jälkeen, vain yhdellä Painonappi komponentilla tila on päivittynyt.
-However, often you'll need components to *share data and always update together*.
+However, often you'll need components to _share data and always update together_.
To make both `MyButton` components display the same `count` and update together, you need to move the state from the individual buttons "upwards" to the closest component containing all of them.
@@ -430,7 +388,7 @@ After clicking, count updates in MyApp and the new value is passed to both child
Now when you click either button, the `count` in `MyApp` will change, which will change both of the counts in `MyButton`. Here's how you can express this in code.
-First, *move the state up* from `MyButton` into `MyApp`:
+First, _move the state up_ from `MyButton` into `MyApp`:
```js {2,6-10}
function MyButton() {
@@ -454,7 +412,7 @@ export default function MyApp() {
}
```
-Then, *pass the state down* from `MyApp` to each `MyButton`, together with the shared click handler. You can pass information to `MyButton` using the JSX curly braces, just like you previously did with built-in tags like ``:
+Then, _pass the state down_ from `MyApp` to each `MyButton`, together with the shared click handler. You can pass information to `MyButton` using the JSX curly braces, just like you previously did with built-in tags like ``:
```js {11-12}
export default function MyApp() {
@@ -474,17 +432,13 @@ export default function MyApp() {
}
```
-The information you pass down like this is called _props_. Now the `MyApp` component contains the `count` state and the `handleClick` event handler, and *passes both of them down as props* to each of the buttons.
+The information you pass down like this is called _props_. Now the `MyApp` component contains the `count` state and the `handleClick` event handler, and _passes both of them down as props_ to each of the buttons.
-Finally, change `MyButton` to *read* the props you have passed from its parent component:
+Finally, change `MyButton` to _read_ the props you have passed from its parent component:
```js {1,3}
-function MyButton({ count, onClick }) {
- return (
-
- );
+function MyButton({count, onClick}) {
+ return ;
}
```
@@ -495,14 +449,10 @@ This is called "lifting state up". By moving state up, we've shared it between c
```js
-import { useState } from 'react';
+import {useState} from 'react';
-function MyButton({ count, onClick }) {
- return (
-
- );
+function MyButton({count, onClick}) {
+ return ;
}
export default function MyApp() {
@@ -531,7 +481,7 @@ button {
-## Next Steps {/*next-steps*/}
+## Next Steps {/* next-steps */}
By now, you know the basics of how to write React code!
From 81b8d027ee86dff9e7d7a4fdfccef3355b21a087 Mon Sep 17 00:00:00 2001
From: Miro Rauhala <4082806+mirorauhala@users.noreply.github.com>
Date: Sat, 7 May 2022 14:35:09 +0300
Subject: [PATCH 04/80] style
---
beta/src/pages/learn/index.md | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/beta/src/pages/learn/index.md b/beta/src/pages/learn/index.md
index 2aa15be40..328b6ec41 100644
--- a/beta/src/pages/learn/index.md
+++ b/beta/src/pages/learn/index.md
@@ -127,7 +127,6 @@ return ;
JSX aaltosulkeisiin voi laittaa myös laajempia lausekkeita, esimerkiksi [merkkijonojen yhdistämistä](https://javascript.info/operators#string-concatenation-with-binary):
-
```js
@@ -243,7 +242,7 @@ export default function Ostoslista() {
));
- return
{listaKohteet}
;
+ return
{listaKohteet}
;
}
```
@@ -263,7 +262,7 @@ function Painonappi() {
}
```
-Huomaa miten `onClick={kunKlikataan}` ei sisällä sulkeita lopussa! Älä kutsu tapahtumakäsittelijää: sinun täytyy ainoastaan _antaa se_. React kutsuu tapahtumakäsittelijääsi kun käyttäjä napsauttaa painiketta.
+Huomaa miten `onClick={kunKlikataan}` ei sisällä sulkeita lopussa! Älä kutsu tapahtumakäsittelijää: sinun täytyy ainoastaan _antaa se_. React kutsuu tapahtumakäsittelijääsi kun käyttäjä napsauttaa painiketta.
## Ruudun päivittäminen {/* updating-the-screen */}
@@ -354,6 +353,7 @@ Aikaisemmassa esimerkissä jokaisella `Painonappi` komponentilla oli sen oma `co
Ennen napsautusta, jokaisella Painonappi komponentilla tila on asetettuna nollaksi.
+
From 7cad9abb204220399a8b7e90ef0bb5e1671300ce Mon Sep 17 00:00:00 2001
From: Miro Rauhala <4082806+mirorauhala@users.noreply.github.com>
Date: Sat, 7 May 2022 14:35:24 +0300
Subject: [PATCH 05/80] fix spelling
---
beta/src/pages/learn/index.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/beta/src/pages/learn/index.md b/beta/src/pages/learn/index.md
index 328b6ec41..b2b95198a 100644
--- a/beta/src/pages/learn/index.md
+++ b/beta/src/pages/learn/index.md
@@ -346,7 +346,7 @@ Hookit ovat rajoittavampia kuin normaalit funktiot. Voit kutsua hookkeja _ainoas
## Tiedon jakaminen komponenttien välillä {/* sharing-data-between-components */}
-Aikaisemmassa esimerkissä jokaisella `Painonappi` komponentilla oli sen oma `count` tila, sekä kun yksittäistä painiketta napsautettiin, vain sen painikkeen `count` tila muuttui:
+Aikaisemmassa esimerkissä jokaisella `Painonappi` komponentilla oli sen oma `count` tila, ja kun yksittäistä painiketta napsautettiin, vain painetun painikkeen `count` tila muuttui:
From 9b694d26f478a2a2e8b8ca2ca5dd085cc530eef6 Mon Sep 17 00:00:00 2001
From: Miro Rauhala <4082806+mirorauhala@users.noreply.github.com>
Date: Sat, 7 May 2022 15:04:41 +0300
Subject: [PATCH 06/80] Add props
---
beta/GLOSSARY.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/beta/GLOSSARY.md b/beta/GLOSSARY.md
index d8a523349..9125a4d8f 100644
--- a/beta/GLOSSARY.md
+++ b/beta/GLOSSARY.md
@@ -1,9 +1,9 @@
# Glossary / Sanasto
-
## React specific
- **React hook**: React hookki
+- **props**: proppi, propit
## General
From 050887a5b4db4a9d952cbb33364290df7cac9512 Mon Sep 17 00:00:00 2001
From: Miro Rauhala <4082806+mirorauhala@users.noreply.github.com>
Date: Sat, 7 May 2022 15:04:47 +0300
Subject: [PATCH 07/80] Finish page
---
beta/src/pages/learn/index.md | 50 +++++++++++++++++------------------
1 file changed, 25 insertions(+), 25 deletions(-)
diff --git a/beta/src/pages/learn/index.md b/beta/src/pages/learn/index.md
index b2b95198a..7833e2616 100644
--- a/beta/src/pages/learn/index.md
+++ b/beta/src/pages/learn/index.md
@@ -350,13 +350,13 @@ Aikaisemmassa esimerkissä jokaisella `Painonappi` komponentilla oli sen oma `co
-
+
Ennen napsautusta, jokaisella Painonappi komponentilla tila on asetettuna nollaksi.
-
+
Napsautuksen jälkeen, vain yhdellä Painonappi komponentilla tila on päivittynyt.
@@ -364,35 +364,35 @@ Napsautuksen jälkeen, vain yhdellä Painonappi komponentilla tila on päivittyn
-However, often you'll need components to _share data and always update together_.
+Usein kuitenkin komponenttien täytyy _jakaa tietoa ja päivittyä sen mukana_.
-To make both `MyButton` components display the same `count` and update together, you need to move the state from the individual buttons "upwards" to the closest component containing all of them.
+Jotta molemmat `MyButton` komponentit näyttävät saman `count` luvun sekä päivittyvät sen mukana, täytyy yksilöllinen tila poistaa nappi -komponenteilta "ylöspäin" lähimmälle pääkomponentille.
-In this example, it is `MyApp`:
+Tässä esimerkissä se on `MyApp`:
-
+
-Before clicking, count is stored in MyApp and passed down to both children as props.
+Ennen napsautusta, count tila on MyApp komponentissa ja annettu molemmille lapsikomponenteille proppeina.
-
+
-After clicking, count updates in MyApp and the new value is passed to both children as props.
+Klikkauksen jälkeen tila päivittyy MyApp komponentissa sekä uusi arvo on annettu molemmille lapsikomponenteille proppeina.
-Now when you click either button, the `count` in `MyApp` will change, which will change both of the counts in `MyButton`. Here's how you can express this in code.
+Nyt kun klikkaat kumpaakin painiketta, `count` tila `MyApp` komponentissa muuttuu. Tämä muutos muuttaa molempien `MyButton` komponenttien tilat.Tässä vielä miten se tehtäisiin koodissa.
-First, _move the state up_ from `MyButton` into `MyApp`:
+Ensiksi, _siirrä tila ylöspäin_ `MyButton` komponentista `MyApp` komponenttiin:
```js {2,6-10}
function MyButton() {
- // ... we're moving code from here ...
+ // ... siirretään tila täältä ...
}
export default function MyApp() {
@@ -404,7 +404,7 @@ export default function MyApp() {
return (
-
Counters that update separately
+
Laskurit, jotka päivittyvät erikseen
@@ -412,7 +412,7 @@ export default function MyApp() {
}
```
-Then, _pass the state down_ from `MyApp` to each `MyButton`, together with the shared click handler. You can pass information to `MyButton` using the JSX curly braces, just like you previously did with built-in tags like ``:
+Sitten _anna tila alaspäin_ `MyApp` komponentissa kuhunkin `MyButton` komponenttiin yhdessä klikkauksen tapahtumakäsittelijän kanssa. Voit antaa tietoa `MyButton` komponenttiin käyttäen JSX aaltosulkeita, aivan kuten aiemmin teit sisäänrakennettujen `` tagien kanssa:
```js {11-12}
export default function MyApp() {
@@ -424,7 +424,7 @@ export default function MyApp() {
return (
-
Counters that update together
+
Laskurit jotka päivittyvät yhdessä
@@ -432,19 +432,19 @@ export default function MyApp() {
}
```
-The information you pass down like this is called _props_. Now the `MyApp` component contains the `count` state and the `handleClick` event handler, and _passes both of them down as props_ to each of the buttons.
+Tietoa, jota annat alaspäin näin kutsutaan _propeiksi_ (engl. props). Nyt `MyApp` komponentti sisältää `count` tilan, `handleClick` tapahtumakäsittelijän, sekä _antaa molemmat näistä proppeina_ kullekin painikkeelle.
-Finally, change `MyButton` to _read_ the props you have passed from its parent component:
+Lopuksi, mutta `MyButton` _lukemaan_ propit, jotka annoit sille sen pääkomponentista:
```js {1,3}
function MyButton({count, onClick}) {
- return ;
+ return ;
}
```
-When you click the button, the `onClick` handler fires. Each button's `onClick` prop was set to the `handleClick` function inside `MyApp`, so the code inside of it runs. That code calls `setCount(count + 1)`, incrementing the `count` state variable. The new `count` value is passed as a prop to each button, so they all show the new value.
+Kun klikkaat painiketta, `onClick` tapahtumakäsittelijää kutsutaan. Jokaisen painikkeen `onClick` proppi on asetettu `handleClick` funktioon `MyApp` komponentissa, joten koodi sen sisällä suoritetaan. Se koodi kutsuu `setCount(count + 1)`, nostaen `count` tilamuuttujaa. Uusi `count` tila annetaan proppina kullekin painikkeelle jolloin ne kaikki näyttävät samaa uutta arvoa.
-This is called "lifting state up". By moving state up, we've shared it between components.
+Tätä kutsutaan "tilan nostamiseksi ylös". Siirtämällä tilaa ylös jaamme sitä komponenttien välillä.
@@ -452,7 +452,7 @@ This is called "lifting state up". By moving state up, we've shared it between c
import {useState} from 'react';
function MyButton({count, onClick}) {
- return ;
+ return ;
}
export default function MyApp() {
@@ -464,7 +464,7 @@ export default function MyApp() {
return (
-
Counters that update together
+
Laskurit jotka päivittyvät yhdessä
@@ -481,8 +481,8 @@ button {
-## Next Steps {/* next-steps */}
+## Seuraavat vaiheet {/* next-steps */}
-By now, you know the basics of how to write React code!
+Tähän mennessä osaat miten kirjoitetaan perusteet React koodista!
-Head to [Thinking in React](/learn/thinking-in-react) to see how it feels to build a UI with React in practice.
+Siirry seuraavaksi [Ajattelua Reactissa](/learn/thinking-in-react) nähdäksesi, miltä käyttöliittymän rakentaminen Reactilla tuntuu käytännössä.
From 830cc71ddcb16f715fcc60fcba0b9004be11ff70 Mon Sep 17 00:00:00 2001
From: Miro Rauhala <4082806+mirorauhala@users.noreply.github.com>
Date: Sat, 7 May 2022 16:15:42 +0300
Subject: [PATCH 08/80] Add more words
---
beta/GLOSSARY.md | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/beta/GLOSSARY.md b/beta/GLOSSARY.md
index 9125a4d8f..3b02c4f4c 100644
--- a/beta/GLOSSARY.md
+++ b/beta/GLOSSARY.md
@@ -4,8 +4,13 @@
- **React hook**: React hookki
- **props**: proppi, propit
+- **pure component**: puhdas komponentti
## General
+- **export**: exportata, viedä
+- **import**: importata, tuoda
- **build tool**: käännöstyökalu
- **framework**: ohjelmistokehys
+- **codebase**: koodipohja
+- **property**: en keksinyt järkevää suomennosta, property
From 723ff8621386c78630c37edc1f9c24ddc4aab611 Mon Sep 17 00:00:00 2001
From: Miro Rauhala <4082806+mirorauhala@users.noreply.github.com>
Date: Sat, 7 May 2022 16:15:51 +0300
Subject: [PATCH 09/80] Translate page
---
beta/src/pages/learn/describing-the-ui.md | 300 +++++++++++-----------
1 file changed, 148 insertions(+), 152 deletions(-)
diff --git a/beta/src/pages/learn/describing-the-ui.md b/beta/src/pages/learn/describing-the-ui.md
index 442e1407a..aad8c7b0b 100644
--- a/beta/src/pages/learn/describing-the-ui.md
+++ b/beta/src/pages/learn/describing-the-ui.md
@@ -1,46 +1,41 @@
---
-title: Describing the UI
+title: Käyttöliittymän kuvaus
---
-React is a JavaScript library for rendering user interfaces (UI). UI is built from small units like buttons, text, and images. React lets you combine them into reusable, nestable *components.* From web sites to phone apps, everything on the screen can be broken down into components. In this chapter, you'll learn to create, customize, and conditionally display React components.
+React on JavaScript kirjasto käyttöliittymien (UI) renderöintiin. Käyttöliittymät rakennetaan pienistä osista kuten painikkeista, tekstistä ja kuvista. Reactilla voit yhdistää näytä uudelleen käytettäviksi, sisäkkäisiksi _komponenteiksi_. Verkkosivuista puhelinsovelluksiin, kaikki näytöllä voidaan hajottaa komponenteiksi. Tässä luvussa opit luomaan, mukauttamaan, sekä ehdollisesti näyttämään React komponentteja.
-* [How to write your first React component](/learn/your-first-component)
-* [When and how to create multi-component files](/learn/importing-and-exporting-components)
-* [How to add markup to JavaScript with JSX](/learn/writing-markup-with-jsx)
-* [How to use curly braces with JSX to access JavaScript functionality from your components](/learn/javascript-in-jsx-with-curly-braces)
-* [How to configure components with props](/learn/passing-props-to-a-component)
-* [How to conditionally render components](/learn/conditional-rendering)
-* [How to render multiple components at a time](/learn/rendering-lists)
-* [How to avoid confusing bugs by keeping components pure](/learn/keeping-components-pure)
+- [Miten kirjoitat ensimmäisen komponenttisi](/learn/your-first-component)
+- [Miten ja milloin luot monikomponenttisia tiedostoja](/learn/importing-and-exporting-components)
+- [Miten lisäät merkintäkoodia JavaScriptiin JSX hyödyntäen](/learn/writing-markup-with-jsx)
+- [Miten käyttää aaltosulkeita JSX:n kanssa JavaScript toiminnallisuuksien hyödyntämiseksi komponenteissa](/learn/javascript-in-jsx-with-curly-braces)
+- [Miten mukauttaa komponentteja propeilla](/learn/passing-props-to-a-component)
+- [Miten renderöidä ehdollisesti komponentteja](/learn/conditional-rendering)
+- [Miten renderöidä useita komponentteja samanaikaisesti](/learn/rendering-lists)
+- [Miten välttää bugeja pitämällä komponentit puhtaina](/learn/keeping-components-pure)
-## Your first component {/*your-first-component*/}
+## Ensimmäinen komponenttisi {/* your-first-component */}
-React applications are built from isolated pieces of UI called "components". A React component is a JavaScript function that you can sprinkle with markup. Components can be as small as a button, or as large as an entire page. Here is a `Gallery` component rendering three `Profile` components:
+React sovellukset rakennetaan eristetyistä käyttöliittymäpalasista, joita kutsutaan "komponenteiksi". React komponentti on JavaScript funktio johon voit ripotella merkintäkoodia. Komponentit voivat olla pieniä kuten painikkeita, tai suuria kuten kokonaisia sivuja. Tässä on `Gallery` komponentti, joka renderöi kolme `Profile` komponenttia:
```js
function Profile() {
- return (
-
- );
+ return ;
}
export default function Gallery() {
return (
-
Amazing scientists
+
Mahtavia tutkijoita
@@ -50,21 +45,23 @@ export default function Gallery() {
```
```css
-img { margin: 0 10px 10px 0; height: 90px; }
+img {
+ margin: 0 10px 10px 0;
+ height: 90px;
+}
```
-Read **[Your First Component](/learn/your-first-component)** to learn how to declare and use React components.
+Lue **[Ensimmäinen komponenttisi](/learn/your-first-component)** oppiaksesi miten määritellä ja käyttää React komponentteja.
-## Importing and exporting components {/*importing-and-exporting-components*/}
-
-You can declare many components in one file, but large files can get difficult to navigate. To solve this, you can *export* a component into its own file, and then *import* that component from another file:
+## Komponettien tuonti ja vienti {/* importing-and-exporting-components */}
+Voit määritellä monia komponentteja yhdessä tiedostossa, mutta navigointi isojen tiedostojen sisällä saattaa muuttua hankalaksi. Tämän ratkaisemiseksi, voit _exportata_ eli viedä komponentin sen omaan tiedostoon ja sitten _importata_ eli tuoda sen komponentin toisesta tiedostosta:
@@ -72,9 +69,7 @@ You can declare many components in one file, but large files can get difficult t
import Gallery from './Gallery.js';
export default function App() {
- return (
-
- );
+ return ;
}
```
@@ -95,39 +90,36 @@ export default function Gallery() {
```js Profile.js
export default function Profile() {
- return (
-
- );
+ return ;
}
```
```css
-img { margin: 0 10px 10px 0; }
+img {
+ margin: 0 10px 10px 0;
+}
```
-Read **[Importing and Exporting Components](/learn/importing-and-exporting-components)** to learn how to split components into their own files.
+Lue **[Komponenttien tuonti ja vienti](/learn/importing-and-exporting-components)** oppiaksesi miten komponentteja voidaan jakaa omiin tiedostoihin.
-## Writing markup with JSX {/*writing-markup-with-jsx*/}
+## Merkintäkoodin kirjoittaminen JSX:llä {/* writing-markup-with-jsx */}
-Each React component is a JavaScript function that may contain some markup that React renders into the browser. React components use a syntax extension called JSX to represent that markup. JSX looks a lot like HTML, but it is a bit stricter and can display dynamic information.
+Jokainen React komponentti on JavaScript funktio, joka saattaa sisältää jotain merkintäkoodia, jonka React renderöi selaimeen. React komponentit käyttävät syntaksilisäosaa nimeltään JSX edustamaan kyseistä merkintää. JSX näyttää pitkälti samalta kuin HTML, mutta on hieman tiukempaa ja se voi näyttää dynaamista informaatiota.
-If we paste existing HTML markup into a React component, it won't always work:
+Jos liitämme olemassa olevaa HTML koodia React komponenttiin, se ei aina välttämättä toimi:
```js
export default function TodoList() {
return (
- // This doesn't quite work!
+ // Tämä ei ihan toimi!
Hedy Lamarr's Todos
-If you have existing HTML like this, you can fix it using a [converter](https://transform.tools/html-to-jsx):
+Jos sinulla on olemassa olevaa HTML koodia, voit korjata sen käyttämällä [muunninta](https://transform.tools/html-to-jsx):
@@ -174,20 +168,22 @@ export default function TodoList() {
```
```css
-img { height: 90px; }
+img {
+ height: 90px;
+}
```
-Read **[Writing Markup with JSX](/learn/writing-markup-with-jsx)** to learn how to write valid JSX.
+Lue **[Merkintäkoodin kirjoittaminen JSX:llä](/learn/writing-markup-with-jsx)** oppiaksesi miten kirjoitetaan kelvollista JSX koodia.
-## JavaScript in JSX with curly braces {/*javascript-in-jsx-with-curly-braces*/}
+## JavaScriptia JSX:ssa aaltosulkeilla {/* javascript-in-jsx-with-curly-braces */}
-JSX lets you write HTML-like markup inside a JavaScript file, keeping rendering logic and content in the same place. Sometimes you will want to add a little JavaScript logic or reference a dynamic property inside that markup. In this situation, you can use curly braces in your JSX to "open a window" to JavaScript:
+JSX antaa sinun kirjoittaa HTML-näköistä merkintäkoodia JavaScript tiedoston sisällä, pitäen renderöintilogiikan ja sisällön samassa paikassa. Joskus haluat lisätä vähäsen JavaScript logiikaa tai viitata dynaamiseen propertyyn merkintäkoodin sisällä. Tässä tapauksessa voit käyttää aaltosulkeita JSX koodissasi avataksesi "pienen ikkunan" takaisin JavaScriptiin:
@@ -196,8 +192,8 @@ const person = {
name: 'Gregorio Y. Zara',
theme: {
backgroundColor: 'black',
- color: 'pink'
- }
+ color: 'pink',
+ },
};
export default function TodoList() {
@@ -220,27 +216,35 @@ export default function TodoList() {
```
```css
-body { padding: 0; margin: 0 }
-body > div > div { padding: 20px; }
-.avatar { border-radius: 50%; height: 90px; }
+body {
+ padding: 0;
+ margin: 0;
+}
+body > div > div {
+ padding: 20px;
+}
+.avatar {
+ border-radius: 50%;
+ height: 90px;
+}
```
-Read **[JavaScript in JSX with Curly Braces](/learn/javascript-in-jsx-with-curly-braces)** to learn how to access JavaScript data from JSX.
+Lue **[JavaScriptia JSX:ssa aaltosulkeilla](/learn/javascript-in-jsx-with-curly-braces)** oppiaksesi miten JavaScript tietoa voidaan käsitellä JSX koodissa.
-## Passing props to a component {/*passing-props-to-a-component*/}
+## Proppien välittäminen komponenteille {/* passing-props-to-a-component */}
-React components use *props* to communicate with each other. Every parent component can pass some information to its child components by giving them props. Props might remind you of HTML attributes, but you can pass any JavaScript value through them, including objects, arrays, functions, and even JSX!
+React komponentit käyttävät _proppeja_ kommunikoidakseen toisten välillä. Jokainen pääkomponentti voi antaa tietoa sen lapsikomponeteilleen antamalla ne propseina. Propsit saattavat muistuttaa HTML attribuuteista, mutta voit antaa mitä tahansa JavaScript arovoa niiden välillä, esim. oliota, listoja, funktioita ja myös JSX koodia!
```js
-import { getImageUrl } from './utils.js'
+import {getImageUrl} from './utils.js';
export default function Profile() {
return (
@@ -249,14 +253,14 @@ export default function Profile() {
size={100}
person={{
name: 'Katsuko Saruhashi',
- imageId: 'YfeOqp2'
+ imageId: 'YfeOqp2',
}}
/>
);
}
-function Avatar({ person, size }) {
+function Avatar({person, size}) {
return (
- {children}
-
- );
+function Card({children}) {
+ return
{children}
;
}
-
```
```js utils.js
export function getImageUrl(person, size = 's') {
- return (
- 'https://i.imgur.com/' +
- person.imageId +
- size +
- '.jpg'
- );
+ return 'https://i.imgur.com/' + person.imageId + size + '.jpg';
}
```
@@ -310,20 +304,20 @@ export function getImageUrl(person, size = 's') {
-Read **[Passing Props to a Component](/learn/passing-props-to-a-component)** to learn how to pass and read props.
+Lue **[Proppien välittäminen komponenteille](/learn/passing-props-to-a-component)** oppiaksesi miten proppeja annetaan ja luetaan.
-## Conditional rendering {/*conditional-rendering*/}
+## Ehdollinen renderöinti {/* conditional-rendering */}
-Your components will often need to display different things depending on different conditions. In React, you can conditionally render JSX using JavaScript syntax like `if` statements, `&&`, and `? :` operators.
+Komponenteissasi usein täytyy näyttää tietoa riippuen erilaisista ehdoista. Reactissa voit renderöidä ehdollisesti JSX koodia käyttäen JavaScript syntaksia kuten `if` lausetta, `&&` ja `? :` operaattoreita.
-In this example, the JavaScript `&&` operator is used to conditionally render a checkmark:
+Tässä esimerkissä JavaScript `&&` operaattoria käytetään valintamerkin ehdolliseen renderöintiin:
```js
-function Item({ name, isPacked }) {
+function Item({name, isPacked}) {
return (
);
@@ -358,36 +343,33 @@ export default function PackingList() {
-Read **[Conditional Rendering](/learn/conditional-rendering)** to learn the different ways to render content conditionally.
+Lue **[Ehdollinen renderöinti](/learn/conditional-rendering)** oppiaksesi eri tavat renderöidä ehdollisesti.
-## Rendering lists {/*rendering-lists*/}
+## Listojen renderöinti {/* rendering-lists */}
-You will often want to display multiple similar components from a collection of data. You can use JavaScript's `filter()` and `map()` with React to filter and transform your array of data into an array of components.
+Usein haluat näyttää useita samoja komponentteja listasta dataa. Voit käyttää JavaScriptin `filter()` ja `map()` funktioita Reactissa listan suodattamiseksi ja muuttamiseksi uuteen listaan komponenteista.
-For each array item, you will need to specify a `key`. Usually, you will want to use an ID from the database as a `key`. Keys let React keep track of each item's place in the list even if the list changes.
+Jokaiselle listan kohteelle täytyy määrittää `key` proppi. Yleensä voit käyttää tietokannan ID kenttää `key` propin arvona. Näin React muistaa listan jokaisen kohteen järjestyksen mikäli lista muuttuu.
```js App.js
-import { people } from './data.js';
-import { getImageUrl } from './utils.js';
+import {people} from './data.js';
+import {getImageUrl} from './utils.js';
export default function List() {
- const listItems = people.map(person =>
+ const listItems = people.map((person) => (
-
+
{person.name}:
{' ' + person.profession + ' '}
known for {person.accomplishment}
- );
+ ));
return (
Scientists
@@ -398,78 +380,92 @@ export default function List() {
```
```js data.js
-export const people = [{
- id: 0,
- name: 'Creola Katherine Johnson',
- profession: 'mathematician',
- accomplishment: 'spaceflight calculations',
- imageId: 'MK3eW3A'
-}, {
- id: 1,
- name: 'Mario José Molina-Pasquel Henríquez',
- profession: 'chemist',
- accomplishment: 'discovery of Arctic ozone hole',
- imageId: 'mynHUSa'
-}, {
- id: 2,
- name: 'Mohammad Abdus Salam',
- profession: 'physicist',
- accomplishment: 'electromagnetism theory',
- imageId: 'bE7W1ji'
-}, {
- id: 3,
- name: 'Percy Lavon Julian',
- profession: 'chemist',
- accomplishment: 'pioneering cortisone drugs, steroids and birth control pills',
- imageId: 'IOjWm71'
-}, {
- id: 4,
- name: 'Subrahmanyan Chandrasekhar',
- profession: 'astrophysicist',
- accomplishment: 'white dwarf star mass calculations',
- imageId: 'lrWQx8l'
-}];
+export const people = [
+ {
+ id: 0,
+ name: 'Creola Katherine Johnson',
+ profession: 'mathematician',
+ accomplishment: 'spaceflight calculations',
+ imageId: 'MK3eW3A',
+ },
+ {
+ id: 1,
+ name: 'Mario José Molina-Pasquel Henríquez',
+ profession: 'chemist',
+ accomplishment: 'discovery of Arctic ozone hole',
+ imageId: 'mynHUSa',
+ },
+ {
+ id: 2,
+ name: 'Mohammad Abdus Salam',
+ profession: 'physicist',
+ accomplishment: 'electromagnetism theory',
+ imageId: 'bE7W1ji',
+ },
+ {
+ id: 3,
+ name: 'Percy Lavon Julian',
+ profession: 'chemist',
+ accomplishment:
+ 'pioneering cortisone drugs, steroids and birth control pills',
+ imageId: 'IOjWm71',
+ },
+ {
+ id: 4,
+ name: 'Subrahmanyan Chandrasekhar',
+ profession: 'astrophysicist',
+ accomplishment: 'white dwarf star mass calculations',
+ imageId: 'lrWQx8l',
+ },
+];
```
```js utils.js
export function getImageUrl(person) {
- return (
- 'https://i.imgur.com/' +
- person.imageId +
- 's.jpg'
- );
+ return 'https://i.imgur.com/' + person.imageId + 's.jpg';
}
```
```css
-ul { list-style-type: none; padding: 0px 10px; }
+ul {
+ list-style-type: none;
+ padding: 0px 10px;
+}
li {
margin-bottom: 10px;
display: grid;
grid-template-columns: 1fr 1fr;
align-items: center;
}
-img { width: 100px; height: 100px; border-radius: 50%; }
-h1 { font-size: 22px; }
-h2 { font-size: 20px; }
+img {
+ width: 100px;
+ height: 100px;
+ border-radius: 50%;
+}
+h1 {
+ font-size: 22px;
+}
+h2 {
+ font-size: 20px;
+}
```
-Read **[Rendering Lists](/learn/rendering-lists)** to learn how to render a list of components, and how to choose a key.
+Lue **[Listojen renderöinti](/learn/rendering-lists)** oppiaksesi miten renderöidään listoja komponenteista sekä miten valitaan avain.
-## Keeping components pure {/*keeping-components-pure*/}
+## Komponenttien pitäminen puhtaina {/* keeping-components-pure */}
-Some JavaScript functions are “pure.” A pure function:
+Jotkin JavaScript funktiot ovat "puhtaita". Puhdas funktio on seuraavanlainen:
-* **Minds its own business.** It does not change any objects or variables that existed before it was called.
-* **Same inputs, same output.** Given the same inputs, a pure function should always return the same result.
+- **Hoitaa omia asioitaan.** Se ei muuta objekteja tai muuttujia, jotka olivat olemassa ennen sen kutsumista.
+- **Same inputs, same output.** Kun annetaan samat syötteet, puhtaan funktion tulisi aina palauttaa sama tulos.
-By strictly only writing your components as pure functions, you can avoid an entire class of baffling bugs and unpredictable behavior as your codebase grows. Here is an example of an impure component:
+Tiukasti kirjoittamalla vain puhtaita komponentteja, voit välttää kokonaisen kokoelman hämmentäviä bugeja ja ennalta arvaamatonta toimintaa koodipohjan kasvaessa. Tässä on esimerkki epäpuhtaasta komponentista:
@@ -477,7 +473,7 @@ By strictly only writing your components as pure functions, you can avoid an ent
let guest = 0;
function Cup() {
- // Bad: changing a preexisting variable!
+ // Huono: muuttaa olemassa olevaa muuttujaa!
guest = guest + 1;
return
Tea cup for guest #{guest}
;
}
@@ -489,18 +485,18 @@ export default function TeaSet() {
>
- )
+ );
}
```
-You can make this component pure by passing a prop instead of modifying a preexisting variable:
+Voit tehdä tästä komponentista puhtaan antamalla sille propin olemassa olevan muuttujan muuttamisen sijaan:
```js
-function Cup({ guest }) {
+function Cup({guest}) {
return
Tea cup for guest #{guest}
;
}
@@ -519,12 +515,12 @@ export default function TeaSet() {
-Read **[Keeping Components Pure](/learn/keeping-components-pure)** to learn how to write components as pure, predictable functions.
+Lue **[Komponenttien pitäminen puhtaana](/learn/keeping-components-pure)** oppiaksesi miten kirjoitetaan puhtaita, ennalta-arvattavia komponentteja.
-## What's next? {/*whats-next*/}
+## Mitä seuraavaksi? {/* whats-next */}
-Head over to [Your First Component](/learn/your-first-component) to start reading this chapter page by page!
+Siirry seuraavaksi [Ensimmäinen komponenttisi](/learn/your-first-component) lukeaksesi tämän luvun sivu kerrallaan!
-Or, if you're already familiar with these topics, why not read about [Adding Interactivity](/learn/adding-interactivity)?
+Tai, jos aiheet ovat jo tuttuja, mikset lukisi [Interaktiivisuuden lisääminen](/learn/adding-interactivity) lukua?
From 81b9b70330d28208fa6b18d1fbce488ef6ee2453 Mon Sep 17 00:00:00 2001
From: Miro Rauhala <4082806+mirorauhala@users.noreply.github.com>
Date: Sat, 7 May 2022 16:15:58 +0300
Subject: [PATCH 10/80] Translate menu
---
beta/src/sidebarLearn.json | 20 ++++++++++----------
1 file changed, 10 insertions(+), 10 deletions(-)
diff --git a/beta/src/sidebarLearn.json b/beta/src/sidebarLearn.json
index 8e37bf5ac..16356621b 100644
--- a/beta/src/sidebarLearn.json
+++ b/beta/src/sidebarLearn.json
@@ -30,7 +30,7 @@
]
},
{
- "title": "Quick Start",
+ "title": "Pika-aloitus",
"path": "/learn",
"routes": [
{
@@ -40,40 +40,40 @@
]
},
{
- "title": "Describing the UI",
+ "title": "Käyttöliittymän kuvaus",
"tags": [],
"path": "/learn/describing-the-ui",
"routes": [
{
- "title": "Your First Component",
+ "title": "Ensimmäinen komponenttisi",
"path": "/learn/your-first-component"
},
{
- "title": "Importing and Exporting Components",
+ "title": "Komponenttien tuonti ja vienti",
"path": "/learn/importing-and-exporting-components"
},
{
- "title": "Writing Markup with JSX",
+ "title": "Merkintäkoodin kirjoittaminen JSX:llä",
"path": "/learn/writing-markup-with-jsx"
},
{
- "title": "JavaScript in JSX with Curly Braces",
+ "title": "JavaScriptia JSX:ssa aaltosulkeilla",
"path": "/learn/javascript-in-jsx-with-curly-braces"
},
{
- "title": "Passing Props to a Component",
+ "title": "Proppien välittäminen komponenteille",
"path": "/learn/passing-props-to-a-component"
},
{
- "title": "Conditional Rendering",
+ "title": "Ehdollinen renderöinti",
"path": "/learn/conditional-rendering"
},
{
- "title": "Rendering Lists",
+ "title": "Listojen renderöinti",
"path": "/learn/rendering-lists"
},
{
- "title": "Keeping Components Pure",
+ "title": "Komponenttien pitäminen puhtaina",
"path": "/learn/keeping-components-pure"
}
]
From b7c6f7c0531744e9d4715eab8df456f6c93bd688 Mon Sep 17 00:00:00 2001
From: Miro Rauhala <4082806+mirorauhala@users.noreply.github.com>
Date: Sat, 7 May 2022 17:15:53 +0300
Subject: [PATCH 11/80] Translate Adding interactivity
---
beta/GLOSSARY.md | 6 +-
beta/src/pages/learn/adding-interactivity.md | 607 ++++++++++---------
2 files changed, 319 insertions(+), 294 deletions(-)
diff --git a/beta/GLOSSARY.md b/beta/GLOSSARY.md
index 3b02c4f4c..aec187289 100644
--- a/beta/GLOSSARY.md
+++ b/beta/GLOSSARY.md
@@ -2,15 +2,19 @@
## React specific
-- **React hook**: React hookki
+- **React hook**: React hookki, koukku
- **props**: proppi, propit
- **pure component**: puhdas komponentti
## General
+- **trigger**: triggeröinti
- **export**: exportata, viedä
- **import**: importata, tuoda
- **build tool**: käännöstyökalu
+- **setter function**: setter funktio. (Asetin kuulostaa tyhmältä)
+- **hover**: (as in a user hovering over a button): hoverointi. (Leijuminen ei ehkä ole kovin itsestäänselvää mitä sillä tarkoitetaan.)
+- **focus**: (as in a user focusing over a button): focusointi. (^)
- **framework**: ohjelmistokehys
- **codebase**: koodipohja
- **property**: en keksinyt järkevää suomennosta, property
diff --git a/beta/src/pages/learn/adding-interactivity.md b/beta/src/pages/learn/adding-interactivity.md
index 73b7e0597..29fbbd1f3 100644
--- a/beta/src/pages/learn/adding-interactivity.md
+++ b/beta/src/pages/learn/adding-interactivity.md
@@ -1,30 +1,30 @@
---
-title: Adding Interactivity
+title: Interaktiivisuuden lisääminen
---
-Some things on the screen update in response to user input. For example, clicking an image gallery switches the active image. In React, data that changes over time is called state. You can add state to any component, and update it as needed. In this chapter, you'll learn how to write components that handle interactions, update their state, and display different output over time.
+Jotkin asiat ruudulla päivittyvät käyttäjän syötteen mukaan. Esimerkiksi, kuvan klikkaaminen galleriassa vaihtaa aktiivista kuvaa. Reactissa ajan myötä muuttuvia tietoja kutsutaan tilaksi. Voit lisätä tilan mihin tahansa komponenttiin ja päivittää sitä tarvittaessa. Tässä luvussa opit miten kirjoitetaan komponentteja, jotka vastaavat toimintohin, päivittävät niiden tilaa sekä näyättävät eri ulostuloa ajan myötä.
-* [How to handle user-initiated events](/learn/responding-to-events)
-* [How to make components "remember" information with state](/learn/state-a-components-memory)
-* [How React updates the UI in two phases](/learn/render-and-commit)
-* [Why state doesn't update right after you change it](/learn/state-as-a-snapshot)
-* [How to queue multiple state updates](/learn/queueing-a-series-of-state-updates)
-* [How to update an object in state](/learn/updating-objects-in-state)
-* [How to update an array in state](/learn/updating-arrays-in-state)
+- [Miten käsitellä käyttäjä-aloitteisia tapahtumia](/learn/responding-to-events)
+- [Kuinka saada komponentit "muistamaan" tiedot tilaa hyödyntämällä](/learn/state-a-components-memory)
+- [Miten React päivittää käyttöliittymää kahdessa vaiheessa](/learn/render-and-commit)
+- [Miksi tila ei päivity heti kun muutat sitä](/learn/state-as-a-snapshot)
+- [Miten tilapäivityksiä voi lisätä jonoon](/learn/queueing-a-series-of-state-updates)
+- [Miten päivittää oliota tilassa](/learn/updating-objects-in-state)
+- [Miten päivittää listaa tilassa](/learn/updating-arrays-in-state)
-## Responding to events {/*responding-to-events*/}
+## Vastaaminen tapahtumiin {/* responding-to-events */}
-React lets you add event handlers to your JSX. Event handlers are your own functions that will be triggered in response to user interactions like clicking, hovering, focusing on form inputs, and so on.
+Reactissa voit lisätä tapahtumakäsittelijöitä JSX koodiin. Tapahtumakäsittelijät ovat funktioitasi, joita kutsutaan vastauksena käyttäjän toimintoihin kuten klikkaukseen, hoverointiin, focusointiin ja niin edelleen.
-Built-in components like `
-## Seuraavat vaiheet {/* next-steps */}
+## Seuraavat vaiheet {/*next-steps*/}
Tähän mennessä osaat miten kirjoitetaan perusteet React koodista!
diff --git a/beta/src/pages/learn/installation.md b/beta/src/pages/learn/installation.md
index fc8c1cc9b..2209ed319 100644
--- a/beta/src/pages/learn/installation.md
+++ b/beta/src/pages/learn/installation.md
@@ -17,7 +17,7 @@ React on suunniteltu alusta alkaen asteittaiseen käyttöönottoon. Voit käytt
-## Kokeile Reactia {/* try-react */}
+## Kokeile Reactia {/*try-react*/}
Reactia kokeillaksesi sinun ei tarvitse asentaa mitään. Kokeile muokata tätä hiekkalaatikkoa!
@@ -38,18 +38,18 @@ export default function App() {
Käytämme hiekkalaatikkoja osana dokumentaatiota opetuksen tukena. Hiekkalaatikot auttaa tutustumaan Reactin toimintaan sekä auttaa päättämään sopiiko React sinulle.
Reactin dokumentaation ulkopuolelta löytyy monia hiekkalaatikkoja, jotka tukevat Reactia: esimerkiksi [CodeSandbox](https://codesandbox.io/s/new), [Stackblitz](https://stackblitz.com/fork/react), tai [CodePen](https://codepen.io/pen/?template=wvdqJJm).
-## Kokeile Reactia paikallisesti {/* try-react-locally */}
+## Kokeile Reactia paikallisesti {/*try-react-locally*/}
Kokeile Reactia paikallisesti omalla tietokoneellasi [lataamalla tämä HTML sivu](https://raw.githubusercontent.com/reactjs/reactjs.org/main/static/html/single-file-example.html). Avaa se editorissasi sekä selaimesasi!
-## Lisää React sivuun {/* add-react-to-a-page */}
+## Lisää React sivuun {/*add-react-to-a-page*/}
Jos työskentelet olemassaolevan sivun kanssa ja tarvitset vain vähäsen Reactia, voit [lisätä Reactin script -tagilla.](/learn/add-react-to-a-website)
-## Aloita React -projekti {/* start-a-react-project */}
+## Aloita React -projekti {/*start-a-react-project*/}
Jos olet valmis [aloittamaan itsenäisen projektin](/learn/start-a-new-react-project) Reactilla, voit pystyttää minimaalisen ympäristön miellyttävää kehittäjäkokemusta varten. Voit myös aloittaa käyttämällä ohjelmistokehystä, joka teke paljon päätöksiä puolestasi.
-## Seuraavat vaiheet {/* next-steps */}
+## Seuraavat vaiheet {/*next-steps*/}
Se mistä aloitat riippuu pitkälti miten haluat oppia, mitä sinun täytyy saavuttaa, ja minne haluat edetä seuraavaksi! Mikset lukisi [Ajattelua Reactissa](/learn/thinking-in-react) -johdantoa? Tai voit myös hypätä [Käyttöliittymän kuvaukseen](/learn/describing-the-ui) kokeillaksesi esimerkeillä ja oppiaksesi aiheen vaihe vaiheelta. Ei ole väärää tapaa oppia Reactia!
diff --git a/beta/src/pages/learn/managing-state.md b/beta/src/pages/learn/managing-state.md
index 4533370e1..ac8cf6655 100644
--- a/beta/src/pages/learn/managing-state.md
+++ b/beta/src/pages/learn/managing-state.md
@@ -20,7 +20,7 @@ Sovelluksesi kasvaessa, kannattaa olla tietoinen miten tilasi on järjestetty se
-## Tilan reagointi syötteeseen {/* reacting-to-input-with-state */}
+## Tilan reagointi syötteeseen {/*reacting-to-input-with-state*/}
Reactissa et muokkaa käyttöliittymäkoodia suoraan. Esimerkiksi, et kirjoita komentoja kuten "poista painike käytöstä", "ota painike käyttöön", "näytä onnistumisviesti", jne. Sen sijaan kerrot käyttöliittymän, jonka haluat nähdä erilaisissa komponentin tiloissa ("alkutila", "kirjoitetaan -tila", "onnistumistila"), ja sitten vaihdat tilaa käyttäjän syötteen pohjalta. Tämä vastaa samaa kuin miten suunnittelijat ajattelevat käyttöliittymiä.
@@ -107,7 +107,7 @@ Lue **[Reacting to Input with State](/learn/reacting-to-input-with-state)** oppi
-## Tilarakenteen päättäminen {/* choosing-the-state-structure */}
+## Tilarakenteen päättäminen {/*choosing-the-state-structure*/}
Hyvän tilarakenteen päättäminen voi tehdä suuren eron komponenttien välillä, jota on miellyttävä muokata ja korjata, ja sellaisen joka on jatkuva virheiden lähde. Tärkein periaate on se, että tilan ei kuuluisi sisältää tarpeetonta tai toistettua tietoa. Mikäli tilassa on tarpeetonta tietoa, on sen päivitys helppo unohtaa ja esitellä bugeja!
@@ -214,7 +214,7 @@ Lue **[Tilarakenteen päättäminen](/learn/choosing-the-state-structure)** oppi
-## Tilan jakaminen komponenttien välillä {/* sharing-state-between-components */}
+## Tilan jakaminen komponenttien välillä {/*sharing-state-between-components*/}
Joskus haluat, että kahden komponentin tila muuttuu yhdessä. Tämän tehdäksesi, poista tila molemmista komponenteista ja siirrä se lähmimpään pääkomponenttiin, ja välitä tila alas proppeja käyttäen. Tätä kutsutaan "tilan nostamiseksi ylös", ja se on yksiä yleisimmistä asioista joita tulet tekemään React koodia kirjoittaessasi.
@@ -280,7 +280,7 @@ Lue **[Tilan jakaminen komponenttien välillä](/learn/sharing-state-between-com
-## Tilan säilyttäminen ja nollaus {/* preserving-and-resetting-state */}
+## Tilan säilyttäminen ja nollaus {/*preserving-and-resetting-state*/}
Kun uudelleenrenderöit komponenttia, Reactin täytyy päättää mitkä osat puusta pitää (ja päivittää), ja mitkä osat häivittää tai luoda uudelleen alusta alkaen. Useimmissa tapauksissa Reactin automaattinen käyttäytyminen toimii tarpeeksi hyvin. Oletuksena React ylläpitää osat puusta, jotka "vastaavat" aiemmin renderöityä komponettipuuta.
@@ -478,7 +478,7 @@ Lue **[Tilan säilyttäminen ja nollaus](/learn/preserving-and-resetting-state)*
-## Tilalogiikan siirtäminen reduceriin {/* extracting-state-logic-into-a-reducer */}
+## Tilalogiikan siirtäminen reduceriin {/*extracting-state-logic-into-a-reducer*/}
Komponentit, joissa on useita tilapäivityksiä, jotka on hajallaan useisiin tapahtumakäsittelijöihin, voivat olla hankalia ymmärtää. Näihin tapauksiin voit tiivistää kaikki tilamuutoksen logiikan komponentin ulkopuolelle yhteen funktioon, jota kutsutaan "reduceriksi". Tapahtumakäsittelijöistäsi tulee tiivitä, koska ne määrittelevät ainoastaan käyttäjän "toiminnot". Tiedoston lopussa reducer funktio määrittelee miten tila kuuluisi päivittää kuhunkin tapahtumaan nähden!
@@ -671,7 +671,7 @@ Lue **[Tilalogiikan siirtäminen reduceriin](/learn/extracting-state-logic-into-
-## Tiedon välittäminen syvälle kontekstilla {/* passing-data-deeply-with-context */}
+## Tiedon välittäminen syvälle kontekstilla {/*passing-data-deeply-with-context*/}
Usein täytyy antaa tietoa pääkomponentista lapsikomponettiin proppien avulla. Mutta proppien välittämisestä saattaa tulla epämukavaa jos proppeja täytyy antaa useiden komponenttien läpi, tai jos moni komponentti tarvitsee samaa tietoa. Kontekstin avulla pääkomponenti voi asettaa tietyn tiedon saataville kaikkiin komponentteihin pääkomponentin sisällä-riippumatta siitä miten syvällä se on-ilman, että sitä annetaan proppien kautta.
@@ -773,7 +773,7 @@ Lue **[Tiedon välittäminen syvälle kontekstilla](/learn/passing-data-deeply-w
-## Skaalaus reducerilla ja kontekstilla {/* scaling-up-with-reducer-and-context */}
+## Skaalaus reducerilla ja kontekstilla {/*scaling-up-with-reducer-and-context*/}
Reducerien avulla voit yhdistää komponentin tilanpäivityslogiikan. Kontekstin avulla voit antaa tietoa syvälle muihin komponentteihin. Voit yhdistää reducereita ja konteksteja yhteen hallitaksesi monimutkaisen ruudun tilaa.
@@ -991,7 +991,7 @@ Lue **[Skaalaus reducerilla ja kontekstilla](/learn/scaling-up-with-reducer-and-
-## Mitä seuraavaksi {/* whats-next */}
+## Mitä seuraavaksi {/*whats-next*/}
Siirry seuraavaksi sivulle [Tilan reagointi syötteeseen](/learn/reacting-to-input-with-state) lukeaksesi tämän luvun sivu kerrallaan!
From f8f20e6c2d19f149dd46c9536230759ee23c640a Mon Sep 17 00:00:00 2001
From: Miro Rauhala <4082806+mirorauhala@users.noreply.github.com>
Date: Wed, 11 May 2022 21:17:21 +0300
Subject: [PATCH 17/80] add new words
---
beta/GLOSSARY.md | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/beta/GLOSSARY.md b/beta/GLOSSARY.md
index 877b6ccb0..02b112ed7 100644
--- a/beta/GLOSSARY.md
+++ b/beta/GLOSSARY.md
@@ -11,6 +11,11 @@
## General
+- **frontend**: frontend
+- **backend**: backend, taustajärjestelmä
+- **pipeline**: putki
+- **bundler**: bundler
+- **repository**: repository, repo
- **trigger**: triggeröinti
- **export**: exportata, viedä
- **import**: importata, tuoda
From b1217eeb4bf341a72e62c316c4a16d3272b379e7 Mon Sep 17 00:00:00 2001
From: Miro Rauhala <4082806+mirorauhala@users.noreply.github.com>
Date: Wed, 11 May 2022 21:17:52 +0300
Subject: [PATCH 18/80] translate start-new-react-project
---
.../pages/learn/start-a-new-react-project.md | 73 ++++++++++---------
1 file changed, 38 insertions(+), 35 deletions(-)
diff --git a/beta/src/pages/learn/start-a-new-react-project.md b/beta/src/pages/learn/start-a-new-react-project.md
index eaedc46d4..1cbbb5393 100644
--- a/beta/src/pages/learn/start-a-new-react-project.md
+++ b/beta/src/pages/learn/start-a-new-react-project.md
@@ -1,80 +1,83 @@
---
-title: Start a New React Project
+title: Aloita uusi React projekti
---
-If you're learning React or considering adding it to an existing project, you can get started quickly by [adding React to any HTML page with script tags](/learn/add-react-to-a-website). If your project will need many components and many files, it might be time to consider the options below!
+Jos olet opettelemassa Reactia tai harkitsen sen lisäämistä olemassa olevaan projektiin, voit aloittaa nopeasti [lisäämällä Reactin mille tahansa HTML sivulle script -tagien avulla](/learn/add-react-to-a-website).
+Mikäli projektisi tulee tarvitsemaan useita komponentteja ja tiedostoja, voi olla aika harkita muita alla olevia vaihtoehtoja!
-## Choose your own adventure {/*choose-your-own-adventure*/}
+## Valitse oma polkusi {/*choose-your-own-adventure*/}
-React is a library that lets you organize UI code by breaking it apart into pieces called components. React doesn't take care of routing or data management. For these features, you'll want to use third-party libraries or write your own solutions. This means there are several ways to start a new React project:
+React on kirjasto, jonka avulla voit järjestää käyttöliittymäkoodia hajottamalla koodin palasiksi eli komponenteiksi. React ei huolehdi reitittämisestä tai tiedon hallinnasta. Näihin ominaisuuksiin saatat haluta käyttää kolmansien osapuolien kirjastoja tai kirjoittaa omia ratkaisujasi. Tämä tarkoittaa, että on useita tapoja aloittaa uusi React projekti:
-* Start with a **minimal set up with just a toolchain,** adding features to your project as necessary.
-* Start with an **opinionated framework** with common functionality already built in.
-Whether you're just getting started, looking to build something big, or want to set up your own toolchain, this guide will set you on the right path.
+* Aloita **minimaalisella työkalupakilla,** lisäät ominaisuuksia projektiisi tarpeen tullen.
+* Aloita **täysikokoisella ohjelmistokehyksellä,** jossa on yleisimpiä toiminnallisuuksia sisäänrakennettuna.
-## Getting started with a React toolchain {/*getting-started-with-a-react-toolchain*/}
+Mikäli olet aloittamassa, rakentamassa jotain isoa, tai haluat asentaa oman ympäristön, tämä opas ohjaa sinut oikealle polulle.
-If you're just getting started with React, we recommend [Create React App](https://create-react-app.dev/), the most popular way to try out React's features and a great way to build a new single-page, client-side application. Create React App is an unopinionated toolchain configured just for React. Toolchains help with things like:
+## React-työkalupakin käytön aloittaminen {/*getting-started-with-a-react-toolchain*/}
-* Scaling to many files and components
-* Using third-party libraries from npm
-* Detecting common mistakes early
-* Live-editing CSS and JS in development
-* Optimizing the output for production
+Jos olet aloittamassa Reactin käyttöä, suosittelemme Create React App](https://create-react-app.dev/) ympäristöä. Se on suosituin tapa kokeilla Reactin ominaisuuksia ja mahtava tapa rakentaa uusi yhden-sivun sovellus. Create React App on mielipiteetön työkalu konfiguroitu vain Reactille. Työkalupakki auttaa mm. seuraavissa asioissa:
-You can get started building with Create React App with one line of code in your terminal! (**Be sure you have [Node.js](https://nodejs.org/) installed!**)
+* Skaalautuu useisiin tiedostoihin ja komponentteihin
+* Kolmansien osapuolien npm -pakettien käyttö
+* Tunnistaa yleisiä virheitä aikaisin
+* CSS ja JS koodin muokkaaminen reaaliajassa
+* Optimoi koodin lopputuloksen tuotantoa varten
+
+Pääset aloittamaan koodauksen Create React App:lla yhdellä rivillä terminaalissasi! (**Tarkista, että sinulla on [Node.js](https://nodejs.org/) asennettuna!**)
-npx create-react-app my-app
+npx create-react-app mun-softa
-Now you can run your app with:
+
+Nyt voit suorittaa sovelluksesi komennolla:
-cd my-app
+cd mun-softa
npm start
-For more information, [check out the official guide](https://create-react-app.dev/docs/getting-started).
+Lisätietoja löydät [lukemalla virallista opasta](https://create-react-app.dev/docs/getting-started).
-> Create React App doesn't handle backend logic or databases; it just creates a frontend build pipeline. This means you can use it with any backend you want. But if you're looking for more features like routing and server-side logic, read on!
+> Create React App ei hoida backendin logiikkaa taikka tietokantoja; se tuottaa vain frontendin kehitysputken. Tämä tarkoittaa, että voit käyttää sitä minkä tahansa taustajärjestelmän kanssa haluat. Mutta jos etsit lisäominaisuuksia kuten reitittämistä ja palvelinpuolen logiikkaa, jatka lukemista!
-### Other options {/*other-options*/}
+### Muut vaihtoehdot {/*other-options*/}
-Create React App is great to get started working with React, but if you'd like an even lighter toolchain, you might try one of these other popular toolchains:
+Create React APp on hyvä vaihtoehto Reactin käytön aloittamiseen, mutta jos haluat vielä kevyemmän työkalupakit, voit kokeilla yhtä näistä muista:
* [Vite](https://vitejs.dev/guide/)
* [Parcel](https://parceljs.org/)
* [Snowpack](https://www.snowpack.dev/tutorials/react)
-## Building with React and a framework {/*building-with-react-and-a-framework*/}
+## Rakentaminen Reactilla ja ohjelmistokehyksellä {/*building-with-react-and-a-framework*/}
-If you're looking to start a bigger, production-ready project, [Next.js](https://nextjs.org/) is a great place to start. Next.js is a popular, lightweight framework for static and server‑rendered applications built with React. It comes pre-packaged with features like routing, styling, and server-side rendering, getting your project up and running quickly.
+Jos aiot aloittaa suuren, tuotanto-valmiin projektin, [Next.js](https://nextjs.org/) on hyvä aloituspaikka. Next.js on suosittu ja kevyt ohjelmistokehys staattisiin sekä palvelin-renderöityihin sovelluksiin Reactilla. Sen mukana tulee pakattuna valmiiksi ominaisuuksia, kuten reititys, tyylit sekä palvelinpuolen renderöinti, jotta saat projektin alkuun nopeasti.
-[Get started building with Next.js](https://nextjs.org/docs/getting-started) with the official guide.
+[Aloita rakentaminen Next.js -kehyksellä](https://nextjs.org/docs/getting-started) virallisen oppaan avulla.
-### Other options {/*other-options-1*/}
+### Muut vaihtoehdot {/*other-options-1*/}
-* [Gatsby](https://www.gatsbyjs.org/) lets you generate static websites with React with GraphQL.
-* [Razzle](https://razzlejs.org/) is a server-rendering framework that doesn't require any configuration, but offers more flexibility than Next.js.
+* [Gatsby](https://www.gatsbyjs.org/):lla voit luoda staattisia verrkosivua Reactin skeä GraphQL:n avulla.
+* [Razzle](https://razzlejs.org/) on palvelinpuolen renderöintikehys, joka ei vaadi yhtään konfigurointia, mutta tarjoaa enemmän joustavuutta kuin Next.js.
-## Custom toolchains {/*custom-toolchains*/}
+## Kustomoidut työkalupakit {/*custom-toolchains*/}
-You may prefer to create and configure your own toolchain. A JavaScript build toolchain typically consists of:
+Saatat pitää enemmän itseluodusta ja -määritellystä työkalupakista. JavaScript työkalupakki useimmiten koostuu seuraavista:
-* A **package manager**—lets you install, update and manage third-party packages. [Yarn](https://yarnpkg.com/) and [npm](https://www.npmjs.com/) are two popular package managers.
-* A **bundler**—lets you write modular code and bundle it together into small packages to optimize load time. [Webpack](https://webpack.js.org/), [Snowpack](https://www.snowpack.dev/), [Parcel](https://parceljs.org/) are several popular bundlers.
-* A **compiler**—lets you write modern JavaScript code that still works in older browsers. [Babel](https://babeljs.io/) is one such example.
+* **Paketinhallintajärjestelmä**—antaa sinun asentaa, päivittää sekä hallita kolmasien osapuolten paketteja. [Yarn](https://yarnpkg.com/) ja [npm](https://www.npmjs.com/) ovat kaksi suosittua paketinhallintajärjestelmää.
+* **Bundler**—antaa sinuun kirjoittaa modulaarista koodia ja yhdistä ne yhteen pieniksi paketeiksi latausajan optimoimiseksi. [Webpack](https://webpack.js.org/), [Snowpack](https://www.snowpack.dev/), [Parcel](https://parceljs.org/) ovat suosittuja bundlereita.
+* **Kääntäjä**—antaa sinun krijoittaa modernia JavaScript koodia, joka silti toimii vanhemmissa selaimissa. [Babel](https://babeljs.io/) on yksi hyvä esimerkki.
-In a larger project, you might also want to have a tool to manage multiple packages in a single repository. [Nx](https://nx.dev/react) is an example of such a tool.
+Laajemmassa projektissa saatat haluta käyttää työkalua hallitsemaan useita paketteja yhdessä repositoryssa. [Nx](https://nx.dev/react) on esimerkki sellaisesta työkalusta.
-If you prefer to set up your own JavaScript toolchain from scratch, [check out this guide](https://blog.usejournal.com/creating-a-react-app-from-scratch-f3c693b84658) that re-creates some of the Create React App functionality.
+Jos suosit oman JavaScript työkalupakin asennusta alusta alkaen, [katso tämä opas](https://blog.usejournal.com/creating-a-react-app-from-scratch-f3c693b84658) joka luo uudelleen tiettyjä Create React Appin toimintoja.
\ No newline at end of file
From 76d2576a0b6387da70043362db0e5517767fa22e Mon Sep 17 00:00:00 2001
From: Miro Rauhala <4082806+mirorauhala@users.noreply.github.com>
Date: Wed, 11 May 2022 22:32:10 +0300
Subject: [PATCH 19/80] add container, minify, preprocessor
---
beta/GLOSSARY.md | 3 +++
1 file changed, 3 insertions(+)
diff --git a/beta/GLOSSARY.md b/beta/GLOSSARY.md
index 02b112ed7..d00376b1b 100644
--- a/beta/GLOSSARY.md
+++ b/beta/GLOSSARY.md
@@ -15,6 +15,9 @@
- **backend**: backend, taustajärjestelmä
- **pipeline**: putki
- **bundler**: bundler
+- **container**: container
+- **minify**: minifioida, pienentää
+- **preprocessor**: esikääntäjä
- **repository**: repository, repo
- **trigger**: triggeröinti
- **export**: exportata, viedä
From 1bdccf0c7aa9123b2e49ad48158a9a1814d78961 Mon Sep 17 00:00:00 2001
From: Miro Rauhala <4082806+mirorauhala@users.noreply.github.com>
Date: Wed, 11 May 2022 22:32:31 +0300
Subject: [PATCH 20/80] translate add-react-to-a-website
---
.../src/pages/learn/add-react-to-a-website.md | 159 +++++++++---------
1 file changed, 80 insertions(+), 79 deletions(-)
diff --git a/beta/src/pages/learn/add-react-to-a-website.md b/beta/src/pages/learn/add-react-to-a-website.md
index ad458b0b0..ee71f2931 100644
--- a/beta/src/pages/learn/add-react-to-a-website.md
+++ b/beta/src/pages/learn/add-react-to-a-website.md
@@ -1,56 +1,56 @@
---
-title: Add React to a Website
+title: Lisää React verkkosivulle
---
-React has been designed from the start for gradual adoption, and you can use as little or as much React as you need. Whether you're working with micro-frontends, an existing system, or just giving React a try, you can start adding interactive React components to an HTML page with just a few lines of code—and no build tooling!
+React on suunniteltu alusta asti asteittaiseen käyttöönottoon sekä voit käyttää niin vähän tai paljon Reactia kuin tarvitset. Mikäli työskentelet micro-käyttöliittymien, olemassaolevien järjestelmien, tai vain kokeilet Reactin käyttöä, voit lisätä interaktiivisia React komponentteja HTML sivuun vain muutamalla rivillä koodia-ilman kehitysympäristöä.
-## Add React in one minute {/*add-react-in-one-minute*/}
+## Lisää React minuutissa {/*add-react-in-one-minute*/}
-You can add a React component to an existing HTML page in under a minute. Try this out with your own website or [an empty HTML file](https://gist.github.com/rachelnabors/7b33305bf33776354797a2e3c1445186/archive/859eac2f7079c9e1f0a6eb818a9684a464064d80.zip)—all you need is an internet connection and a text editor like Notepad (or VSCode—check out our guide on [how to set yours up](/learn/editor-setup/))!
+Voit lisätä React komponentin olemassa olevaan HTML sivuun alle minuutissa. Kokeile tätä omalla verkkosivullasi tai [tyhjällä HTML tiedostolla](https://gist.github.com/rachelnabors/7b33305bf33776354797a2e3c1445186/archive/859eac2f7079c9e1f0a6eb818a9684a464064d80.zip)—tarvitset vain internet-yhteyden sekä tekstieditorin kuten Notepadin (tai VSCode—lue ohjeemme [oman editorin määrittelystä](/learn/editor-setup/))!
-### Step 1: Add an element to the HTML {/*step-1-add-an-element-to-the-html*/}
+### Vaihe 1: Lisää elementti HTML koodiin {/*step-1-add-an-element-to-the-html*/}
-In the HTML page you want to edit, add an HTML element like an empty `
` tag with a unique `id` to mark the spot where you want to display something with React.
+HTML sivuun, jota haluat muokata, lisää tyhjä HTML elementti kuten tyhjä `
` tagi uniikilla `id` attribuutilla merkitäksesi kohdan johon haluat tulostaa jotain Reactilla.
-You can place a "container" element like this `
` anywhere inside the `` tag. React will replace any existing content inside HTML elements, so they are usually empty. You can have as many of these HTML elements on one page as you need.
+Voit asettaa "container" elementin kuten tämän `
` tagin minne tahansa `` tagien sisällä. React korvaa HTML elementtien välisen sisällön, joten useimmiten se on tyhjä. Sinulla voi olla niin monta HTML elementtiä yhdellä sivulla kuin tarvitset.
```html {3}
-
+
-
+
-
+
```
-### Step 2: Add the Script Tags {/*step-2-add-the-script-tags*/}
+### Vaihe 2: Lisää script -tagit {/*step-2-add-the-script-tags*/}
-In the HTML page, right before the closing `` tag, add three `
```
-### Step 3: Create a React component {/*step-3-create-a-react-component*/}
+### Vaihe 3: Luo React komponentti {/*step-3-create-a-react-component*/}
-Create a file called **like_button.js** next to your HTML page, add this code snippet, and save the file. This code defines a React component called `LikeButton`. [You can learn more about making components in our guides.](/learn/your-first-component)
+Luo tiedosto nimeltään **like_button.js** HTML sivun viereen, lisää tämä koodinpätkä ja tallenna tiedosto. Tämä koodi määrittää React komponentin nimeltään `LikeButton`. [Voit oppia komponettien luomisesta oppassamme.](/learn/your-first-component)
```js
'use strict';
@@ -72,78 +72,78 @@ function LikeButton() {
}
```
-### Step 4: Add your React Component to the page {/*step-4-add-your-react-component-to-the-page*/}
+### Vaihe 4: Lisää React komponenttisi sivuun {/*step-4-add-your-react-component-to-the-page*/}
-Lastly, add three lines to the bottom of **like_button.js**. These three lines of code find the `
` you added to your HTML in the first step, create a React app with it, and then display the "Like" button React component inside of it.
+Viimeiseksi, lisää kolme riviä koodia **like_button.js** tiedoston pohjaan. Nämä kolme riviä koodia etsivät `
` tagin, jonka lisäsit HTML tiedostoon ensimmäisessä vaiheessa, luo React -sovelluksen, ja näyttää sitten "Like" painikkeen React komponentin sen sisällä.
```js
-const domContainer = document.getElementById('component-goes-here');
+const domContainer = document.getElementById('komponentti-tulee-tähän');
const root = ReactDOM.createRoot(domContainer);
root.render(React.createElement(LikeButton));
```
-**Congratulations! You have just rendered your first React component to your website!**
+**Onnittelut! Juuri renderöit ensimmäisen React komponentin verkkosivullasi!**
-- [View the full example source code](https://gist.github.com/rachelnabors/c64b3aeace8a191cf5ea6fb5202e66c9)
-- [Download the full example (2KB zipped)](https://gist.github.com/rachelnabors/c64b3aeace8a191cf5ea6fb5202e66c9/archive/7b41a88cb1027c9b5d8c6aff5212ecd3d0493504.zip)
+- [Näytä esimerkin koko lähdekoodi](https://gist.github.com/rachelnabors/c64b3aeace8a191cf5ea6fb5202e66c9)
+- [Lataa koko esimerkki (2KT zip)](https://gist.github.com/rachelnabors/c64b3aeace8a191cf5ea6fb5202e66c9/archive/7b41a88cb1027c9b5d8c6aff5212ecd3d0493504.zip)
-#### You can reuse components! {/*you-can-reuse-components*/}
+#### Voit uudelleenkäyttää komponentteja! {/*you-can-reuse-components*/}
-You might want to display a React component in multiple places on the same HTML page. This is most useful while React-powered parts of the page are isolated from each other. You can do this by calling `ReactDOM.createRoot()` multiple times with multiple container elements.
+Saatat haluta näyttää React komponentin useissa eri paikoissa samalla HTML sivulla. Tämä on hyödyllisintä, kun sivun React-käyttöiset osat on eristetty toisistaan. Voit tehdä tämän kutsumalla `ReactDOM.createRoot()` funktiota useampia kertoja useilla "container" elementeillä.
-1. In **index.html**, add an additional container element ``.
-2. In **like_button.js**, add an additional `ReactDOM.render()` for the new container element:
+1. **index.html** tiedostossa, lisää uusi container elementti ``.
+2. **like_button.js** tiedostossa, lisää uusi `ReactDOM.render()` uudelle container elementille:
```js {6,7,8,9}
const root1 = ReactDOM.createRoot(
- document.getElementById('component-goes-here')
+ document.getElementById('komponentti-tulee-tähän')
);
root1.render(React.createElement(LikeButton));
const root2 = ReactDOM.createRoot(
- document.getElementById('component-goes-here-too')
+ document.getElementById('komponentti-tulee-tähän-myös')
);
root2.render(React.createElement(LikeButton));
```
-Check out [an example that displays the "Like" button three times and passes some data to it](https://gist.github.com/rachelnabors/c0ea05cc33fbe75ad9bbf78e9044d7f8)!
+Katso [esimerkki, joka näyttää "Like" painikkeen kolmesti ja antaa dataa sille](https://gist.github.com/rachelnabors/c0ea05cc33fbe75ad9bbf78e9044d7f8)!
-### Step 5: Minify JavaScript for production {/*step-5-minify-javascript-for-production*/}
+### Vaihe 5: Pienennä JavaScript tuotantoa varten {/*step-5-minify-javascript-for-production*/}
-Unminified JavaScript can significantly slow down page load times for your users. Before deploying your website to production, it's a good idea to minify its scripts.
+Pienentämätön JavaScript voi merkittävästi hidastaa verkkosivun latausaikoja käyttäjillesi. Ennen verkkosivun siirtämistä tuotantoon, on hyvä idea pienentää eli minifioida script -tiedostot.
-- **If you don't have a minification step** for your scripts, [here's one way to set it up](https://gist.github.com/gaearon/42a2ffa41b8319948f9be4076286e1f3).
-- **If you already minify** your application scripts, your site will be production-ready if you ensure that the deployed HTML loads the versions of React ending in `production.min.js` like so:
+- **Jos sinulla ei ole minifiointi-vaihetta** koodeillesi, [täältä löydät yhden tavan asentaa sen](https://gist.github.com/gaearon/42a2ffa41b8319948f9be4076286e1f3).
+- **Jos jo minifioit** sovelluksesi koodit, sivusi on tuotantovalmis mikäli varmistat, että tuotantoon siirrettävä HTML koodi lataa versiot Reactista, jotka loppuvat `production.min.js` päätteellä, kuten:
```html
```
-## Try React with JSX {/*try-react-with-jsx*/}
+## Kokeile Reactia JSX:llä {/*try-react-with-jsx*/}
-The examples above rely on features that are natively supported by browsers. This is why **like_button.js** uses a JavaScript function call to tell React what to display:
+Esimerkit yllä riippuvat ominaisuuksista, jotka ovat natiivisti tuettuja selaimissa. Tämä on syy miksi **like_button.js** käyttää JavaScript funktiokutsua kertoakseen Reactille mitä näyttää:
```js
return React.createElement('button', {onClick: () => setLiked(true)}, 'Like');
```
-However, React also offers an option to use [JSX](/learn/writing-markup-with-jsx), an HTML-like JavaScript syntax, instead:
+Kuitenkin, React tarjoaa myös vaihtoehdon käyttää HTML-tyylistä JavaScript syntaksia nimeltään [JSX](/learn/writing-markup-with-jsx). Esimerkiksi:
```jsx
return setLiked(true)}>Like;
```
-These two code snippets are equivalent. JSX is popular syntax for describing markup in JavaScript. Many people find it familiar and helpful for writing UI code--both with React and with other libraries. You might see "markup sprinkled throughout your JavaScript" in other projects!
+Nämä kaksi koodinpätkää vastaavat toisiaan. JSX on suosittu syntaksi määrittelemään merkintää JavaScriptissa. Useat kokevat sen tutuksi ja helppokäyttöiseksi käyttöliittymäkoodin kirjoittamiseen--joko Reactin kanssa tai muiden kirjastojen. Saatat nähdä "merkintäkoodia ripoteltuna ympäri JavaScript koodiasi" muissa projekteissa!
-> You can play with transforming HTML markup into JSX using [this online converter](https://babeljs.io/en/repl#?babili=false&browsers=&build=&builtIns=false&spec=false&loose=false&code_lz=DwIwrgLhD2B2AEcDCAbAlgYwNYF4DeAFAJTw4B88EAFmgM4B0tAphAMoQCGETBe86WJgBMAXJQBOYJvAC-RGWQBQ8FfAAyaQYuAB6cFDhkgA&debug=false&forceAllTransforms=false&shippedProposals=false&circleciRepo=&evaluate=false&fileSize=false&timeTravel=false&sourceType=module&lineWrap=true&presets=es2015%2Creact%2Cstage-2&prettier=false&targets=&version=7.17).
+> Voit kokeilla muuttaa HTML merkintäkoodia JSX koodiksi käyttämällä [tätä verkkomuunninta](https://babeljs.io/en/repl#?babili=false&browsers=&build=&builtIns=false&spec=false&loose=false&code_lz=DwIwrgLhD2B2AEcDCAbAlgYwNYF4DeAFAJTw4B88EAFmgM4B0tAphAMoQCGETBe86WJgBMAXJQBOYJvAC-RGWQBQ8FfAAyaQYuAB6cFDhkgA&debug=false&forceAllTransforms=false&shippedProposals=false&circleciRepo=&evaluate=false&fileSize=false&timeTravel=false&sourceType=module&lineWrap=true&presets=es2015%2Creact%2Cstage-2&prettier=false&targets=&version=7.17).
-### Try JSX {/*try-jsx*/}
+### Kokeile JSX:ää {/*try-jsx*/}
-The quickest way to try JSX in your project is to add the Babel compiler to your page's `` along with React and ReactDOM like so:
+Nopein tapa kokeilla JSX:ää projektissasi on lisätä Babel -kääntäjä sivusi `` tagien sisälle Reactin sekä ReactDOMin kanssa, kuten:
```html {6}
-
+
@@ -151,10 +151,10 @@ The quickest way to try JSX in your project is to add the Babel compiler to your
-
+
```
-Now you can use JSX in any `
```
-To convert **like_button.js** to use JSX:
+Muuttaaksesi **like_button.js** tiedoston käyttämään JSX:ää:
-1. In **like_button.js**, replace
+1. **like_button.js** tiedostossa, korvaa
```js
return React.createElement(
@@ -177,63 +177,64 @@ return React.createElement(
);
```
-with:
+seuraavalla:
```jsx
return setLiked(true)}>Like;
```
-2. In **index.html**, add `type="text/babel"` to the like button's script tag:
+1. **index.html** tiedostossa, lisää `type="text/babel"` like -painikkeen script -tagiin:
```html
```
-Here is [an example HTML file with JSX](https://raw.githubusercontent.com/reactjs/reactjs.org/main/static/html/single-file-example.html) that you can download and play with.
+Tässä on [esimerkki HTML tiedostosta JSX:n kanssa](https://raw.githubusercontent.com/reactjs/reactjs.org/main/static/html/single-file-example.html), jonka voit ladata itsellesi ja leikkiä sen kanssa.
-This approach is fine for learning and creating simple demos. However, it makes your website slow and **isn't suitable for production**. When you're ready to move forward, remove this new `
```
-Reload your website in the browser now to view it in developer tools.
+Lataa sivu uudelleen selaimessa näähdäksesi sen kehitystyökalussa.
+
+
-
+## Mobiili (React Native) {/*mobile-react-native*/}
-## Mobile (React Native) {/*mobile-react-native*/}
-React Developer Tools can be used to inspect apps built with [React Native](https://reactnative.dev/) as well.
+React kehistystyökalulla voidaan katsoa myöskin [React Native](https://reactnative.dev/):lla rakennettuja sovelluksia.
-The easiest way to use React Developer Tools is to install it globally:
+Helpoin tapa käyttää React kehitystyökaluja on asentamalla se globaalisti:
```bash
# Yarn
yarn global add react-devtools
@@ -58,13 +60,13 @@ yarn global add react-devtools
npm install -g react-devtools
```
-Next open the developer tools from the terminal.
+Sitten avaa kehitystyökalut terminaalista.
```bash
react-devtools
```
-It should connect to any local React Native app that's running.
+Sen pitäisi yhdistää mihin tahansa paikalliseen, käynnissäolevaan React Native sovellukseen.
-> Try reloading the app if developer tools doesn't connect after a few seconds.
+> Kokeile käynnistää sovellus uudelleen mikäli kehitystyökalu ei yhdistä muutaman sekuntin kuluttua.
-[Learn more about debugging React Native.](https://reactnative.dev/docs/debugging)
+[Lue lisää React Nativen debuggaamisesta.](https://reactnative.dev/docs/debugging)
From e90792243dbfffef2177f2778f8ab386581d2e44 Mon Sep 17 00:00:00 2001
From: Miro Rauhala <4082806+mirorauhala@users.noreply.github.com>
Date: Sun, 22 May 2022 18:29:22 +0300
Subject: [PATCH 24/80] Translate thinkin-in-react
---
beta/src/pages/learn/thinking-in-react.md | 458 +++++++++++-----------
1 file changed, 225 insertions(+), 233 deletions(-)
diff --git a/beta/src/pages/learn/thinking-in-react.md b/beta/src/pages/learn/thinking-in-react.md
index eca385790..63cb7f966 100644
--- a/beta/src/pages/learn/thinking-in-react.md
+++ b/beta/src/pages/learn/thinking-in-react.md
@@ -1,102 +1,119 @@
---
-title: Thinking in React
+title: Ajattelu Reactissa
---
-React can change how you think about the designs you look at and the apps you build. Where once you might have seen a forest, after working with React, you will appreciate the individual trees. React makes it easier to think in design systems and UI states. In this tutorial, we'll guide you through the thought process of building a searchable product data table with React.
+React saattaa muuttaa miten ajattelet mallien katsomista ja rakentamiasi sovelluksia. Missä kerran saatoit nähdä metsän, Reactin kanssa työskentelyn jälkeen arvostat yksittäisiä puita. React helpottaa ajattelua design-järjestelmissä ja UI-tiloissa. Tässä oppaassa käymme läpi haettavan tuotetaulukon luomisen Reactin avulla.
-## Start with the mockup {/*start-with-the-mockup*/}
+## Alota mallista {/*start-with-the-mockup*/}
-Imagine that you already have a JSON API and a mockup from a designer.
+Kuvittele, että sinulla on JSON API ja malli designerilta.
-The JSON API returns some data that looks like this:
+JSON API palauttaa dataa, joka näyttää seuraavalta:
```json
[
- { category: "Fruits", price: "$1", stocked: true, name: "Apple" },
- { category: "Fruits", price: "$1", stocked: true, name: "Dragonfruit" },
- { category: "Fruits", price: "$2", stocked: false, name: "Passionfruit" },
- { category: "Vegetables", price: "$2", stocked: true, name: "Spinach" },
- { category: "Vegetables", price: "$4", stocked: false, name: "Pumpkin" },
- { category: "Vegetables", price: "$1", stocked: true, name: "Peas" }
+ {"category": "Fruits", "price": "$1", "stocked": true, "name": "Apple"},
+ {"category": "Fruits", "price": "$1", "stocked": true, "name": "Dragonfruit"},
+ {
+ "category": "Fruits",
+ "price": "$2",
+ "stocked": false,
+ "name": "Passionfruit"
+ },
+ {"category": "Vegetables", "price": "$2", "stocked": true, "name": "Spinach"},
+ {
+ "category": "Vegetables",
+ "price": "$4",
+ "stocked": false,
+ "name": "Pumpkin"
+ },
+ {"category": "Vegetables", "price": "$1", "stocked": true, "name": "Peas"}
]
```
-The mockup looks like this:
+Ja malli tältä:
-
+
-To implement a UI in React, you will usually follow the same five steps.
+Käyttöliittymän toteuttaminen Reactissa seuraa usein viittä samaa vaihetta.
-## Step 1: Break the UI into a component hierarchy {/*step-1-break-the-ui-into-a-component-hierarchy*/}
+## 1. Vaihe: Riko käyttöliittymä komponenttihierarkiaan {/*step-1-break-the-ui-into-a-component-hierarchy*/}
-Start by drawing boxes around every component and subcomponent in the mockup and naming them. If you work with a designer, they may have already named these components in their design tool. Check in with them!
+Aloita piirtämällä laatikkoja jokaisen komponentin ja alakomponentin ympärille mallissa ja nimeämällä ne. Jos työskentelet designerin kanssa, he ovat saattaneet jo nimetä nämä komponentit heidän suunnittelutyökalussaan. Tarkista heiltä!
-Depending on your background, you can think about splitting up a design into components in different ways:
+Riippuen taustastasi, voit ajatella mallin jakamista osiin eri tavoin:
-* **Programming**--use the same techniques for deciding if you should create a new function or object. One such technique is the [single responsibility principle](https://en.wikipedia.org/wiki/Single_responsibility_principle), that is, a component should ideally only do one thing. If it ends up growing, it should be decomposed into smaller subcomponents.
-* **CSS**--consider what you would make class selectors for. (However, components are a bit less granular.)
-* **Design**--consider how you would organize the design's layers.
+- **Ohjelmointi**--käytä samaa tekniikkaa päättääkseen mikäli sinun pitää luoda uusi funktio tai olio. Yksi tekniikka on [single responsibility -periaate](https://en.wikipedia.org/wiki/Single_responsibility_principle), joka tarkoittaa, että komponentin täytyisi tehdä vain yksi asia. Mikäli se päätyy kasvamaan, se pitäisi jakaa pienempiin alakomponentteihin.
+- **CSS**--harkitse mille tekisit luokka-valitsimia. (Kuitenkin, komponentit koostuvat pienistä palasista.)
+- **Design**--harkiste miten järjestäisit mallin eri tasoihin.
-If your JSON is well-structured, you'll often find that it naturally maps to the component structure of your UI. That's because UI and data models often have the same information architecture--that is, the same shape. Separate your UI into components, where each component matches one piece of your data model.
+Huomaat jos JSON:isi on hyvin määriteltyä, se usein mäppäytyy komponentin rakenteeseen käyttöliittymässäsi. Tämä siksi, koska UI ja tietomalleilla usein on sama tietoarkkitehtuuri--eli, sama muoto. Erota käyttöliittymäsi komponenteiksi, jossa jokainen komponentti vastaa yhtä palasta tietomalliasi.
-There are five components on this screen:
+Ruudulla on viisi komponenttia:
-
+
-1. `FilterableProductTable` (grey) contains the entire app.
-2. `SearchBar` (blue) receives the user input.
-3. `ProductTable` (lavender) displays and filters the list according to the user input.
-4. `ProductCategoryRow` (green) displays a heading for each category.
-5. `ProductRow` (yellow) displays a row for each product.
+1. `FilterableProductTable` (harmaa) sisältää koko sovelluksen.
+2. `SearchBar` (sininen) vastaanottaa käyttäjän syötteen.
+3. `ProductTable` (laventeli) näyttää ja suodattaa listan käyttäjän syötteen perusteella.
+4. `ProductCategoryRow` (vihreä) näyttää otsikon jokaiselle kategorialle.
+5. `ProductRow` (keltainen) näyttää rivin jokaiselle tuotteelle.
-If you look at `ProductTable` (lavender), you'll see that the table header (containing the "Name" and "Price" labels) isn't its own component. This is a matter of preference, and you could go either way. For this example, it is a part of `ProductTable` because it appears inside the `ProductTable`'s list. However, if this header grows to be complex (e.g., if you add sorting), it would make sense to make this its own `ProductTableHeader` component.
+Jos katsot `ProductTable`:a (laventeli), huomaat että taulukon otsake (jooka sisältää "Name" ja "Price") ei ole oma komponenttinsa. Tämä on mieltymyskysymys ja voisit tehdä kummin päin tahansa. Tässä esimerkissä se on osa `ProductTable`:a koska se näkyy `ProductTable`:n listassa. Kuitenkin, jos tämä otsake kasvaa monimutkaiseksi (esim. jos lisäät suodattamisen), olisi järkevää tehdä siitä oma `ProductTableHeader` komponenttinsa.
-Now that you've identified the components in the mockup, arrange them into a hierarchy. Components that appear within another component in the mockup should appear as a child in the hierarchy:
+Nyt kun olet tunnistanut komponentit mallista, järjestä ne hierarkiaan. Komponentit, jotka näkyvät toisen komponentin sisällä mallissa, pitäisi olla lapsena hierarkiassa:
-* `FilterableProductTable`
- * `SearchBar`
- * `ProductTable`
- * `ProductCategoryRow`
- * `ProductRow`
+- `FilterableProductTable`
+ - `SearchBar`
+ - `ProductTable`
+ - `ProductCategoryRow`
+ - `ProductRow`
-## Step 2: Build a static version in React {/*step-2-build-a-static-version-in-react*/}
+## 2. Vaihe: Rakenna staattinen versio Reactissa {/*step-2-build-a-static-version-in-react*/}
-Now that you have your component hierarchy, it's time to implement your app. The most straightforward approach is to build a version that renders the UI from your data model without adding any interactivity... yet! It's often easier to build the static version first and then add interactivity separately. Building a static version requires a lot of typing and no thinking, but adding interactivity requires a lot of thinking and not a lot of typing.
+Nyt kun olet tehnyt komponenttihierarkian on aika toteuttaa sovelluksesi. Yksikertaisin tapa on rakentaa versio, joka renderöi käyttöliittymän tietomallista ilman interkatiivisuutta. Usei on helpompi rakentaa staattinen versio ensin ja sitten lisätä interkatiivisuus jälkikäteen. Staattisen version rakentaminen vaatii paljon kirjoittamista muttei ajattelua, kuitenkin interaktiivisuuden lisääminen vaatii paljon ajattelua ja ei paljoa kirjoittamista.
-To build a static version of your app that renders your data model, you'll want to build [components](/learn/your-first-component) that reuse other components and pass data using [props](/learn/passing-props-to-a-component). Props are a way of passing data from parent to child. (If you're familiar with the concept of [state](/learn/state-a-components-memory), don't use state at all to build this static version. State is reserved only for interactivity, that is, data that changes over time. Since this is a static version of the app, you don't need it.)
+Rakentaaksesi staattisen version sovelluksestasi, joka renderöi tietomallisi, käytä [komponentteja](/learn/your-first-component), jotka uudelleenkäyttävät toisia komponennteja ja välittävät tietoa käyttämällä [propseja](/learn/passing-props-to-a-component). Propsit ovat tapa välittää tietoa pääkomponentilta alakomponentille. (Jos [tila](/learn/state-a-components-memory) on konseptina tuttu, älä käytä tilaa ollenkaan kun rakennat tämän staattisen version. Tila vaaditaan vain interaktiivisuuteen, eli kun tieto muuttuu ajan kuluessa. Kerta tämä on staattinen versio sovelluksta, et tarvitse sitä.)
-You can either build "top down" by starting with building the components higher up in the hierarchy (like `FilterableProductTable`) or "bottom up" by working from components lower down (like `ProductRow`). In simpler examples, it’s usually easier to go top-down, and on larger projects, it’s easier to go bottom-up.
+Voit rakentaa joko "ylhäältä alas" aloittamalla komponenteilla, jotka ovat hierarkiassa ylempänä (kuten `FilterableProductTable`) tai "alhaalta ylös" työstämällä komponentteja alhaalla (kuten `ProductRow`). Yksinkertaisin esimerkein, useimmiten on helpompi tehä ylhäältä alaspäin, kun taas suuremmissa projekteissa on helpompi tehdä alhaalta ylöspäin.
```jsx App.js
-function ProductCategoryRow({ category }) {
+function ProductCategoryRow({category}) {
return (
@@ -162,12 +174,12 @@ function FilterableProductTable({ products }) {
}
const PRODUCTS = [
- {category: "Fruits", price: "$1", stocked: true, name: "Apple"},
- {category: "Fruits", price: "$1", stocked: true, name: "Dragonfruit"},
- {category: "Fruits", price: "$2", stocked: false, name: "Passionfruit"},
- {category: "Vegetables", price: "$2", stocked: true, name: "Spinach"},
- {category: "Vegetables", price: "$4", stocked: false, name: "Pumpkin"},
- {category: "Vegetables", price: "$1", stocked: true, name: "Peas"}
+ {category: 'Fruits', price: '$1', stocked: true, name: 'Apple'},
+ {category: 'Fruits', price: '$1', stocked: true, name: 'Dragonfruit'},
+ {category: 'Fruits', price: '$2', stocked: false, name: 'Passionfruit'},
+ {category: 'Vegetables', price: '$2', stocked: true, name: 'Spinach'},
+ {category: 'Vegetables', price: '$4', stocked: false, name: 'Pumpkin'},
+ {category: 'Vegetables', price: '$1', stocked: true, name: 'Peas'},
];
export default function App() {
@@ -177,7 +189,7 @@ export default function App() {
```css
body {
- padding: 5px
+ padding: 5px;
}
label {
display: block;
@@ -195,143 +207,140 @@ td {
-(If this code looks intimidating, go through the [Quick Start](/learn/) first!)
+(Jos tämä koodi näyttää pelottavalta, käy [Pika-aloitus](/learn/) läpi ensiksi!
-After building your components, you'll have a library of reusable components that render your data model. Because this is a static app, the components will only return JSX. The component at the top of the hierarchy (`FilterableProductTable`) will take your data model as a prop. This is called _one-way data flow_ because the data flows down from the top-level component to the ones at the bottom of the tree.
+Komponenttien rakentamisen jälkeen sinulta löytyy kirjasto uudelleenkäytettäviä komponentteja, jotka renderöivät tietomallisi. Sillä tämä on staattinn sovellus, komponentit ainoastaan palauttavat JSX:ää. Komponentit ylhäällä hierarkiassa (`FilterableProductTable`) saavat tietomallisi proppeina. Tätä kutsutaan _yksisuuntaiseksi tiedonkuluksi_ sillä tieto kulkee alas vain yläkomponenteista komponentteihin alhaalla puussa.
-At this point, you should not be using any state values. That’s for the next step!
+Tässä kohtaa sinun ei pitäisi käyttää mitään tila-arvoja. Se tulee seuraavassa vaiheessa!
-## Step 3: Find the minimal but complete representation of UI state {/*step-3-find-the-minimal-but-complete-representation-of-ui-state*/}
+## 3. Vaihe: Etsi minimaalinen, mutta täysinäinen mallinnus UI:n tilasta {/*step-3-find-the-minimal-but-complete-representation-of-ui-state*/}
-To make the UI interactive, you need to let users change your underlying data model. You will use *state* for this.
+Jotta voit tehdä käyttöliittymästä interaktiivisen, käyttäjien täytyy voida muuttaa taustalla olevaa tietomallia. Tähän tulet käyttämään _tilaa_.
-Think of state as the minimal set of changing data that your app needs to remember. The most important principle for structuring state is to keep it [DRY (Don't Repeat Yourself](https://en.wikipedia.org/wiki/Don%27t_repeat_yourself)). Figure out the absolute minimal representation of the state your application needs and compute everything else on-demand. For example, if you're building a shopping list, you can store the items as an array in state. If you want to also display the number of items in the list, don't store the number of items as another state value--instead, read the length of your array.
+Ajattele tilaa minimaalisena tiedon muutoksena, jota sovelluksesi täytyy muistaa. Tärkein periaate tilan järjestelyssä on pitää se kuivana ([DRY (Don't Repeat Yourself](https://en.wikipedia.org/wiki/Don%27t_repeat_yourself))). Selvitä kaikista pienin kuvaus tilasta, jota sovelluksesi tarvitsee ja laske kaikki muu tarpeen vaatiessa. Esimerkiksi jos olet rakentamassa ostoslistaa, voit tallentaa kohteet arrayna tilassa. Jos haluat myös näyttää myös määrän kohteista listalla, älä tallenna lukua toisena tila-arvona, vaan lue arrayn pituus.
-Now think of all of the pieces of data in this example application:
+Nyt ajattele kaikkia tiedonpalasia tässä esimerkkisovelluksessa:
-1. The original list of products
-2. The search text the user has entered
-3. The value of the checkbox
-4. The filtered list of products
+1. Alkupäinen lista tuotteista
+2. Hakulause, jonka käyttäjä on syöttänyt
+3. Valintaruudun arvo
+4. Lista suodatetuista tuotteista
-Which of these are state? Identify the ones that are not:
+Mitkä näistä ovat tiloja? Tunnista ne, jotka eivät ole:
-* Does it **remain unchanged** over time? If so, it isn't state.
-* Is it **passed in from a parent** via props? If so, it isn't state.
-* **Can you compute it** based on existing state or props in your component? If so, it *definitely* isn't state!
+- Pysyykö se **muuttumattona** ajan kuluessa? Jos näin, se ei ole tila.
+- Onko se **välitetty pääkomponentista** propsien avulla? Jos näin, se ei ole tila.
+- **Voitko laskea sen** alkuperäisen tilan tai propsien avulla komponentissasi? Jos näin, se ei _varmasti_ ole tila!
-What's left is probably state.
+Se mitä jää jäljelle on varmaankin tila.
-Let's go through them one by one again:
+Käydään ne vielä läpi yksitellen:
-1. The original list of products is **passed in as props, so it's not state**.
-2. The search text seems to be state since it changes over time and can't be computed from anything.
-3. The value of the checkbox seems to be state since it changes over time and can't be computed from anything.
-4. The filtered list of products **isn't state because it can be computed** by taking the original list of products and filtering it according to the search text and value of the checkbox.
+1. Alkuperäinen lista tuotteista **välitetään propseina, joten se ei ole tila**.
+2. Hakulause vaikuttaa olevan tila sillä se muuttuu ajan kuluessa eikä sitä voida laskea mistään.
+3. Valintaruudun arvo vaikuttaa olevan tila sillä se muuttuu ajan kuluessa eikä sitä voida laskea mistään.
+4. Lista suodatetuista tuotteista **ei ole tila sillä se voidaan laskea** alkuperäisestä tuotelistasta suodattamalla hakulauseen ja valintaruudun perusteella.
-This means only the search text and the value of the checkbox are state! Nicely done!
+Tämä tarkoittaa, että vain hakulause ja valintaruudun arvo ovat tiloja. Hienosti tehty!
-There are two types of "model" data in React: props and state. The two are very different:
+On kaksi "mallia" tietoa Reactissa: propsit ja tila. Nämä kaksi poikkeavat toisistaan:
-* [**Props** are like arguments you pass](/learn/passing-props-to-a-component) to a function. They let a parent component pass data to a child component and customize its appearance. For example, a `Form` can pass a `color` prop to a `Button`.
-* [**State** is like a component’s memory.](/learn/state-a-components-memory) It lets a component keep track of some information and change it in response to interactions. For example, a `Button` might keep track of `isHovered` state.
+- [**Propsit** ovat kuin argumentteja, joita välität](/learn/passing-props-to-a-component) funktiolle. Niillä pääkomponentti välittää tietoa alakomponentille ja mukauttaa sen ulkoasua. Esimerkiksi `Form` komponentti voi välittää `color` propin `Button` komponentille.
+- [**Tila** on kuin komponentin muisti.](/learn/state-a-components-memory) Sillä komponentti voi seurata jotain tietoa ja muuttaa sitä tapahtumien perusteella. Esimerkiksi `Button` komponetti voi seurata `isHovered` tilaa.
-Props and state are different, but they work together. A parent component will often keep some information in state (so that it can change it), and *pass it down* to child components as their props. It's okay if the difference still feels fuzzy on the first read. It takes a bit of practice for it to really stick!
+Propsit ja tila ovat eri asioita, mutta ne toimivat yhdesäs. Pääkomponentti usei pitää jotain tietoa tilassa (jotta se voi muuttaa sitä), ja _välittää ne alas_ alakomponenteille niiden propseina. On okei jos näiden ero tuntuu epämääräiseltä ensimmäisellä lukukerralla. Tämä saattaa vaatia vähän harjoittelua.
-## Step 4: Identify where your state should live {/*step-4-identify-where-your-state-should-live*/}
+## 4. Vaihe: Tunnista missä tilan kuuluisi elää {/*step-4-identify-where-your-state-should-live*/}
-After identifying your app’s minimal state data, you need to identify which component is responsible for changing this state, or *owns* the state. Remember: React uses one-way data flow, passing data down the component hierarchy from parent to child component. It may not be immediately clear which component should own what state. This can be challenging if you’re new to this concept, but you can figure it out by following these steps!
+Kun olet tunnistanut sovelluksesi minimaalisen tilan, täytyy tunnistaa mikä komponentti on vastuussa tilan muuttamisesta, tai _omistaa_ tilan. Muista: React käyttää yksisuuntaista tiedonkulkua välittäen tietoa alaspäin komponenttihierarkiassa pääkomponentilta alakomponentille. Se ei välttämättä heti aluksi ole selkeää minkä komponentin pitäisi omistaa mitäkin tilaa. Tämä saattaa olla haastaa jos konsepti on uusi, mutta voit selvittää sen seuraavilla ohjeilla!
-For each piece of state in your application:
+Jokaiselle palalle tilaa sovelluksessasi:
-1. Identify *every* component that renders something based on that state.
-2. Find their closest common parent component--a component above them all in the hierarchy.
-3. Decide where the state should live:
- 1. Often, you can put the state directly into their common parent.
- 2. You can also put the state into some component above their common parent.
- 3. If you can't find a component where it makes sense to own the state, create a new component solely for holding the state and add it somewhere in the hierarchy above the common parent component.
+1. Tunnista _jokainen_ komponentti, joka renderöi jotain sen tilan pohjalta.
+2. Etsi niiden lähin yhteinen pääkomponentti--komponentti kaikkien niiden yläpuolella hierarkiassa.
+3. Päätä missä tilan kuuluisi elää:
+ 1. Usei voit laittaa tilan suoraan yhteiseen pääkomponenttiin.
+ 2. Voit myös laittaa tilan yhteistä pääkomponenttia korkeammalle.
+ 3. Jos et löydä komponenttia, jonka olisi järkevä omistaa tila, luo uusi komponentti pelkästään ylläpitämään tilaa ja lisää se jonnekkin hierarkiassa yhteisen pääkomponentin yläpuolelle.
-In the previous step, you found two pieces of state in this application: the search input text, and the value of the checkbox. In this example, they always appear together, so it is easier to think of them as a single piece of state.
+Edellisessä vaiheessa sait kaksi palaa tilaa sovelluksessa: hakulauseen sekä valintaruudun arvon. Tässä esimerkissä molemmat näkyvät yhdessä, jotta on helpompi ajatella niitä yksittäisenä palana tilaa.
-Now let's run through our strategy for this state:
+Käydään läpi strategiaa tälle tilalle:
-1. **Identify components that use state:**
- * `ProductTable` needs to filter the product list based on that state (search text and checkbox value).
- * `SearchBar` needs to display that state (search text and checkbox value).
-1. **Find their common parent:** The first parent component both components share is `FilterableProductTable`.
-2. **Decide where the state lives**: We'll keep the filter text and checked state values in `FilterableProductTable`.
+1. **Tunnista komponentit, jotka käyttävät tilaa:**
+ - `ProductTable`:n täytyy suodataa tuotelista tilan perusteella (hakulauseella ja valintaruudun arvolla).
+ - `SearchBar`:n täytyy näyttää tila (hakulause ja valintaruudun arvo).
+2. **Etsi niiden yhteinen pääkomponentti:** Ensimmäinen komponentti, jonka molemmat jakavat on `FilterableProductTable`.
+3. **Päätä missä tila elää**: Pidämme hakulauseen ja valintaruudun arvon `FilterableProductTable` komponentissa.
-So the state values will live in `FilterableProductTable`.
+Joten tila elää `FilterableProductTable` komponentissa.
-Add state to the component with the [`useState()` Hook](/apis/usestate). Hooks let you "hook into" a component's [render cycle](/learn/render-and-commit). Add two state variables at the top of `FilterableProductTable` and specify the initial state of your application:
+Lisää tila komponenttiin käyttämällä [`useState()` Hookkia](/apis/usestate). Hookeilla pääset käsiksi komponentin [renderöintisykliin](/learn/render-and-commit). Lisä kaksi tilamuuttujaa `FilterableProductTable` komponentin yläosassa ja määritä sovelluksesi aloitusarvot:
```js
function FilterableProductTable({ products }) {
const [filterText, setFilterText] = useState('');
- const [inStockOnly, setInStockOnly] = useState(false);
+ const [inStockOnly, setInStockOnly] = useState(false);
```
-Then, pass `filterText` and `inStockOnly` to `ProductTable` and `SearchBar` as props:
+Sitten välitä `filterText` ja `inStockOnly` komponenteille `ProductTable` ja `SearchBar` propseina:
```js
-
-
+
+ inStockOnly={inStockOnly}
+ />
```
-You can start seeing how your application will behave. Edit the `filterText` initial value from `useState('')` to `useState('fruit')` in the sandbox code below. You'll see both the search input text and the table update:
+Alat näkemään miten sovelluksesi tulee käyttäytymään. Muokkaa `filterText` oletusarvoa arvosta `useState('')` arvoon `useState('fruit')` hiekkalaatikossa alla. Näet sekä hakulaatikon että taulukon päivittyvän:
```jsx App.js
-import { useState } from 'react';
+import {useState} from 'react';
-function FilterableProductTable({ products }) {
+function FilterableProductTable({products}) {
const [filterText, setFilterText] = useState('');
const [inStockOnly, setInStockOnly] = useState(false);
return (