From 5a1d1db5f6d94a6c662ca162b3ef74af28882155 Mon Sep 17 00:00:00 2001 From: n3ko Date: Fri, 6 Dec 2019 17:28:35 +0100 Subject: [PATCH 01/18] Create TRANSLATION.md {master} --- TRANSLATION.md | 122 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 122 insertions(+) create mode 100644 TRANSLATION.md diff --git a/TRANSLATION.md b/TRANSLATION.md new file mode 100644 index 000000000..65335fc69 --- /dev/null +++ b/TRANSLATION.md @@ -0,0 +1,122 @@ +# reactjs.org magyar fordítási projekt + +Ebben a repoban a hivatalos React dokumentáció magyar fordításán dolgozunk. A fordítás céljáról és egyéb részletekről olvasd el +[ezt a blogbejegyzést](https://reactjs.org/blog/2019/02/23/is-react-translated-yet.html) +és/vagy nézd meg [ezt a videót](https://youtu.be/lLE4Jqaek5k). Az egyes +fordítási projektek állásáról az +[isreacttranslatedyet.com](https://isreacttranslatedyet.com/) címen +tájékozódhatsz. + +Az eredeti (angol nyelvű) dokumentáció a [reactjs.org](https://reactjs.org)-on +található, ami egy [Gatsby](https://www.gatsbyjs.org/)-vel készült statikus +weboldal. Ebből lett forkolva ez a repo, ami majd a magyar változatot +tartalmazza, mikor elkészült. Jelenleg a dokumentumok kb. fele még eredeti +nyelvű. + +## Fordítók + +A fordítást @gergely-nagy és @balazsorban44 kezdték el, örömmel vesszük, ha +csatlakozol. A projektről a +[react-translations.slack.com](https://rt-slack-invite.herokuapp.com/) oldal + #hu csatornáján is beszélgethetünk. + +## Hozzájárulás + +A fordítás menete a következező: + +1. [Itt választasz](https://github.com/reactjs/hu.reactjs.org/issues/1) fordítandó anyagot és jelzed, hogy elkezdenéd a fordítását. +1. Indítasz egy forkot, az angol szöveg helyére beírod a magyar fordítást. +1. Amikor elkészült, küldesz egy PR-t a módosításodról + +## Gyakori kifejezések + +| Engllish | Magyar | +| --- | --- | +| _technical and React-specific_ | +| declarative | deklaratív | +| component | komponens | +| controlled components | kontrollált komponens | +| uncontrolled components | kontrollálatlan komponens | +| render | renderelés | +| data | adat | +| application | alkalmazás | +| external plugins | külső bővítmények | +| third party plugins | harmadik féltől származó bővítmények | +| syntax | szintaxis | +| embedding expressions | kifejezések beágyazása | +| attributes | attributumok | +| element | elem | +| functional component | függvény komponens | +| function component | fügvény komponens | +| class components | oszály komponensek | +| composition | kompozíció | +| inheritance | öröklődés | +| lifecycle | életciklus | +| handling events | esemény kezelés | +| conditional Rendering | feltételes renderelés | +| operator | operátor | +| reuse | újrafelhasználás | +| reusable | újrafelhasználható | +| shallow rendering | sekély renderelés | +| deprecated | elavult | +| legacy | örökség / korábbi | +| cross-cutting concerns | | +| HOC | FRK | +| higher-order-component | felsőbb rendű komponens | +| reconciliation | | +| state | állapot | +| local state | helyi állapot | +| derived state | származtatott állapot | +| asserts (logikai kijelentés) | állít | +| vendor prefix | | +| fallback | | +| breaking change | | +| function signature | | +| props / prop | propok / prop | +| context | kontextus | +| fragments | töredék | +| portal | portál | +| class | osztály | +| tick | ketyegés | +| bundle | köteg | +| package | csomag | +| consumer | | +| provider | | +| PropTypes | PropTípusok | +| good/bad | jó/rossz | +| mixins | mixinek | +| web components | web komponensek | +| wrapper | | +| mutation | mutáció | +| _General purpose_ | +| tutorial | tutoriál | +| tip | tipp| +| note | megjegyzés | +| example | példa | +| reference | referencia | +| for example | például | +| importing | | import/importálás | +| opt-in | opcionális | +| section | szekció | +| overview | áttekintés | +| try it on CodePen | próbáld ki a CodePenen| +| _No translation required_ | +| DOM | +| UI | +| ref | +| Web (use uppercase)| +| Create React App | +| polyfill | +| React | +| Fiber | +| hook | +| stateful | +| stateless | +| mock | | +| callback | +| Promise | | + +## Hasznos források + +1. [Angol-magyar informatikai szótár](https://www.tankonyvtar.hu/hu/tartalom/tkt/angol-magyar/index.html) +2. [IT-Szótár](http://www.itszotar.hu/) From 974978d47b90067d37aa2c44eefbb49747284a1f Mon Sep 17 00:00:00 2001 From: n3ko Date: Sun, 8 Dec 2019 22:33:14 +0100 Subject: [PATCH 02/18] translate language names {thinking-in-react-hu} --- content/languages.yml | 78 +++++++++++++++++++++---------------------- 1 file changed, 39 insertions(+), 39 deletions(-) diff --git a/content/languages.yml b/content/languages.yml index cedbf18da..e7520a7e8 100644 --- a/content/languages.yml +++ b/content/languages.yml @@ -3,55 +3,55 @@ # 1: Partially complete (50-99%) # 2: Complete (100%) -- name: English +- name: Angol translated_name: English code: en status: 2 -- name: Arabic +- name: Arab translated_name: العربية code: ar status: 2 -- name: Azerbaijani +- name: Azerbajdzsáni translated_name: Azərbaycanca code: az status: 2 -- name: Bulgarian +- name: Bolgár translated_name: Български code: bg status: 1 -- name: Bengali +- name: Bengáli translated_name: বাংলা code: bn status: 1 -- name: Catalan +- name: Katalán translated_name: Català code: ca status: 1 -- name: German +- name: Német translated_name: Deutsch code: de status: 1 -- name: Greek +- name: Görög translated_name: Ελληνικά code: el status: 1 -- name: Spanish +- name: Spanyol translated_name: Español code: es status: 2 -- name: Persian +- name: Perzsa translated_name: فارسی code: fa status: 0 -- name: French +- name: Francia translated_name: Français code: fr status: 2 -- name: Gujarati +- name: Guzsaráti translated_name: ગુજરાતી code: gu status: 0 -- name: Hebrew +- name: Héber translated_name: עברית code: he status: 1 @@ -59,35 +59,35 @@ translated_name: हिन्दी code: hi status: 0 -- name: Haitian Creole +- name: Haitian kreol translated_name: Kreyòl ayisyen code: ht status: 0 -- name: Hungarian +- name: Magyar translated_name: magyar code: hu status: 0 -- name: Armenian +- name: Örmény translated_name: Հայերեն code: hy status: 0 -- name: Indonesian +- name: Indonéz translated_name: Bahasa Indonesia code: id status: 1 -- name: Italian +- name: Olasz translated_name: Italiano code: it status: 2 -- name: Japanese +- name: Japán translated_name: 日本語 code: ja status: 2 -- name: Georgian +- name: Grúz translated_name: ქართული code: ka status: 0 -- name: Central Khmer +- name: Közép-khmer translated_name: ភាសាខ្មែរ code: km status: 0 @@ -95,15 +95,15 @@ translated_name: ಕನ್ನಡ code: kn status: 0 -- name: Korean +- name: Koreai translated_name: 한국어 code: ko status: 2 -- name: Kurdish +- name: Kurd translated_name: کوردی‎ code: ku status: 0 -- name: Lithuanian +- name: Litván translated_name: Lietuvių kalba code: lt status: 0 @@ -111,35 +111,35 @@ translated_name: മലയാളം code: ml status: 0 -- name: Mongolian +- name: Mongol translated_name: Монгол хэл code: mn status: 2 -- name: Nepali +- name: Nepáli translated_name: नेपाली code: ne status: 0 -- name: Dutch +- name: Holland translated_name: Nederlands code: nl status: 0 -- name: Polish +- name: Lengyel translated_name: Polski code: pl status: 2 -- name: Portuguese (Brazil) +- name: Portugál (Brazil) translated_name: Português do Brasil code: pt-br status: 2 -- name: Portuguese (Portugal) +- name: Portugál (Portugália) translated_name: Português europeu code: pt-pt status: 0 -- name: Romanian +- name: Román translated_name: Română code: ro status: 0 -- name: Russian +- name: Orosz translated_name: Русский code: ru status: 2 @@ -147,7 +147,7 @@ translated_name: සිංහල code: si status: 0 -- name: Swedish +- name: Svéd translated_name: Svenska code: sv status: 0 @@ -167,11 +167,11 @@ translated_name: Wikang Tagalog code: tl status: 0 -- name: Turkish +- name: Török translated_name: Türkçe code: tr status: 2 -- name: Ukrainian +- name: Ukrán translated_name: Українська code: uk status: 2 @@ -179,19 +179,19 @@ translated_name: اردو code: ur status: 0 -- name: Uzbek +- name: Üzbég translated_name: Oʻzbekcha code: uz status: 0 -- name: Vietnamese +- name: Vietnami translated_name: Tiếng Việt code: vi status: 1 -- name: Simplified Chinese +- name: Egyszerűsített kínai translated_name: 简体中文 code: zh-hans status: 2 -- name: Traditional Chinese +- name: Tradicionális kínai translated_name: 繁體中文 code: zh-hant status: 2 From 579c18cdf6dd8ee2b40167587d8a11a715fd47dc Mon Sep 17 00:00:00 2001 From: n3ko Date: Wed, 11 Dec 2019 10:07:59 +0100 Subject: [PATCH 03/18] translate thinking-in-react {thinking-in-react-hu} --- content/docs/nav.yml | 2 +- content/docs/thinking-in-react.md | 134 +++++++++--------- .../blog/thinking-in-react-components-hu.png | Bin 0 -> 38312 bytes .../images/blog/thinking-in-react-mock-hu.png | Bin 0 -> 35122 bytes 4 files changed, 68 insertions(+), 68 deletions(-) create mode 100644 content/images/blog/thinking-in-react-components-hu.png create mode 100644 content/images/blog/thinking-in-react-mock-hu.png diff --git a/content/docs/nav.yml b/content/docs/nav.yml index 43b8c780c..d36ce5d63 100644 --- a/content/docs/nav.yml +++ b/content/docs/nav.yml @@ -36,7 +36,7 @@ - id: composition-vs-inheritance title: Kompozíció és öröklődés - id: thinking-in-react - title: Gondolkodj React-ben + title: Gondolkodj Reactül - title: Haladó útmutatók items: - id: accessibility diff --git a/content/docs/thinking-in-react.md b/content/docs/thinking-in-react.md index 6e5e7ed94..528d7658f 100644 --- a/content/docs/thinking-in-react.md +++ b/content/docs/thinking-in-react.md @@ -1,6 +1,6 @@ --- id: thinking-in-react -title: Thinking in React +title: Gondolkodj Reactül permalink: docs/thinking-in-react.html redirect_from: - 'blog/2013/11/05/thinking-in-react.html' @@ -8,17 +8,17 @@ redirect_from: prev: composition-vs-inheritance.html --- -React is, in our opinion, the premier way to build big, fast Web apps with JavaScript. It has scaled very well for us at Facebook and Instagram. +A React, véleményünk szerint, elsőrendű módja nagy és gyors Javascript alapú webalkalmazások készítésének. A Facebook és az Instagram esetében nekünk nagyon jól skálázódott. -One of the many great parts of React is how it makes you think about apps as you build them. In this document, we'll walk you through the thought process of building a searchable product data table using React. +Az egyik a remek dolog – sok más mellett – ahogy a React átalakítja a gondolkodásodat az alkalmazásaidról miközben készíted őket. Ebben a fejezetben végigvezetünk a folyamaton, ahogy egy kereshető termék táblázatot megtervezünk és felépítünk React használatával. -## Start With A Mock {#start-with-a-mock} +## Kezdjük a skiccel {#start-with-a-mock} -Imagine that we already have a JSON API and a mock from our designer. The mock looks like this: +Tegyük fel, hogy már van egy JSON API-nk és egy rajz a grafikusunktól. A skicc nézzen ki valahogy így: ![Mockup](../images/blog/thinking-in-react-mock.png) -Our JSON API returns some data that looks like this: +A JSON API-tól kapott adatok így néznek ki: ``` [ @@ -31,27 +31,27 @@ Our JSON API returns some data that looks like this: ]; ``` -## Step 1: Break The UI Into A Component Hierarchy {#step-1-break-the-ui-into-a-component-hierarchy} +## Első lépés: Szedjük szét a felületet egy komponens hierarchiába! {#step-1-break-the-ui-into-a-component-hierarchy} -The first thing you'll want to do is to draw boxes around every component (and subcomponent) in the mock and give them all names. If you're working with a designer, they may have already done this, so go talk to them! Their Photoshop layer names may end up being the names of your React components! +Az első dolgod, hogy körberajzolod az egyes komponenseket és alkomponenseket a skiccen, és el is nevezed őket. Ha a grafikussal együtt dolgozol, van rá esély, hogy ő már előtted megtette ezt, szóval irány beszélj vele! A rajzon a rétegek nevei valószínűleg React komponenseidnek is megfelelő. -But how do you know what should be its own component? 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. +Honnan tudhatod, hogy miből legyen komponens? Ugyanazt a módszert használhatod, amivel eldöntöd, hogy valaminek kell-e saját függvény vagy objektum. Az egyik ilyen az [egy felelősség alapelve](https://hu.wikipedia.org/wiki/Egy_felel%C5%91ss%C3%A9g_alapelve), vagyis a komponens lehetőleg csak egy dolgot csináljon. Ha növekszik, kisebb egységekre kell bontani. -Since you're often displaying a JSON data model to a user, you'll find that if your model was built correctly, your UI (and therefore your component structure) will map nicely. That's because UI and data models tend to adhere to the same *information architecture*. Separate your UI into components, where each component matches one piece of your data model. +Gyakran kell JSON adatokat megjeleníteni a felhasználónak. Mint az te is tapasztalni fogod, ha a model helyesen épül fel, akkor az UI (és így a komponensek struktúrája) szépen le fogja képezni. Ez annak köszönhető, hogy általában az adatmodell is hasonló elvek alapján készül. Különítsd el komponenseidet úgy, hogy minden komponens az adatmodell egy-egy darabjára illeszkedjen. -![Component diagram](../images/blog/thinking-in-react-components.png) +![Komponens diagram](../images/blog/thinking-in-react-components.png) -You'll see here that we have five components in our app. We've italicized the data each component represents. +Amint látod az app így öt komponensből áll. Dőlt betűvel emeltük ki az egyes komponensek által képviselt adatokat. - 1. **`FilterableProductTable` (orange):** contains the entirety of the example - 2. **`SearchBar` (blue):** receives all *user input* - 3. **`ProductTable` (green):** displays and filters the *data collection* based on *user input* - 4. **`ProductCategoryRow` (turquoise):** displays a heading for each *category* - 5. **`ProductRow` (red):** displays a row for each *product* + 1. **`FilterableProductTable` (narancs):** magába foglalja a teljes példánkat + 2. **`SearchBar` (kék):** ez fogadja az *adatbevitelt* + 3. **`ProductTable` (zöld):** megjeleníti és szűri az *adathalmazt* az *adatbevitel* alapján + 4. **`ProductCategoryRow` (türkiz):** megjeleníti a *kategóriák* fejlécét + 5. **`ProductRow` (vörös):** megjelenít egy-egy *terméket* -If you look at `ProductTable`, 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 there's an argument to be made either way. For this example, we left it as part of `ProductTable` because it is part of rendering the *data collection* which is `ProductTable`'s responsibility. However, if this header grows to be complex (e.g., if we were to add affordances for sorting), it would certainly make sense to make this its own `ProductTableHeader` component. +Megvizsgálva a `ProductTable`-t látni fogod, hogy a fejléc (ami a "Termék" és "Ár" címkéket tartalmazza) nem független komponens. Ez ízlés kérdése is, lehet érvelni róla pro és kontra. Ebben a példában meghagyjuk ezt a `ProductTable` részeként, mert része az *adat halmaz* renderelésének ami a `ProductTable` felsősége. A későbbiekben, ha ez a fejléc bonyolultabbá válik (pl. lehetőséget kell adnunk rendezésre), érdemes megfontolni, hogy készítsünk egy önálló `ProductTableHeader` komponenst. -Now that we've identified the components in our mock, let's arrange them into a hierarchy. Components that appear within another component in the mock should appear as a child in the hierarchy: +Most, hogy azonosítottuk a komponenseket a rajzunkon, rendezzük őket el egy hierarchiában. Az a komponens ami egy másikon belül foglal helyet, legyen ennek a gyermeke: * `FilterableProductTable` * `SearchBar` @@ -59,88 +59,88 @@ Now that we've identified the components in our mock, let's arrange them into a * `ProductCategoryRow` * `ProductRow` -## Step 2: Build A Static Version in React {#step-2-build-a-static-version-in-react} +## Második lépés: Készítsünk egy statikus verziót Reactben {#step-2-build-a-static-version-in-react} -

See the Pen Thinking In React: Step 2 on CodePen.

+

Nézd meg a Thinking In React: Step 2-t a CodePenen.

-Now that you have your component hierarchy, it's time to implement your app. The easiest way is to build a version that takes your data model and renders the UI but has no interactivity. It's best to decouple these processes because building a static version requires a lot of typing and no thinking, and adding interactivity requires a lot of thinking and not a lot of typing. We'll see why. +Most, hogy megvan a komponens hierarchiánk, ideje implementálni az appot. A legkönyebb, ha elkészítünk egy olyan változatot, ami az adatmodellt felhasználva rendereli a UI-t, de még nem interaktív. Jobb ha szétválasztjuk ezeket, mert a statikus változat elkészítése leginkább csak gépelésből áll, ezzel szemben az interaktivitás megtervezése több gondolkodást és kevesebb gépelést igényel. Rögtön látni fogjuk miért. -To build a static version of your app that renders your data model, you'll want to build components that reuse other components and pass data using *props*. *props* are a way of passing data from parent to child. If you're familiar with the concept of *state*, **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. +Az alkalmazás statikus változat feladata, hogy rendereli az adatmodellt. Építsük fel a komponenseket, melyek más komponenseket használnak fel, az adatokat `props` használatával adva tovább. A `props` az egyik mód, amivel a szülő adatokat adhat a gyermek komponensnek. Ha esetleg már ismered a `state` használatát, most még **ne használd** a statikus változatban. A `state` (állapot) interaktivitás kezeléséhez van fenntartva. Segítségével az adataink időben változhatnak. Amíg a statikus változatot készíted, nem lesz rá szükség. -You can build top-down or bottom-up. That is, you can either start with building the components higher up in the hierarchy (i.e. starting with `FilterableProductTable`) or with the ones lower in it (`ProductRow`). In simpler examples, it's usually easier to go top-down, and on larger projects, it's easier to go bottom-up and write tests as you build. +Építkezhetsz felülről lefelé vagy fordítva. Vagyis kezdheted a hierarchiában legmagasabban lévő (esetünkben ez a `FilterableProductTable`) komponenssel vagy alulról is (`ProductRow`). Egyszerűbb példáknál általában egyszerűbb fentről kezdeni, nagyobb projekteknél könnyebb ha alulról felfelé haladsz menet közben teszteket is készítve. -At the end of this step, you'll have a library of reusable components that render your data model. The components will only have `render()` methods since this is a static version of your app. The component at the top of the hierarchy (`FilterableProductTable`) will take your data model as a prop. If you make a change to your underlying data model and call `ReactDOM.render()` again, the UI will be updated. You can see how your UI is updated and where to make changes. React's **one-way data flow** (also called *one-way binding*) keeps everything modular and fast. +Ezt a lépést bevégezve van egy könyvtárad a többször hasznosítható komponensekből, melyek megjelenítik az adatmodellt. A komponenseknek csak `render()` metódusuk van, mivel ez még mindig a statikus változat. A hierarchia tetején csücsülő komponens (`FilterableProductTable`) egy `props`ban kapja meg az adatokat. Ha változtatsz valamit az adatmodellen és újra meghívod a `ReactDOM.render()` a UI frissül. Láthatod, hogyan frissül a UI, hol változik. A React **egyirányú adatáramlása** (*one-way data flow* vagy *one-way binding*) mindent modulárisan és gyorsan kezel. -Refer to the [React docs](/docs/) if you need help executing this step. +Fordulj a [React dokumentáció](/docs/)hoz ha segítségre van szükség a lépés elvégzéséhez! -### A Brief Interlude: Props vs State {#a-brief-interlude-props-vs-state} +### Egy kis közjáték: `props` vagy `state` {#a-brief-interlude-props-vs-state} -There are two types of "model" data in React: props and state. It's important to understand the distinction between the two; skim [the official React docs](/docs/state-and-lifecycle.html) if you aren't sure what the difference is. See also [FAQ: What is the difference between state and props?](/docs/faq-state.html#what-is-the-difference-between-state-and-props) +Kétféle adatot használunk Reactban, van `props` és `state`. Fontos megérteni a különbséget; fussd végig a [hivatalos React dokumentációt](/docs/state-and-lifecycle.html) ha nem vagy biztos benne, hogy ez már világos! Lásd még [GYÍK: `state` vagy `props`, mi a különbség?](/docs/faq-state.html#what-is-the-difference-between-state-and-props) -## Step 3: Identify The Minimal (but complete) Representation Of UI State {#step-3-identify-the-minimal-but-complete-representation-of-ui-state} +## Harmadik lépés: Azonosítsd UI állapot minimális (de teljes) reprezentációját {#step-3-identify-the-minimal-but-complete-representation-of-ui-state} -To make your UI interactive, you need to be able to trigger changes to your underlying data model. React achieves this with **state**. +Ahoz, hogy a UI interaktív legyen, képesnek kell lenned változásokat kiváltani a mögöttes adatmodellben. A React ezt a *`state`* segítségével éri el. -To build your app correctly, you first need to think of the minimal set of mutable state that your app needs. The key here is [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 you need on-demand. For example, if you're building a TODO list, keep an array of the TODO items around; don't keep a separate state variable for the count. Instead, when you want to render the TODO count, take the length of the TODO items array. +A helyes felépítéshez először a megváltoztatható állapotok minimális halmazára van szükség. A kulcs itt, hogy [Ne ismételd önmagad](https://hu.wikipedia.org/wiki/Ne_ism%C3%A9teld_%C3%B6nmagad). Találd ki az abszolut minimális reprezentációt és minden mást menet közben számíttas ki igény szerint. Ha például egy TODO listát készítesz, legyen egy tömb a teendőkről, de nem kell egy külön változó a darabszámnak. Inkább mikor meg kell jeleníteni az elemek számát csak használd a *length*-et a tömbbödből. -Think of all of the pieces of data in our example application. We have: +Vegyük végig a példánkban szereplő adatokat: - * The original list of products - * The search text the user has entered - * The value of the checkbox - * The filtered list of products + * Az eredeti termék lista + * A szöveg amit a felhasználó megadott a keresésben + * A jelölőnégyzet állapota + * A termékek leválogatott listája -Let's go through each one and figure out which one is state. Ask three questions about each piece of data: +Nézzük hát ezekből mi lehet állapot? Ezeket a kérdéseket kell feltenned mindegyikkel kapcsolatban: - 1. Is it passed in from a parent via props? If so, it probably isn't state. - 2. Does it remain unchanged over time? If so, it probably isn't state. - 3. Can you compute it based on any other state or props in your component? If so, it isn't state. + 1. Egy szülő komponenstől kaptuk a `props˛között? Ha igen, akkor ez valószínűleg nem `state`. + 2. Időben változatlan? Ha igen, feltehetőleg nem `state`. + 3. Elő tudod állítani az egyéb `state` és a `props` alapján? Ha igen, akkor nem `state`. -The original list of products is passed in as props, so that's not state. The search text and the checkbox seem to be state since they change over time and can't be computed from anything. And finally, the filtered list of products isn't state because it can be computed by combining the original list of products with the search text and value of the checkbox. +Az eredeti terméklista `props`ban érkezik, tehát nem `state`. A keresés szövege és a jelölőnégyzet `state` lesz, hiszen megváltozhatnak és nem számíthatók ki más adatokból. Végül a leszűrt terméklista sem `state` hiszen az eredeti lista és kereső szöveg valamint a jelölőnégyzet állapota alapján számolható. -So finally, our state is: +Tehát ennyi lett a `state`: - * The search text the user has entered - * The value of the checkbox + * A felhasználó által megadott keresőszöveg + * A jelölőnégyzet értéke -## Step 4: Identify Where Your State Should Live {#step-4-identify-where-your-state-should-live} +## Negyedik lépés: Azonosítsd HOL kell tartanod a state-et {#step-4-identify-where-your-state-should-live} -

See the Pen Thinking In React: Step 4 on CodePen.

+

Nézd meg a Thinking In React: Step 4-t a CodePenen.

-OK, so we've identified what the minimal set of app state is. Next, we need to identify which component mutates, or *owns*, this state. +OK, szóval meghatároztuk mi a minimális `state` az appunkban. Most el kell dönteni melyik komponens változtatja vagy *birtokolja* ezt a `state`-et. -Remember: React is all about one-way data flow down the component hierarchy. It may not be immediately clear which component should own what state. **This is often the most challenging part for newcomers to understand,** so follow these steps to figure it out: +Emlékszel: A React lényege az egy irányú adatáramlás a komponens hierarchiában. Talán nem egyértelmű melyik komponenshez melyik `state` tartozik. **Gyakran ezt megérteni a legnagyobb kihívás kezdők számára,** de csak kövesd ezeket a lépéseket: -For each piece of state in your application: +Minden azonosított `state`-hez alkalmazásodban: - * Identify every component that renders something based on that state. - * Find a common owner component (a single component above all the components that need the state in the hierarchy). - * Either the common owner or another component higher up in the hierarchy should own the state. - * 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 owner component. + * Azonosís minden komponenst amely renderel valamit az adott `state` alapján + * Keresd meg a közös komponenst (egy bizonyos komponens a hierarchiában, ami felette áll `state`-et használó minden komponensnek). + * Vagy a közös szülő, vagy egy másik a hierarchiában magasebban álló komponens kell birtokolja a `state`-et. + * Ha nem találsz olyan komponenst ahol van értelme a `state`-et elhelyezni, létrehozhatsz egy pusztán azért, hogy azt kezelje és illeszd a hierarchiába valahol a közös konténer felett. -Let's run through this strategy for our application: +Próbáljuk ki ezt a stratégiát az alkalmazásunkon: - * `ProductTable` needs to filter the product list based on state and `SearchBar` needs to display the search text and checked state. - * The common owner component is `FilterableProductTable`. - * It conceptually makes sense for the filter text and checked value to live in `FilterableProductTable` + * A `ProductTable` le kell szűrje a listát és a `SearchBar` meg kell jelenítse a kereső szöveget és jelölőnégyzet állapotát. + * A közös konténer számukra a `FilterableProductTable`. + * Fogalmilag tényleg van értelme, hogy mindkét érték `FilterableProductTable` komponensben lakjon. -Cool, so we've decided that our state lives in `FilterableProductTable`. First, add an instance property `this.state = {filterText: '', inStockOnly: false}` to `FilterableProductTable`'s `constructor` to reflect the initial state of your application. Then, pass `filterText` and `inStockOnly` to `ProductTable` and `SearchBar` as a prop. Finally, use these props to filter the rows in `ProductTable` and set the values of the form fields in `SearchBar`. +Király, ezzel el is döntöttük, a `state` helye a `FilterableProductTable`. Először, vegyük fel hozzá a pédány tulajdonságot a `FilterableProductTable` construktorába és adjunk neki kezdeti értéket is: `this.state = {filterText: '', inStockOnly: false}`. Ezután adjuk tovább a `filterText` és `inStockOnly` értékét a `ProductTable` és a `SearchBar` számára `props`ban. Végül a `ProductTable`-ben használjuk őket szűrésre és jelenítsük meg az értéküket a `SearchBar` form mezőiben. -You can start seeing how your application will behave: set `filterText` to `"ball"` and refresh your app. You'll see that the data table is updated correctly. +Hogy viselkedik az app, ha `filterText` értékét beállítod `"ball"`-nak és frissíted az app-ot? Láthatod, hogy az értékek ennek megfelelően jelennek meg. -## Step 5: Add Inverse Data Flow {#step-5-add-inverse-data-flow} +## Ötödik lépés: Inverz adatáramlás {#step-5-add-inverse-data-flow} -

See the Pen Thinking In React: Step 5 on CodePen.

+

Nézd meg a Thinking In React: Step 5-t a CodePenen.

-So far, we've built an app that renders correctly as a function of props and state flowing down the hierarchy. Now it's time to support data flowing the other way: the form components deep in the hierarchy need to update the state in `FilterableProductTable`. +Van tehát egy alkalmazásunk ami helyesen jeleníti meg az adatokat a `props` és a `state` függvényében lefelé áramoltatva ezeket a hierarchiában. Eljött az ideje, hogy a másik irányba is mozgassunk adatokat. A form komponenseinknek a hierarchia mélyén is tudniuk kell frissíteni a `state`-et `FilterableProductTable`-ben. -React makes this data flow explicit to help you understand how your program works, but it does require a little more typing than traditional two-way data binding. +Reactben ezt nagyon kifejezően ábrázolhatjuk, ami segíti megérteni a program hogyan is működik, de egy kicsit többet kell hozzá gépelni, mint a hagyományos kétirányú adatkapcsolat esetén. -If you try to type or check the box in the current version of the example, you'll see that React ignores your input. This is intentional, as we've set the `value` prop of the `input` to always be equal to the `state` passed in from `FilterableProductTable`. +Ha próbáltál szöveget beírni vagy kipipálni a jelölőnégyzetet a mostani verziónkban, akkor már láttad, hogy a React figyelmen kívül hagyja a bemeneteket. Ez szándékos, mivel így lehetséges, hogy a `props`ban kapott érték amit átadunk az `input`nak a `value`-ban mindíg azonos legyen a `state`-ben tárolt értékkel amit `FilterableProductTable`-ból továbbadunk. -Let's think about what we want to happen. We want to make sure that whenever the user changes the form, we update the state to reflect the user input. Since components should only update their own state, `FilterableProductTable` will pass callbacks to `SearchBar` that will fire whenever the state should be updated. We can use the `onChange` event on the inputs to be notified of it. The callbacks passed by `FilterableProductTable` will call `setState()`, and the app will be updated. +Gondoljuk végig mit szeretnénk, mi történjen. Azt akarjuk, hogy bármikor ha felhasználó megváltoztatja a formot mi frissíthessük a `state`-et, hogy tükrözze a bemeneten kapott adatot. Mivel a komponensek csak a saját `state`-jét frissítheti, a `FilterableProductTable` callback függvényeket ad át a `SearchBar`-nak melyek meghívódnak valahányszor a `state`-et frissíteni kell. Használhatjuk az input mezők `onChange` eseményét, a `FilterableProductTable` által átadott callback-ek meghívhatják annak `setState()` metódusát és appunk frissül majd. -## And That's It {#and-thats-it} +## Ennyi volna {#and-thats-it} -Hopefully, this gives you an idea of how to think about building components and applications with React. While it may be a little more typing than you're used to, remember that code is read far more than it's written, and it's less difficult to read this modular, explicit code. As you start to build large libraries of components, you'll appreciate this explicitness and modularity, and with code reuse, your lines of code will start to shrink. :) +Remélhetőleg ezután már van némi fogalmad, hogyan is gondolkodj, mikor egy komponenst vagy egy alkalmazást készítesz Reactban. Talán egy kicsit többet kellett gépelned, mint amit eddig megszoktál, de ne feledd, általában több időt töltünk a forráskód olvasásával, mint az írással, és kevésbé fárasztó ezt a moduláris, kifejező kódot olvasni. Amikor elkezdesz terjedelmes komponens könyvtárakat létrehozni, nagyra értékeled majd a modularitást és az olvashatóságot, és az újrahaszosíthatóság révén a kódod sorai rövidülni kezdenek. :) diff --git a/content/images/blog/thinking-in-react-components-hu.png b/content/images/blog/thinking-in-react-components-hu.png new file mode 100644 index 0000000000000000000000000000000000000000..dd07ca95ec7e97275434d568cc0420d8753ef13b GIT binary patch literal 38312 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

97>8e27zPpKQ`A5RR8wn|vaWljA2 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 literal 0 HcmV?d00001 diff --git a/content/images/blog/thinking-in-react-mock-hu.png b/content/images/blog/thinking-in-react-mock-hu.png new file mode 100644 index 0000000000000000000000000000000000000000..a9f5dcbe318f4bd935d266dd57cb01de93642bfa GIT binary patch literal 35122 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 literal 0 HcmV?d00001 From 420bee65f96d9cbcf9cf04aac76227bf82e3f304 Mon Sep 17 00:00:00 2001 From: n3ko Date: Wed, 18 Dec 2019 09:58:08 +0100 Subject: [PATCH 04/18] Update TRANSLATION.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Balázs Orbán --- TRANSLATION.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/TRANSLATION.md b/TRANSLATION.md index 65335fc69..83e38b84b 100644 --- a/TRANSLATION.md +++ b/TRANSLATION.md @@ -30,7 +30,7 @@ A fordítás menete a következező: ## Gyakori kifejezések -| Engllish | Magyar | +| English | Magyar | | --- | --- | | _technical and React-specific_ | | declarative | deklaratív | From cd77caada15a43a3ba21613ee0835f98bdb36f81 Mon Sep 17 00:00:00 2001 From: n3ko Date: Wed, 18 Dec 2019 09:58:18 +0100 Subject: [PATCH 05/18] Update TRANSLATION.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Balázs Orbán --- TRANSLATION.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/TRANSLATION.md b/TRANSLATION.md index 83e38b84b..7c4cd2407 100644 --- a/TRANSLATION.md +++ b/TRANSLATION.md @@ -47,7 +47,7 @@ A fordítás menete a következező: | attributes | attributumok | | element | elem | | functional component | függvény komponens | -| function component | fügvény komponens | +| function component | függvény komponens | | class components | oszály komponensek | | composition | kompozíció | | inheritance | öröklődés | From d656fa437639a8c08cd4761a95cb38f1f759306f Mon Sep 17 00:00:00 2001 From: n3ko Date: Wed, 18 Dec 2019 09:58:32 +0100 Subject: [PATCH 06/18] Update TRANSLATION.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Balázs Orbán --- TRANSLATION.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/TRANSLATION.md b/TRANSLATION.md index 7c4cd2407..1494b909c 100644 --- a/TRANSLATION.md +++ b/TRANSLATION.md @@ -48,7 +48,7 @@ A fordítás menete a következező: | element | elem | | functional component | függvény komponens | | function component | függvény komponens | -| class components | oszály komponensek | +| class components | osztály komponensek | | composition | kompozíció | | inheritance | öröklődés | | lifecycle | életciklus | From c6acafd99efb34ebe9b04ca006821a75ee6006d9 Mon Sep 17 00:00:00 2001 From: n3ko Date: Wed, 18 Dec 2019 09:58:41 +0100 Subject: [PATCH 07/18] Update TRANSLATION.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Balázs Orbán --- TRANSLATION.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/TRANSLATION.md b/TRANSLATION.md index 1494b909c..c89c868c5 100644 --- a/TRANSLATION.md +++ b/TRANSLATION.md @@ -99,7 +99,7 @@ A fordítás menete a következező: | opt-in | opcionális | | section | szekció | | overview | áttekintés | -| try it on CodePen | próbáld ki a CodePenen| +| try it on CodePen | próbáld ki a CodePenen | | _No translation required_ | | DOM | | UI | From 814363680762f090fc8f44322bb2694c5fcff830 Mon Sep 17 00:00:00 2001 From: n3ko Date: Wed, 18 Dec 2019 09:58:54 +0100 Subject: [PATCH 08/18] Update TRANSLATION.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Balázs Orbán --- TRANSLATION.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/TRANSLATION.md b/TRANSLATION.md index c89c868c5..f9346b749 100644 --- a/TRANSLATION.md +++ b/TRANSLATION.md @@ -90,7 +90,7 @@ A fordítás menete a következező: | mutation | mutáció | | _General purpose_ | | tutorial | tutoriál | -| tip | tipp| +| tip | tipp | | note | megjegyzés | | example | példa | | reference | referencia | From 6f01a7880dbc44d1908b4b45484e95bef0cdee82 Mon Sep 17 00:00:00 2001 From: n3ko Date: Wed, 18 Dec 2019 10:35:57 +0100 Subject: [PATCH 09/18] undo sily commit This reverts commit 974978d47b90067d37aa2c44eefbb49747284a1f. --- content/languages.yml | 78 +++++++++++++++++++++---------------------- 1 file changed, 39 insertions(+), 39 deletions(-) diff --git a/content/languages.yml b/content/languages.yml index e7520a7e8..cedbf18da 100644 --- a/content/languages.yml +++ b/content/languages.yml @@ -3,55 +3,55 @@ # 1: Partially complete (50-99%) # 2: Complete (100%) -- name: Angol +- name: English translated_name: English code: en status: 2 -- name: Arab +- name: Arabic translated_name: العربية code: ar status: 2 -- name: Azerbajdzsáni +- name: Azerbaijani translated_name: Azərbaycanca code: az status: 2 -- name: Bolgár +- name: Bulgarian translated_name: Български code: bg status: 1 -- name: Bengáli +- name: Bengali translated_name: বাংলা code: bn status: 1 -- name: Katalán +- name: Catalan translated_name: Català code: ca status: 1 -- name: Német +- name: German translated_name: Deutsch code: de status: 1 -- name: Görög +- name: Greek translated_name: Ελληνικά code: el status: 1 -- name: Spanyol +- name: Spanish translated_name: Español code: es status: 2 -- name: Perzsa +- name: Persian translated_name: فارسی code: fa status: 0 -- name: Francia +- name: French translated_name: Français code: fr status: 2 -- name: Guzsaráti +- name: Gujarati translated_name: ગુજરાતી code: gu status: 0 -- name: Héber +- name: Hebrew translated_name: עברית code: he status: 1 @@ -59,35 +59,35 @@ translated_name: हिन्दी code: hi status: 0 -- name: Haitian kreol +- name: Haitian Creole translated_name: Kreyòl ayisyen code: ht status: 0 -- name: Magyar +- name: Hungarian translated_name: magyar code: hu status: 0 -- name: Örmény +- name: Armenian translated_name: Հայերեն code: hy status: 0 -- name: Indonéz +- name: Indonesian translated_name: Bahasa Indonesia code: id status: 1 -- name: Olasz +- name: Italian translated_name: Italiano code: it status: 2 -- name: Japán +- name: Japanese translated_name: 日本語 code: ja status: 2 -- name: Grúz +- name: Georgian translated_name: ქართული code: ka status: 0 -- name: Közép-khmer +- name: Central Khmer translated_name: ភាសាខ្មែរ code: km status: 0 @@ -95,15 +95,15 @@ translated_name: ಕನ್ನಡ code: kn status: 0 -- name: Koreai +- name: Korean translated_name: 한국어 code: ko status: 2 -- name: Kurd +- name: Kurdish translated_name: کوردی‎ code: ku status: 0 -- name: Litván +- name: Lithuanian translated_name: Lietuvių kalba code: lt status: 0 @@ -111,35 +111,35 @@ translated_name: മലയാളം code: ml status: 0 -- name: Mongol +- name: Mongolian translated_name: Монгол хэл code: mn status: 2 -- name: Nepáli +- name: Nepali translated_name: नेपाली code: ne status: 0 -- name: Holland +- name: Dutch translated_name: Nederlands code: nl status: 0 -- name: Lengyel +- name: Polish translated_name: Polski code: pl status: 2 -- name: Portugál (Brazil) +- name: Portuguese (Brazil) translated_name: Português do Brasil code: pt-br status: 2 -- name: Portugál (Portugália) +- name: Portuguese (Portugal) translated_name: Português europeu code: pt-pt status: 0 -- name: Román +- name: Romanian translated_name: Română code: ro status: 0 -- name: Orosz +- name: Russian translated_name: Русский code: ru status: 2 @@ -147,7 +147,7 @@ translated_name: සිංහල code: si status: 0 -- name: Svéd +- name: Swedish translated_name: Svenska code: sv status: 0 @@ -167,11 +167,11 @@ translated_name: Wikang Tagalog code: tl status: 0 -- name: Török +- name: Turkish translated_name: Türkçe code: tr status: 2 -- name: Ukrán +- name: Ukrainian translated_name: Українська code: uk status: 2 @@ -179,19 +179,19 @@ translated_name: اردو code: ur status: 0 -- name: Üzbég +- name: Uzbek translated_name: Oʻzbekcha code: uz status: 0 -- name: Vietnami +- name: Vietnamese translated_name: Tiếng Việt code: vi status: 1 -- name: Egyszerűsített kínai +- name: Simplified Chinese translated_name: 简体中文 code: zh-hans status: 2 -- name: Tradicionális kínai +- name: Traditional Chinese translated_name: 繁體中文 code: zh-hant status: 2 From 2df7c23bd0c68719b428dc7102bfda2042694b63 Mon Sep 17 00:00:00 2001 From: n3ko Date: Wed, 18 Dec 2019 11:55:15 +0100 Subject: [PATCH 10/18] Apply suggestions from code review MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Balázs Orbán --- content/docs/thinking-in-react.md | 74 +++++++++++++++---------------- 1 file changed, 37 insertions(+), 37 deletions(-) diff --git a/content/docs/thinking-in-react.md b/content/docs/thinking-in-react.md index 528d7658f..066c614ac 100644 --- a/content/docs/thinking-in-react.md +++ b/content/docs/thinking-in-react.md @@ -8,13 +8,13 @@ redirect_from: prev: composition-vs-inheritance.html --- -A React, véleményünk szerint, elsőrendű módja nagy és gyors Javascript alapú webalkalmazások készítésének. A Facebook és az Instagram esetében nekünk nagyon jól skálázódott. +A React, véleményünk szerint, elsőrendű módja nagy és gyors JavaScript alapú webalkalmazások készítésének. A Facebook és az Instagram esetében nekünk nagyon jól skálázódott. Az egyik a remek dolog – sok más mellett – ahogy a React átalakítja a gondolkodásodat az alkalmazásaidról miközben készíted őket. Ebben a fejezetben végigvezetünk a folyamaton, ahogy egy kereshető termék táblázatot megtervezünk és felépítünk React használatával. ## Kezdjük a skiccel {#start-with-a-mock} -Tegyük fel, hogy már van egy JSON API-nk és egy rajz a grafikusunktól. A skicc nézzen ki valahogy így: +Tegyük fel, hogy már van egy JSON API-nk és egy rajz a grafikusunktól. A skicc valahogy így néz ki: ![Mockup](../images/blog/thinking-in-react-mock.png) @@ -31,25 +31,25 @@ A JSON API-tól kapott adatok így néznek ki: ]; ``` -## Első lépés: Szedjük szét a felületet egy komponens hierarchiába! {#step-1-break-the-ui-into-a-component-hierarchy} +## Első lépés: Bontsuk fel a felületet egy komponens hierarchiába! {#step-1-break-the-ui-into-a-component-hierarchy} Az első dolgod, hogy körberajzolod az egyes komponenseket és alkomponenseket a skiccen, és el is nevezed őket. Ha a grafikussal együtt dolgozol, van rá esély, hogy ő már előtted megtette ezt, szóval irány beszélj vele! A rajzon a rétegek nevei valószínűleg React komponenseidnek is megfelelő. -Honnan tudhatod, hogy miből legyen komponens? Ugyanazt a módszert használhatod, amivel eldöntöd, hogy valaminek kell-e saját függvény vagy objektum. Az egyik ilyen az [egy felelősség alapelve](https://hu.wikipedia.org/wiki/Egy_felel%C5%91ss%C3%A9g_alapelve), vagyis a komponens lehetőleg csak egy dolgot csináljon. Ha növekszik, kisebb egységekre kell bontani. +Honnan tudhatod, hogy miből legyen komponens? Használhatod ugyanazt a módszert, amivel eldöntöd, hogy valaminek kell-e saját függvény vagy objektum. Az egyik ilyen az [egy felelősség alapelve](https://hu.wikipedia.org/wiki/Egy_felel%C5%91ss%C3%A9g_alapelve), vagyis a komponens lehetőleg csak egy dolgot csináljon. Ha növekszik, kisebb egységekre kell bontani. -Gyakran kell JSON adatokat megjeleníteni a felhasználónak. Mint az te is tapasztalni fogod, ha a model helyesen épül fel, akkor az UI (és így a komponensek struktúrája) szépen le fogja képezni. Ez annak köszönhető, hogy általában az adatmodell is hasonló elvek alapján készül. Különítsd el komponenseidet úgy, hogy minden komponens az adatmodell egy-egy darabjára illeszkedjen. +Gyakran kell JSON adatokat megjeleníteni a felhasználónak. Mint az te is tapasztalni fogod, ha a model helyesen van felépítve, akkor az UI (és így a komponensek struktúrája) szépen le fogja azt képezni. Ez annak köszönhető, hogy általában az UI és az adatmodell is ugyanazon *információs architektúra* alapján készül. Különítsd el a UI komponenseidet úgy, hogy minden komponens az adatmodell egy-egy darabjára illeszkedjen. ![Komponens diagram](../images/blog/thinking-in-react-components.png) Amint látod az app így öt komponensből áll. Dőlt betűvel emeltük ki az egyes komponensek által képviselt adatokat. - 1. **`FilterableProductTable` (narancs):** magába foglalja a teljes példánkat - 2. **`SearchBar` (kék):** ez fogadja az *adatbevitelt* - 3. **`ProductTable` (zöld):** megjeleníti és szűri az *adathalmazt* az *adatbevitel* alapján - 4. **`ProductCategoryRow` (türkiz):** megjeleníti a *kategóriák* fejlécét - 5. **`ProductRow` (vörös):** megjelenít egy-egy *terméket* + 1. **`FilterableProductTable` (narancs):** magába foglalja a teljes példánkat + 2. **`SearchBar` (kék):** ez fogadja az *adatbevitelt* + 3. **`ProductTable` (zöld):** megjeleníti és szűri az *adathalmazt* az *adatbevitel* alapján + 4. **`ProductCategoryRow` (türkiz):** egy fejlécet jelenít meg minden *kategóriához* + 5. **`ProductRow` (vörös):** megjelenít egy-egy *terméket* -Megvizsgálva a `ProductTable`-t látni fogod, hogy a fejléc (ami a "Termék" és "Ár" címkéket tartalmazza) nem független komponens. Ez ízlés kérdése is, lehet érvelni róla pro és kontra. Ebben a példában meghagyjuk ezt a `ProductTable` részeként, mert része az *adat halmaz* renderelésének ami a `ProductTable` felsősége. A későbbiekben, ha ez a fejléc bonyolultabbá válik (pl. lehetőséget kell adnunk rendezésre), érdemes megfontolni, hogy készítsünk egy önálló `ProductTableHeader` komponenst. +Megvizsgálva a `ProductTable`-t látni fogod, hogy a fejléc (ami a "Termék" és "Ár" címkéket tartalmazza) nem független komponens. Ez ízlés kérdése is, lehet érvelni róla pro és kontra. Ebben a példában meghagyjuk ezt a `ProductTable` részeként, mert része az *adathalmaz* renderelésének ami a `ProductTable` felsősége. A későbbiekben, ha ez a fejléc bonyolultabbá válik (pl. lehetőséget kell adnunk rendezésre), érdemes megfontolni, hogy készítsünk egy önálló `ProductTableHeader` komponenst. Most, hogy azonosítottuk a komponenseket a rajzunkon, rendezzük őket el egy hierarchiában. Az a komponens ami egy másikon belül foglal helyet, legyen ennek a gyermeke: @@ -64,37 +64,37 @@ Most, hogy azonosítottuk a komponenseket a rajzunkon, rendezzük őket el egy h

Nézd meg a Thinking In React: Step 2-t a CodePenen.

-Most, hogy megvan a komponens hierarchiánk, ideje implementálni az appot. A legkönyebb, ha elkészítünk egy olyan változatot, ami az adatmodellt felhasználva rendereli a UI-t, de még nem interaktív. Jobb ha szétválasztjuk ezeket, mert a statikus változat elkészítése leginkább csak gépelésből áll, ezzel szemben az interaktivitás megtervezése több gondolkodást és kevesebb gépelést igényel. Rögtön látni fogjuk miért. +Most, hogy megvan a komponens hierarchiánk, ideje implementálni az appot. A legkönnyebb, ha elkészítünk egy olyan változatot, ami az adatmodellt felhasználva rendereli a UI-t, de még nem interaktív. Jobb ha szétválasztjuk ezeket, mert a statikus változat elkészítése leginkább csak gépelésből áll, ezzel szemben az interaktivitás megtervezése több gondolkodást és kevesebb gépelést igényel. Rögtön látni fogjuk miért. -Az alkalmazás statikus változat feladata, hogy rendereli az adatmodellt. Építsük fel a komponenseket, melyek más komponenseket használnak fel, az adatokat `props` használatával adva tovább. A `props` az egyik mód, amivel a szülő adatokat adhat a gyermek komponensnek. Ha esetleg már ismered a `state` használatát, most még **ne használd** a statikus változatban. A `state` (állapot) interaktivitás kezeléséhez van fenntartva. Segítségével az adataink időben változhatnak. Amíg a statikus változatot készíted, nem lesz rá szükség. +Az alkalmazás statikus változatának építéséhez - ami az adatmodellt rendereli - építsük fel a komponenseket, melyek más komponenseket hasznosítanak újra, az adatokat *props* használatával adva tovább. A *props* az egyik módja annak, amivel a szülő adatokat adhat a gyermek komponensnek. Ha esetleg már ismered a *state* (állapot) használatát, most még **ne használd** a statikus változatban. A *state* interaktivitás kezeléséhez van fenntartva. Segítségével az adataink időben változhatnak. Amíg a statikus változatot készíted, nem lesz rá szükség. Építkezhetsz felülről lefelé vagy fordítva. Vagyis kezdheted a hierarchiában legmagasabban lévő (esetünkben ez a `FilterableProductTable`) komponenssel vagy alulról is (`ProductRow`). Egyszerűbb példáknál általában egyszerűbb fentről kezdeni, nagyobb projekteknél könnyebb ha alulról felfelé haladsz menet közben teszteket is készítve. -Ezt a lépést bevégezve van egy könyvtárad a többször hasznosítható komponensekből, melyek megjelenítik az adatmodellt. A komponenseknek csak `render()` metódusuk van, mivel ez még mindig a statikus változat. A hierarchia tetején csücsülő komponens (`FilterableProductTable`) egy `props`ban kapja meg az adatokat. Ha változtatsz valamit az adatmodellen és újra meghívod a `ReactDOM.render()` a UI frissül. Láthatod, hogyan frissül a UI, hol változik. A React **egyirányú adatáramlása** (*one-way data flow* vagy *one-way binding*) mindent modulárisan és gyorsan kezel. +Ezt a lépést befejezve lesz egy könyvtárad többször hasznosítható komponensekből, melyek renderelik az adatmodellt. A komponenseknek csak `render()` metódusuk van, mivel ez még mindig a statikus változat. A hierarchia tetején csücsülő komponens (`FilterableProductTable`) egy propként kapja meg az adatmodellt. Ha változtatsz valamit az adatmodellen és újra meghívod a `ReactDOM.render()` metódust a UI frissülni fog. Láthatod, hogyan frissül a UI, hol változik. A React **egyirányú adatáramlása** (*one-way data flow* vagy *one-way binding*) mindent modulárisan és gyorsan kezel. -Fordulj a [React dokumentáció](/docs/)hoz ha segítségre van szükség a lépés elvégzéséhez! +Fordulj a [React dokumentációhoz](/docs/) ha segítségre van szükséged a fenti lépés elvégzéséhez! ### Egy kis közjáték: `props` vagy `state` {#a-brief-interlude-props-vs-state} -Kétféle adatot használunk Reactban, van `props` és `state`. Fontos megérteni a különbséget; fussd végig a [hivatalos React dokumentációt](/docs/state-and-lifecycle.html) ha nem vagy biztos benne, hogy ez már világos! Lásd még [GYÍK: `state` vagy `props`, mi a különbség?](/docs/faq-state.html#what-is-the-difference-between-state-and-props) +Kétféle adatot használunk Reactban, van `props` és `state`. Fontos megérteni a különbséget; fusd végig a [hivatalos React dokumentációt](/docs/state-and-lifecycle.html) ha nem vagy biztos benne, hogy ez már világos! Lásd még [GYÍK: `state` vagy `props`, mi a különbség?](/docs/faq-state.html#what-is-the-difference-between-state-and-props) -## Harmadik lépés: Azonosítsd UI állapot minimális (de teljes) reprezentációját {#step-3-identify-the-minimal-but-complete-representation-of-ui-state} +## Harmadik lépés: Azonosítsd a UI állapot minimális (de teljes) reprezentációját {#step-3-identify-the-minimal-but-complete-representation-of-ui-state} -Ahoz, hogy a UI interaktív legyen, képesnek kell lenned változásokat kiváltani a mögöttes adatmodellben. A React ezt a *`state`* segítségével éri el. +Ahhoz, hogy a UI interaktív legyen, képesnek kell lenned változásokat kiváltani a mögöttes adatmodellben. A React ezt a **state** segítségével éri el. -A helyes felépítéshez először a megváltoztatható állapotok minimális halmazára van szükség. A kulcs itt, hogy [Ne ismételd önmagad](https://hu.wikipedia.org/wiki/Ne_ism%C3%A9teld_%C3%B6nmagad). Találd ki az abszolut minimális reprezentációt és minden mást menet közben számíttas ki igény szerint. Ha például egy TODO listát készítesz, legyen egy tömb a teendőkről, de nem kell egy külön változó a darabszámnak. Inkább mikor meg kell jeleníteni az elemek számát csak használd a *length*-et a tömbbödből. +A helyes felépítéshez először a megváltoztatható állapotok minimális halmazára van szükség. A kulcs itt, hogy [Ne ismételd önmagad](https://hu.wikipedia.org/wiki/Ne_ism%C3%A9teld_%C3%B6nmagad). Találd ki az abszolút minimális reprezentációt és minden mást menet közben számíttas ki igény szerint. Ha például egy TODO listát készítesz, legyen egy tömb a teendőkről, de nem kell egy külön változó a darabszámnak. Inkább mikor meg kell jeleníteni az elemek számát csak használd a *length*-et a tömbbödből. Vegyük végig a példánkban szereplő adatokat: - * Az eredeti termék lista + * Az eredeti terméklista * A szöveg amit a felhasználó megadott a keresésben * A jelölőnégyzet állapota - * A termékek leválogatott listája + * A szűrt terméklista Nézzük hát ezekből mi lehet állapot? Ezeket a kérdéseket kell feltenned mindegyikkel kapcsolatban: - 1. Egy szülő komponenstől kaptuk a `props˛között? Ha igen, akkor ez valószínűleg nem `state`. - 2. Időben változatlan? Ha igen, feltehetőleg nem `state`. + 1. Egy szülő komponenstől kaptuk props-on keresztül? Ha igen, akkor ez valószínűleg nem `state`. + 2. Változatlan marad az idő elteltével? Ha igen, feltehetőleg nem `state`. 3. Elő tudod állítani az egyéb `state` és a `props` alapján? Ha igen, akkor nem `state`. Az eredeti terméklista `props`ban érkezik, tehát nem `state`. A keresés szövege és a jelölőnégyzet `state` lesz, hiszen megváltozhatnak és nem számíthatók ki más adatokból. Végül a leszűrt terméklista sem `state` hiszen az eredeti lista és kereső szöveg valamint a jelölőnégyzet állapota alapján számolható. @@ -108,38 +108,38 @@ Tehát ennyi lett a `state`:

Nézd meg a Thinking In React: Step 4-t a CodePenen.

-OK, szóval meghatároztuk mi a minimális `state` az appunkban. Most el kell dönteni melyik komponens változtatja vagy *birtokolja* ezt a `state`-et. +OK, szóval meghatároztuk mi a minimális `state` az alkalmazásunkban. Most el kell döntenünk melyik komponens változtatja vagy *birtokolja* ezt a `state`-et. -Emlékszel: A React lényege az egy irányú adatáramlás a komponens hierarchiában. Talán nem egyértelmű melyik komponenshez melyik `state` tartozik. **Gyakran ezt megérteni a legnagyobb kihívás kezdők számára,** de csak kövesd ezeket a lépéseket: +Emlékezz: A React lényege az egy irányú adatáramlás a komponens hierarchiában. Talán nem egyértelmű melyik komponenshez melyik `state` tartozik. **Gyakran ezt megérteni a legnagyobb kihívás kezdők számára,** de csak kövesd ezeket a lépéseket: -Minden azonosított `state`-hez alkalmazásodban: +Minden azonosított `state`-hez az alkalmazásodban: - * Azonosís minden komponenst amely renderel valamit az adott `state` alapján + * Azonosíts minden komponenst amely renderel valamit az adott `state` alapján * Keresd meg a közös komponenst (egy bizonyos komponens a hierarchiában, ami felette áll `state`-et használó minden komponensnek). - * Vagy a közös szülő, vagy egy másik a hierarchiában magasebban álló komponens kell birtokolja a `state`-et. - * Ha nem találsz olyan komponenst ahol van értelme a `state`-et elhelyezni, létrehozhatsz egy pusztán azért, hogy azt kezelje és illeszd a hierarchiába valahol a közös konténer felett. + * Vagy a közös szülő, vagy egy másik a hierarchiában magasabban álló komponens kell birtokolja a `state`-et. + * Ha nem találsz olyan komponenst ahol van értelme a `state`-et elhelyezni, létrehozhatsz egyet pusztán azért, hogy azt kezelje és illeszd a hierarchiába valahol a közös bitrokló komponens felé. Próbáljuk ki ezt a stratégiát az alkalmazásunkon: * A `ProductTable` le kell szűrje a listát és a `SearchBar` meg kell jelenítse a kereső szöveget és jelölőnégyzet állapotát. - * A közös konténer számukra a `FilterableProductTable`. - * Fogalmilag tényleg van értelme, hogy mindkét érték `FilterableProductTable` komponensben lakjon. + * A közös bitrokló komponens számukra a `FilterableProductTable`. + * Fogalmilag tényleg van értelme, hogy mindkét érték a `FilterableProductTable` komponensben lakjon. -Király, ezzel el is döntöttük, a `state` helye a `FilterableProductTable`. Először, vegyük fel hozzá a pédány tulajdonságot a `FilterableProductTable` construktorába és adjunk neki kezdeti értéket is: `this.state = {filterText: '', inStockOnly: false}`. Ezután adjuk tovább a `filterText` és `inStockOnly` értékét a `ProductTable` és a `SearchBar` számára `props`ban. Végül a `ProductTable`-ben használjuk őket szűrésre és jelenítsük meg az értéküket a `SearchBar` form mezőiben. +Király, ezzel el is döntöttük, a `state` helye a `FilterableProductTable`. Először, vegyük fel hozzá a példány tulajdonságot a `FilterableProductTable` konstruktorába és adjunk neki kezdeti értéket is: `this.state = {filterText: '', inStockOnly: false}`. Ezután adjuk tovább a `filterText` és `inStockOnly` értékét a `ProductTable` és a `SearchBar` számára `props`ban. Végül a `ProductTable`-ben használjuk őket szűrésre és jelenítsük meg az értéküket a `SearchBar` űrlap mezőiben. -Hogy viselkedik az app, ha `filterText` értékét beállítod `"ball"`-nak és frissíted az app-ot? Láthatod, hogy az értékek ennek megfelelően jelennek meg. +Hogy viselkedik az alkalmazás, ha a `filterText` értékét beállítod `"ball"`-nak és frissíted az app-ot? Láthatod, hogy az értékek ennek megfelelően jelennek meg. -## Ötödik lépés: Inverz adatáramlás {#step-5-add-inverse-data-flow} +## Ötödik lépés: Fordított adatáramlás {#step-5-add-inverse-data-flow}

Nézd meg a Thinking In React: Step 5-t a CodePenen.

-Van tehát egy alkalmazásunk ami helyesen jeleníti meg az adatokat a `props` és a `state` függvényében lefelé áramoltatva ezeket a hierarchiában. Eljött az ideje, hogy a másik irányba is mozgassunk adatokat. A form komponenseinknek a hierarchia mélyén is tudniuk kell frissíteni a `state`-et `FilterableProductTable`-ben. +Van tehát egy alkalmazásunk ami helyesen jeleníti meg az adatokat a `props` és a `state` függvényében lefelé áramoltatva ezeket a hierarchiában. Eljött az ideje, hogy a másik irányba is mozgassunk adatokat. A form komponenseinknek a hierarchia mélyén is tudniuk kell frissíteni a `state`-et a `FilterableProductTable`-ben. Reactben ezt nagyon kifejezően ábrázolhatjuk, ami segíti megérteni a program hogyan is működik, de egy kicsit többet kell hozzá gépelni, mint a hagyományos kétirányú adatkapcsolat esetén. -Ha próbáltál szöveget beírni vagy kipipálni a jelölőnégyzetet a mostani verziónkban, akkor már láttad, hogy a React figyelmen kívül hagyja a bemeneteket. Ez szándékos, mivel így lehetséges, hogy a `props`ban kapott érték amit átadunk az `input`nak a `value`-ban mindíg azonos legyen a `state`-ben tárolt értékkel amit `FilterableProductTable`-ból továbbadunk. +Ha próbáltál szöveget beírni vagy kipipálni a jelölőnégyzetet a mostani verziónkban, akkor már láttad, hogy a React figyelmen kívül hagyja a bemeneteket. Ez szándékos, mivel így lehetséges, hogy a `props`ban kapott érték amit átadunk az `input`nak a `value`-ban mindíg azonos legyen a `state`-ben tárolt értékkel amit a `FilterableProductTable`-ból továbbadunk. -Gondoljuk végig mit szeretnénk, mi történjen. Azt akarjuk, hogy bármikor ha felhasználó megváltoztatja a formot mi frissíthessük a `state`-et, hogy tükrözze a bemeneten kapott adatot. Mivel a komponensek csak a saját `state`-jét frissítheti, a `FilterableProductTable` callback függvényeket ad át a `SearchBar`-nak melyek meghívódnak valahányszor a `state`-et frissíteni kell. Használhatjuk az input mezők `onChange` eseményét, a `FilterableProductTable` által átadott callback-ek meghívhatják annak `setState()` metódusát és appunk frissül majd. +Gondoljuk végig mit szeretnénk, mi történjen. Azt akarjuk, hogy bármikor ha a felhasználó megváltoztatja az űrlapot mi frissíthessük a `state`-et, hogy az tükrözze a bemeneten kapott adatot. Mivel a komponensek csak a saját `state`-jüket frissíthetik, a `FilterableProductTable` callback függvényeket ad át a `SearchBar`-nak melyek meghívódnak valahányszor a `state`-et frissíteni kell. Használhatjuk az input mezők `onChange` eseményét, a `FilterableProductTable` által átadott callback-ek meghívhatják annak `setState()` metódusát és alkalmazásunk frissül majd. ## Ennyi volna {#and-thats-it} From 0bf353a940f5d158028546de3ef9f6532a895811 Mon Sep 17 00:00:00 2001 From: n3ko Date: Wed, 18 Dec 2019 12:11:25 +0100 Subject: [PATCH 11/18] Apply suggestions from code review {thinking-in-react-hu} MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Balázs Orbán --- content/docs/nav.yml | 2 +- content/docs/thinking-in-react.md | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/content/docs/nav.yml b/content/docs/nav.yml index d36ce5d63..5e30c50e6 100644 --- a/content/docs/nav.yml +++ b/content/docs/nav.yml @@ -36,7 +36,7 @@ - id: composition-vs-inheritance title: Kompozíció és öröklődés - id: thinking-in-react - title: Gondolkodj Reactül + title: Gondolkodj Reactben - title: Haladó útmutatók items: - id: accessibility diff --git a/content/docs/thinking-in-react.md b/content/docs/thinking-in-react.md index 066c614ac..170aa8a7b 100644 --- a/content/docs/thinking-in-react.md +++ b/content/docs/thinking-in-react.md @@ -1,6 +1,6 @@ --- id: thinking-in-react -title: Gondolkodj Reactül +title: Gondolkodj Reactben permalink: docs/thinking-in-react.html redirect_from: - 'blog/2013/11/05/thinking-in-react.html' @@ -10,7 +10,7 @@ prev: composition-vs-inheritance.html A React, véleményünk szerint, elsőrendű módja nagy és gyors JavaScript alapú webalkalmazások készítésének. A Facebook és az Instagram esetében nekünk nagyon jól skálázódott. -Az egyik a remek dolog – sok más mellett – ahogy a React átalakítja a gondolkodásodat az alkalmazásaidról miközben készíted őket. Ebben a fejezetben végigvezetünk a folyamaton, ahogy egy kereshető termék táblázatot megtervezünk és felépítünk React használatával. +Az egyik remek dolog – sok más mellett – ahogy a React átalakítja a gondolkodásodat az alkalmazásaidról miközben készíted őket. Ebben a fejezetben végigvezetünk a folyamaton, miközben egy kereshető termék táblázatot megtervezünk és felépítünk React használatával. ## Kezdjük a skiccel {#start-with-a-mock} @@ -33,7 +33,7 @@ A JSON API-tól kapott adatok így néznek ki: ## Első lépés: Bontsuk fel a felületet egy komponens hierarchiába! {#step-1-break-the-ui-into-a-component-hierarchy} -Az első dolgod, hogy körberajzolod az egyes komponenseket és alkomponenseket a skiccen, és el is nevezed őket. Ha a grafikussal együtt dolgozol, van rá esély, hogy ő már előtted megtette ezt, szóval irány beszélj vele! A rajzon a rétegek nevei valószínűleg React komponenseidnek is megfelelő. +Az első dolgod, hogy körberajzolod az egyes komponenseket és alkomponenseket a skiccen, és nevet adsz nekik. Ha a grafikussal együtt dolgozol, előfordulhat, hogy ő már előtted megtette ezt, szóval irány beszélj vele! A rajzon a rétegek nevei valószínűleg React komponenseidnek is megfelelnek. Honnan tudhatod, hogy miből legyen komponens? Használhatod ugyanazt a módszert, amivel eldöntöd, hogy valaminek kell-e saját függvény vagy objektum. Az egyik ilyen az [egy felelősség alapelve](https://hu.wikipedia.org/wiki/Egy_felel%C5%91ss%C3%A9g_alapelve), vagyis a komponens lehetőleg csak egy dolgot csináljon. Ha növekszik, kisebb egységekre kell bontani. From e3c9cf0a98db57e6900b2ae93600a90e4df40f05 Mon Sep 17 00:00:00 2001 From: n3ko Date: Wed, 18 Dec 2019 12:52:44 +0100 Subject: [PATCH 12/18] Apply suggestions from code review MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Just an extra space Co-Authored-By: Balázs Orbán --- content/docs/thinking-in-react.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/docs/thinking-in-react.md b/content/docs/thinking-in-react.md index 170aa8a7b..4c7a357e5 100644 --- a/content/docs/thinking-in-react.md +++ b/content/docs/thinking-in-react.md @@ -70,7 +70,7 @@ Az alkalmazás statikus változatának építéséhez - ami az adatmodellt rende Építkezhetsz felülről lefelé vagy fordítva. Vagyis kezdheted a hierarchiában legmagasabban lévő (esetünkben ez a `FilterableProductTable`) komponenssel vagy alulról is (`ProductRow`). Egyszerűbb példáknál általában egyszerűbb fentről kezdeni, nagyobb projekteknél könnyebb ha alulról felfelé haladsz menet közben teszteket is készítve. -Ezt a lépést befejezve lesz egy könyvtárad többször hasznosítható komponensekből, melyek renderelik az adatmodellt. A komponenseknek csak `render()` metódusuk van, mivel ez még mindig a statikus változat. A hierarchia tetején csücsülő komponens (`FilterableProductTable`) egy propként kapja meg az adatmodellt. Ha változtatsz valamit az adatmodellen és újra meghívod a `ReactDOM.render()` metódust a UI frissülni fog. Láthatod, hogyan frissül a UI, hol változik. A React **egyirányú adatáramlása** (*one-way data flow* vagy *one-way binding*) mindent modulárisan és gyorsan kezel. +Ezt a lépést befejezve lesz egy könyvtárad többször hasznosítható komponensekből, melyek renderelik az adatmodellt. A komponenseknek csak `render()` metódusuk van, mivel ez még mindig a statikus változat. A hierarchia tetején csücsülő komponens (`FilterableProductTable`) egy propként kapja meg az adatmodellt. Ha változtatsz valamit az adatmodellen és újra meghívod a `ReactDOM.render()` metódust a UI frissülni fog. Láthatod, hogyan frissül a UI, hol változik. A React **egyirányú adatáramlása** (*one-way data flow* vagy *one-way binding*) mindent modulárisan és gyorsan kezel. Fordulj a [React dokumentációhoz](/docs/) ha segítségre van szükséged a fenti lépés elvégzéséhez! From 4c4aeaf62de60df3e513b13eb2937c51cc291cf2 Mon Sep 17 00:00:00 2001 From: n3ko Date: Wed, 18 Dec 2019 13:03:26 +0100 Subject: [PATCH 13/18] remove translated images {thinking-in-react-hu} --- .../blog/thinking-in-react-components-hu.png | Bin 38312 -> 0 bytes .../images/blog/thinking-in-react-mock-hu.png | Bin 35122 -> 0 bytes 2 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 content/images/blog/thinking-in-react-components-hu.png delete mode 100644 content/images/blog/thinking-in-react-mock-hu.png diff --git a/content/images/blog/thinking-in-react-components-hu.png b/content/images/blog/thinking-in-react-components-hu.png deleted file mode 100644 index dd07ca95ec7e97275434d568cc0420d8753ef13b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 38312 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

97>8e27zPpKQ`A5RR8wn|vaWljA2 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 diff --git a/content/images/blog/thinking-in-react-mock-hu.png b/content/images/blog/thinking-in-react-mock-hu.png deleted file mode 100644 index a9f5dcbe318f4bd935d266dd57cb01de93642bfa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 35122 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 From 4411fce13e6b05301bbd35cdc816b36143a50e0e Mon Sep 17 00:00:00 2001 From: n3ko Date: Sun, 1 Mar 2020 20:20:14 +0100 Subject: [PATCH 14/18] remove rogue formating {thinking-in-react-hu} --- content/docs/thinking-in-react.md | 36 +++++++++++++++---------------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/content/docs/thinking-in-react.md b/content/docs/thinking-in-react.md index 4c7a357e5..2949794e4 100644 --- a/content/docs/thinking-in-react.md +++ b/content/docs/thinking-in-react.md @@ -74,9 +74,9 @@ Ezt a lépést befejezve lesz egy könyvtárad többször hasznosítható kompon Fordulj a [React dokumentációhoz](/docs/) ha segítségre van szükséged a fenti lépés elvégzéséhez! -### Egy kis közjáték: `props` vagy `state` {#a-brief-interlude-props-vs-state} +### Egy kis közjáték: props vagy state {#a-brief-interlude-props-vs-state} -Kétféle adatot használunk Reactban, van `props` és `state`. Fontos megérteni a különbséget; fusd végig a [hivatalos React dokumentációt](/docs/state-and-lifecycle.html) ha nem vagy biztos benne, hogy ez már világos! Lásd még [GYÍK: `state` vagy `props`, mi a különbség?](/docs/faq-state.html#what-is-the-difference-between-state-and-props) +Kétféle adatot használunk Reactban, van props és state. Fontos megérteni a különbséget; fusd végig a [hivatalos React dokumentációt](/docs/state-and-lifecycle.html) ha nem vagy biztos benne, hogy ez már világos! Lásd még [GYÍK: state vagy props, mi a különbség?](/docs/faq-state.html#what-is-the-difference-between-state-and-props) ## Harmadik lépés: Azonosítsd a UI állapot minimális (de teljes) reprezentációját {#step-3-identify-the-minimal-but-complete-representation-of-ui-state} @@ -93,13 +93,13 @@ Vegyük végig a példánkban szereplő adatokat: Nézzük hát ezekből mi lehet állapot? Ezeket a kérdéseket kell feltenned mindegyikkel kapcsolatban: - 1. Egy szülő komponenstől kaptuk props-on keresztül? Ha igen, akkor ez valószínűleg nem `state`. - 2. Változatlan marad az idő elteltével? Ha igen, feltehetőleg nem `state`. - 3. Elő tudod állítani az egyéb `state` és a `props` alapján? Ha igen, akkor nem `state`. + 1. Egy szülő komponenstől kaptuk props-on keresztül? Ha igen, akkor ez valószínűleg nem state. + 2. Változatlan marad az idő elteltével? Ha igen, feltehetőleg nem state. + 3. Elő tudod állítani az egyéb state és a props alapján? Ha igen, akkor nem state. -Az eredeti terméklista `props`ban érkezik, tehát nem `state`. A keresés szövege és a jelölőnégyzet `state` lesz, hiszen megváltozhatnak és nem számíthatók ki más adatokból. Végül a leszűrt terméklista sem `state` hiszen az eredeti lista és kereső szöveg valamint a jelölőnégyzet állapota alapján számolható. +Az eredeti terméklista propsban érkezik, tehát nem state. A keresés szövege és a jelölőnégyzet state lesz, hiszen megváltozhatnak és nem számíthatók ki más adatokból. Végül a leszűrt terméklista sem state hiszen az eredeti lista és kereső szöveg valamint a jelölőnégyzet állapota alapján számolható. -Tehát ennyi lett a `state`: +Tehát ennyi lett a state: * A felhasználó által megadott keresőszöveg * A jelölőnégyzet értéke @@ -108,16 +108,16 @@ Tehát ennyi lett a `state`:

Nézd meg a Thinking In React: Step 4-t a CodePenen.

-OK, szóval meghatároztuk mi a minimális `state` az alkalmazásunkban. Most el kell döntenünk melyik komponens változtatja vagy *birtokolja* ezt a `state`-et. +OK, szóval meghatároztuk mi a minimális state az alkalmazásunkban. Most el kell döntenünk melyik komponens változtatja vagy *birtokolja* ezt a state-et. -Emlékezz: A React lényege az egy irányú adatáramlás a komponens hierarchiában. Talán nem egyértelmű melyik komponenshez melyik `state` tartozik. **Gyakran ezt megérteni a legnagyobb kihívás kezdők számára,** de csak kövesd ezeket a lépéseket: +Emlékezz: A React lényege az egy irányú adatáramlás a komponens hierarchiában. Talán nem egyértelmű melyik komponenshez melyik state tartozik. **Gyakran ezt megérteni a legnagyobb kihívás kezdők számára,** de csak kövesd ezeket a lépéseket: -Minden azonosított `state`-hez az alkalmazásodban: +Minden azonosított state-hez az alkalmazásodban: - * Azonosíts minden komponenst amely renderel valamit az adott `state` alapján - * Keresd meg a közös komponenst (egy bizonyos komponens a hierarchiában, ami felette áll `state`-et használó minden komponensnek). - * Vagy a közös szülő, vagy egy másik a hierarchiában magasabban álló komponens kell birtokolja a `state`-et. - * Ha nem találsz olyan komponenst ahol van értelme a `state`-et elhelyezni, létrehozhatsz egyet pusztán azért, hogy azt kezelje és illeszd a hierarchiába valahol a közös bitrokló komponens felé. + * Azonosíts minden komponenst amely renderel valamit az adott state alapján + * Keresd meg a közös komponenst (egy bizonyos komponens a hierarchiában, ami felette áll state-et használó minden komponensnek). + * Vagy a közös szülő, vagy egy másik a hierarchiában magasabban álló komponens kell birtokolja a state-et. + * Ha nem találsz olyan komponenst ahol van értelme a state-et elhelyezni, létrehozhatsz egyet pusztán azért, hogy azt kezelje és illeszd a hierarchiába valahol a közös bitrokló komponens felé. Próbáljuk ki ezt a stratégiát az alkalmazásunkon: @@ -125,7 +125,7 @@ Próbáljuk ki ezt a stratégiát az alkalmazásunkon: * A közös bitrokló komponens számukra a `FilterableProductTable`. * Fogalmilag tényleg van értelme, hogy mindkét érték a `FilterableProductTable` komponensben lakjon. -Király, ezzel el is döntöttük, a `state` helye a `FilterableProductTable`. Először, vegyük fel hozzá a példány tulajdonságot a `FilterableProductTable` konstruktorába és adjunk neki kezdeti értéket is: `this.state = {filterText: '', inStockOnly: false}`. Ezután adjuk tovább a `filterText` és `inStockOnly` értékét a `ProductTable` és a `SearchBar` számára `props`ban. Végül a `ProductTable`-ben használjuk őket szűrésre és jelenítsük meg az értéküket a `SearchBar` űrlap mezőiben. +Király, ezzel el is döntöttük, a state helye a `FilterableProductTable`. Először, vegyük fel hozzá a példány tulajdonságot a `FilterableProductTable` konstruktorába és adjunk neki kezdeti értéket is: `this.state = {filterText: '', inStockOnly: false}`. Ezután adjuk tovább a `filterText` és `inStockOnly` értékét a `ProductTable` és a `SearchBar` számára propsban. Végül a `ProductTable`-ben használjuk őket szűrésre és jelenítsük meg az értéküket a `SearchBar` űrlap mezőiben. Hogy viselkedik az alkalmazás, ha a `filterText` értékét beállítod `"ball"`-nak és frissíted az app-ot? Láthatod, hogy az értékek ennek megfelelően jelennek meg. @@ -133,13 +133,13 @@ Hogy viselkedik az alkalmazás, ha a `filterText` értékét beállítod `"ball"

Nézd meg a Thinking In React: Step 5-t a CodePenen.

-Van tehát egy alkalmazásunk ami helyesen jeleníti meg az adatokat a `props` és a `state` függvényében lefelé áramoltatva ezeket a hierarchiában. Eljött az ideje, hogy a másik irányba is mozgassunk adatokat. A form komponenseinknek a hierarchia mélyén is tudniuk kell frissíteni a `state`-et a `FilterableProductTable`-ben. +Van tehát egy alkalmazásunk ami helyesen jeleníti meg az adatokat a props és a state függvényében lefelé áramoltatva ezeket a hierarchiában. Eljött az ideje, hogy a másik irányba is mozgassunk adatokat. A form komponenseinknek a hierarchia mélyén is tudniuk kell frissíteni a state-et a `FilterableProductTable`-ben. Reactben ezt nagyon kifejezően ábrázolhatjuk, ami segíti megérteni a program hogyan is működik, de egy kicsit többet kell hozzá gépelni, mint a hagyományos kétirányú adatkapcsolat esetén. -Ha próbáltál szöveget beírni vagy kipipálni a jelölőnégyzetet a mostani verziónkban, akkor már láttad, hogy a React figyelmen kívül hagyja a bemeneteket. Ez szándékos, mivel így lehetséges, hogy a `props`ban kapott érték amit átadunk az `input`nak a `value`-ban mindíg azonos legyen a `state`-ben tárolt értékkel amit a `FilterableProductTable`-ból továbbadunk. +Ha próbáltál szöveget beírni vagy kipipálni a jelölőnégyzetet a mostani verziónkban, akkor már láttad, hogy a React figyelmen kívül hagyja a bemeneteket. Ez szándékos, mivel így lehetséges, hogy a propsban kapott érték amit átadunk az `input`nak a `value`-ban mindíg azonos legyen a state-ben tárolt értékkel amit a `FilterableProductTable`-ból továbbadunk. -Gondoljuk végig mit szeretnénk, mi történjen. Azt akarjuk, hogy bármikor ha a felhasználó megváltoztatja az űrlapot mi frissíthessük a `state`-et, hogy az tükrözze a bemeneten kapott adatot. Mivel a komponensek csak a saját `state`-jüket frissíthetik, a `FilterableProductTable` callback függvényeket ad át a `SearchBar`-nak melyek meghívódnak valahányszor a `state`-et frissíteni kell. Használhatjuk az input mezők `onChange` eseményét, a `FilterableProductTable` által átadott callback-ek meghívhatják annak `setState()` metódusát és alkalmazásunk frissül majd. +Gondoljuk végig mit szeretnénk, mi történjen. Azt akarjuk, hogy bármikor ha a felhasználó megváltoztatja az űrlapot mi frissíthessük a state-et, hogy az tükrözze a bemeneten kapott adatot. Mivel a komponensek csak a saját state-jüket frissíthetik, a `FilterableProductTable` callback függvényeket ad át a `SearchBar`-nak melyek meghívódnak valahányszor a state-et frissíteni kell. Használhatjuk az input mezők `onChange` eseményét, a `FilterableProductTable` által átadott callback-ek meghívhatják annak `setState()` metódusát és alkalmazásunk frissül majd. ## Ennyi volna {#and-thats-it} From b7cd53e98df299a675864cea818007c99770e9bf Mon Sep 17 00:00:00 2001 From: n3ko Date: Tue, 3 Mar 2020 00:57:03 +0100 Subject: [PATCH 15/18] Apply suggestions from code review MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Orsi Co-Authored-By: Balázs Orbán Co-Authored-By: Gergely Nagy --- content/docs/thinking-in-react.md | 32 +++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/content/docs/thinking-in-react.md b/content/docs/thinking-in-react.md index 2949794e4..69088f28b 100644 --- a/content/docs/thinking-in-react.md +++ b/content/docs/thinking-in-react.md @@ -10,7 +10,7 @@ prev: composition-vs-inheritance.html A React, véleményünk szerint, elsőrendű módja nagy és gyors JavaScript alapú webalkalmazások készítésének. A Facebook és az Instagram esetében nekünk nagyon jól skálázódott. -Az egyik remek dolog – sok más mellett – ahogy a React átalakítja a gondolkodásodat az alkalmazásaidról miközben készíted őket. Ebben a fejezetben végigvezetünk a folyamaton, miközben egy kereshető termék táblázatot megtervezünk és felépítünk React használatával. +Az egyik remek dolog – sok más mellett – ahogy a React átalakítja a gondolkodásodat az alkalmazásaidról miközben készíted őket. Ebben a fejezetben végigvezetünk a folyamaton, miközben egy kereshető terméktáblázatot tervezünk meg és építünk fel React használatával. ## Kezdjük a skiccel {#start-with-a-mock} @@ -33,15 +33,15 @@ A JSON API-tól kapott adatok így néznek ki: ## Első lépés: Bontsuk fel a felületet egy komponens hierarchiába! {#step-1-break-the-ui-into-a-component-hierarchy} -Az első dolgod, hogy körberajzolod az egyes komponenseket és alkomponenseket a skiccen, és nevet adsz nekik. Ha a grafikussal együtt dolgozol, előfordulhat, hogy ő már előtted megtette ezt, szóval irány beszélj vele! A rajzon a rétegek nevei valószínűleg React komponenseidnek is megfelelnek. +Az első dolgod, hogy körberajzolod az egyes komponenseket és alkomponenseket a skiccen, és nevet adsz nekik. Ha a grafikussal együtt dolgozol, előfordulhat, hogy ő már előtted megtette ezt, szóval irány, beszélj vele! A rajzon a rétegek nevei valószínűleg a React komponenseidnek fognak megfelelni. Honnan tudhatod, hogy miből legyen komponens? Használhatod ugyanazt a módszert, amivel eldöntöd, hogy valaminek kell-e saját függvény vagy objektum. Az egyik ilyen az [egy felelősség alapelve](https://hu.wikipedia.org/wiki/Egy_felel%C5%91ss%C3%A9g_alapelve), vagyis a komponens lehetőleg csak egy dolgot csináljon. Ha növekszik, kisebb egységekre kell bontani. -Gyakran kell JSON adatokat megjeleníteni a felhasználónak. Mint az te is tapasztalni fogod, ha a model helyesen van felépítve, akkor az UI (és így a komponensek struktúrája) szépen le fogja azt képezni. Ez annak köszönhető, hogy általában az UI és az adatmodell is ugyanazon *információs architektúra* alapján készül. Különítsd el a UI komponenseidet úgy, hogy minden komponens az adatmodell egy-egy darabjára illeszkedjen. +Gyakran kell JSON adatokat megjeleníteni a felhasználónak. Mint ahogyan azt te is tapasztalni fogod, ha a modell helyesen van felépítve, akkor a UI (és így a komponensek struktúrája) szépen le fogja azt képezni. Ez annak köszönhető, hogy általában a UI és az adatmodell is ugyanazon *információs architektúra* alapján készül. Különítsd el a UI komponenseidet úgy, hogy minden komponens az adatmodell egy-egy darabjára illeszkedjen. ![Komponens diagram](../images/blog/thinking-in-react-components.png) -Amint látod az app így öt komponensből áll. Dőlt betűvel emeltük ki az egyes komponensek által képviselt adatokat. +Amint látod, az app így öt komponensből áll. Dőlt betűvel emeltük ki az egyes komponensek által képviselt adatokat. 1. **`FilterableProductTable` (narancs):** magába foglalja a teljes példánkat 2. **`SearchBar` (kék):** ez fogadja az *adatbevitelt* @@ -49,9 +49,9 @@ Amint látod az app így öt komponensből áll. Dőlt betűvel emeltük ki az e 4. **`ProductCategoryRow` (türkiz):** egy fejlécet jelenít meg minden *kategóriához* 5. **`ProductRow` (vörös):** megjelenít egy-egy *terméket* -Megvizsgálva a `ProductTable`-t látni fogod, hogy a fejléc (ami a "Termék" és "Ár" címkéket tartalmazza) nem független komponens. Ez ízlés kérdése is, lehet érvelni róla pro és kontra. Ebben a példában meghagyjuk ezt a `ProductTable` részeként, mert része az *adathalmaz* renderelésének ami a `ProductTable` felsősége. A későbbiekben, ha ez a fejléc bonyolultabbá válik (pl. lehetőséget kell adnunk rendezésre), érdemes megfontolni, hogy készítsünk egy önálló `ProductTableHeader` komponenst. +Megvizsgálva a `ProductTable`-t látni fogod, hogy a fejléc (ami a "Termék" és "Ár" címkéket tartalmazza) nem független komponens. Ez ízlés kérdése is, lehet érvelni róla pro és kontra. Ebben a példában meghagyjuk ezt a `ProductTable` részeként, mert része az *adathalmaz* renderelésének ami a `ProductTable` felelőssége. A későbbiekben ha ez a fejléc bonyolultabbá válik (pl. lehetőséget kell adnunk rendezésre), érdemes megfontolni, hogy készítsünk egy önálló `ProductTableHeader` komponenst. -Most, hogy azonosítottuk a komponenseket a rajzunkon, rendezzük őket el egy hierarchiában. Az a komponens ami egy másikon belül foglal helyet, legyen ennek a gyermeke: +Most, hogy azonosítottuk a komponenseket a rajzunkon, rendezzük őket el egy hierarchiában. Az a komponens, ami egy másikon belül foglal helyet, legyen ennek a gyermeke: * `FilterableProductTable` * `SearchBar` @@ -64,25 +64,25 @@ Most, hogy azonosítottuk a komponenseket a rajzunkon, rendezzük őket el egy h

Nézd meg a Thinking In React: Step 2-t a CodePenen.

-Most, hogy megvan a komponens hierarchiánk, ideje implementálni az appot. A legkönnyebb, ha elkészítünk egy olyan változatot, ami az adatmodellt felhasználva rendereli a UI-t, de még nem interaktív. Jobb ha szétválasztjuk ezeket, mert a statikus változat elkészítése leginkább csak gépelésből áll, ezzel szemben az interaktivitás megtervezése több gondolkodást és kevesebb gépelést igényel. Rögtön látni fogjuk miért. +Most, hogy megvan a komponens hierarchiánk, ideje implementálni az appot. A legkönnyebb, ha elkészítünk egy olyan változatot, ami az adatmodellt felhasználva rendereli a UI-t, de még nem interaktív. Jobb ha szétválasztjuk ezeket, mert a statikus változat elkészítése leginkább csak gépelésből áll, ezzel szemben az interaktivitás megtervezése több gondolkodást és kevesebb gépelést igényel. Rögtön látni fogjuk, miért. -Az alkalmazás statikus változatának építéséhez - ami az adatmodellt rendereli - építsük fel a komponenseket, melyek más komponenseket hasznosítanak újra, az adatokat *props* használatával adva tovább. A *props* az egyik módja annak, amivel a szülő adatokat adhat a gyermek komponensnek. Ha esetleg már ismered a *state* (állapot) használatát, most még **ne használd** a statikus változatban. A *state* interaktivitás kezeléséhez van fenntartva. Segítségével az adataink időben változhatnak. Amíg a statikus változatot készíted, nem lesz rá szükség. +Az alkalmazás statikus változatának építéséhez - ami az adatmodellt rendereli - építsük fel a komponenseket, melyek más komponenseket hasznosítanak újra, az adatokat *props* használatával adva tovább. A *props* az egyik módja annak, amivel a szülő adatokat adhat a gyermek komponensnek. Ha esetleg már ismered a *state* (állapot) használatát, most még **ne használd** a statikus változatban. A *state* interaktivitás kezeléséhez van fenntartva. Segítségével az adataink időben változhatnak. Amíg a statikus változatot készíted, nem lesz rá szükség. -Építkezhetsz felülről lefelé vagy fordítva. Vagyis kezdheted a hierarchiában legmagasabban lévő (esetünkben ez a `FilterableProductTable`) komponenssel vagy alulról is (`ProductRow`). Egyszerűbb példáknál általában egyszerűbb fentről kezdeni, nagyobb projekteknél könnyebb ha alulról felfelé haladsz menet közben teszteket is készítve. +Építkezhetsz felülről lefelé vagy fordítva. Vagyis kezdheted a hierarchiában legmagasabban lévő (esetünkben ez a `FilterableProductTable`) komponenssel vagy alulról is (`ProductRow`). Egyszerűbb példáknál általában egyszerűbb fentről kezdeni, nagyobb projekteknél könnyebb, ha alulról felfelé haladsz, menet közben teszteket is készítve. -Ezt a lépést befejezve lesz egy könyvtárad többször hasznosítható komponensekből, melyek renderelik az adatmodellt. A komponenseknek csak `render()` metódusuk van, mivel ez még mindig a statikus változat. A hierarchia tetején csücsülő komponens (`FilterableProductTable`) egy propként kapja meg az adatmodellt. Ha változtatsz valamit az adatmodellen és újra meghívod a `ReactDOM.render()` metódust a UI frissülni fog. Láthatod, hogyan frissül a UI, hol változik. A React **egyirányú adatáramlása** (*one-way data flow* vagy *one-way binding*) mindent modulárisan és gyorsan kezel. +Ezt a lépést befejezve lesz egy könyvtárad többször hasznosítható komponensekből, melyek renderelik az adatmodellt. A komponenseknek csak `render()` metódusuk van, mivel ez még mindig a statikus változat. A hierarchia tetején csücsülő komponens (`FilterableProductTable`) egy propként kapja meg az adatmodellt. Ha változtatsz valamit az adatmodellen és újra meghívod a `ReactDOM.render()` metódust a UI frissülni fog. Láthatod, hogyan frissül a UI, hol változik. A React **egyirányú adatáramlása** (*one-way data flow* vagy *one-way binding*) mindent modulárisan és gyorsan kezel. Fordulj a [React dokumentációhoz](/docs/) ha segítségre van szükséged a fenti lépés elvégzéséhez! ### Egy kis közjáték: props vagy state {#a-brief-interlude-props-vs-state} -Kétféle adatot használunk Reactban, van props és state. Fontos megérteni a különbséget; fusd végig a [hivatalos React dokumentációt](/docs/state-and-lifecycle.html) ha nem vagy biztos benne, hogy ez már világos! Lásd még [GYÍK: state vagy props, mi a különbség?](/docs/faq-state.html#what-is-the-difference-between-state-and-props) +Kétféle adatot használunk Reactban, van props és state. Fontos megérteni a különbséget; fusd végig a [hivatalos React dokumentációt](/docs/state-and-lifecycle.html) ha nem vagy biztos benne, hogy ez már világos! Lásd még [GY.I.K: state vagy props, mi a különbség?](/docs/faq-state.html#what-is-the-difference-between-state-and-props) ## Harmadik lépés: Azonosítsd a UI állapot minimális (de teljes) reprezentációját {#step-3-identify-the-minimal-but-complete-representation-of-ui-state} Ahhoz, hogy a UI interaktív legyen, képesnek kell lenned változásokat kiváltani a mögöttes adatmodellben. A React ezt a **state** segítségével éri el. -A helyes felépítéshez először a megváltoztatható állapotok minimális halmazára van szükség. A kulcs itt, hogy [Ne ismételd önmagad](https://hu.wikipedia.org/wiki/Ne_ism%C3%A9teld_%C3%B6nmagad). Találd ki az abszolút minimális reprezentációt és minden mást menet közben számíttas ki igény szerint. Ha például egy TODO listát készítesz, legyen egy tömb a teendőkről, de nem kell egy külön változó a darabszámnak. Inkább mikor meg kell jeleníteni az elemek számát csak használd a *length*-et a tömbbödből. +A helyes felépítéshez először a megváltoztatható állapotok minimális halmazára van szükség. A kulcs itt, hogy [Ne ismételd önmagad](https://hu.wikipedia.org/wiki/Ne_ism%C3%A9teld_%C3%B6nmagad). Találd ki az abszolút minimális reprezentációt és minden mást menet közben számíttass ki igény szerint. Ha például egy TODO listát készítesz, legyen egy tömb a teendőkről, de nem kell egy külön változó a darabszámnak. Inkább mikor meg kell jeleníteni az elemek számát csak használd a *length*-et a tömbödből. Vegyük végig a példánkban szereplő adatokat: @@ -117,12 +117,12 @@ Minden azonosított state-hez az alkalmazásodban: * Azonosíts minden komponenst amely renderel valamit az adott state alapján * Keresd meg a közös komponenst (egy bizonyos komponens a hierarchiában, ami felette áll state-et használó minden komponensnek). * Vagy a közös szülő, vagy egy másik a hierarchiában magasabban álló komponens kell birtokolja a state-et. - * Ha nem találsz olyan komponenst ahol van értelme a state-et elhelyezni, létrehozhatsz egyet pusztán azért, hogy azt kezelje és illeszd a hierarchiába valahol a közös bitrokló komponens felé. + * Ha nem találsz olyan komponenst ahol van értelme a state-et elhelyezni, létrehozhatsz egyet pusztán azért, hogy azt kezelje és illeszd a hierarchiába valahol a közös birtokló komponens felé. Próbáljuk ki ezt a stratégiát az alkalmazásunkon: * A `ProductTable` le kell szűrje a listát és a `SearchBar` meg kell jelenítse a kereső szöveget és jelölőnégyzet állapotát. - * A közös bitrokló komponens számukra a `FilterableProductTable`. + * A közös birtokló komponens számukra a `FilterableProductTable`. * Fogalmilag tényleg van értelme, hogy mindkét érték a `FilterableProductTable` komponensben lakjon. Király, ezzel el is döntöttük, a state helye a `FilterableProductTable`. Először, vegyük fel hozzá a példány tulajdonságot a `FilterableProductTable` konstruktorába és adjunk neki kezdeti értéket is: `this.state = {filterText: '', inStockOnly: false}`. Ezután adjuk tovább a `filterText` és `inStockOnly` értékét a `ProductTable` és a `SearchBar` számára propsban. Végül a `ProductTable`-ben használjuk őket szűrésre és jelenítsük meg az értéküket a `SearchBar` űrlap mezőiben. @@ -137,10 +137,10 @@ Van tehát egy alkalmazásunk ami helyesen jeleníti meg az adatokat a props és Reactben ezt nagyon kifejezően ábrázolhatjuk, ami segíti megérteni a program hogyan is működik, de egy kicsit többet kell hozzá gépelni, mint a hagyományos kétirányú adatkapcsolat esetén. -Ha próbáltál szöveget beírni vagy kipipálni a jelölőnégyzetet a mostani verziónkban, akkor már láttad, hogy a React figyelmen kívül hagyja a bemeneteket. Ez szándékos, mivel így lehetséges, hogy a propsban kapott érték amit átadunk az `input`nak a `value`-ban mindíg azonos legyen a state-ben tárolt értékkel amit a `FilterableProductTable`-ból továbbadunk. +Ha próbáltál szöveget beírni vagy kipipálni a jelölőnégyzetet a mostani verziónkban, akkor már láttad, hogy a React figyelmen kívül hagyja a bemeneteket. Ez szándékos, mivel így lehetséges, hogy a propsban kapott érték amit átadunk az `input`nak a `value`-ban mindig azonos legyen a state-ben tárolt értékkel amit a `FilterableProductTable`-ból továbbadunk. Gondoljuk végig mit szeretnénk, mi történjen. Azt akarjuk, hogy bármikor ha a felhasználó megváltoztatja az űrlapot mi frissíthessük a state-et, hogy az tükrözze a bemeneten kapott adatot. Mivel a komponensek csak a saját state-jüket frissíthetik, a `FilterableProductTable` callback függvényeket ad át a `SearchBar`-nak melyek meghívódnak valahányszor a state-et frissíteni kell. Használhatjuk az input mezők `onChange` eseményét, a `FilterableProductTable` által átadott callback-ek meghívhatják annak `setState()` metódusát és alkalmazásunk frissül majd. ## Ennyi volna {#and-thats-it} -Remélhetőleg ezután már van némi fogalmad, hogyan is gondolkodj, mikor egy komponenst vagy egy alkalmazást készítesz Reactban. Talán egy kicsit többet kellett gépelned, mint amit eddig megszoktál, de ne feledd, általában több időt töltünk a forráskód olvasásával, mint az írással, és kevésbé fárasztó ezt a moduláris, kifejező kódot olvasni. Amikor elkezdesz terjedelmes komponens könyvtárakat létrehozni, nagyra értékeled majd a modularitást és az olvashatóságot, és az újrahaszosíthatóság révén a kódod sorai rövidülni kezdenek. :) +Remélhetőleg ezután már van némi fogalmad, hogyan is gondolkodj, mikor egy komponenst vagy egy alkalmazást készítesz Reactban. Talán egy kicsit többet kellett gépelned, mint amit eddig megszoktál, de ne feledd, általában több időt töltünk a forráskód olvasásával, mint az írással, és kevésbé fárasztó ezt a moduláris, kifejező kódot olvasni. Amikor elkezdesz terjedelmes komponens könyvtárakat létrehozni, nagyra értékeled majd a modularitást és az olvashatóságot, és az újrahasznosíthatóság révén a kódod sorai rövidülni kezdenek. :) From 1003612aa81c9b2ff2226b157f7ab9249384a2c2 Mon Sep 17 00:00:00 2001 From: n3ko Date: Tue, 3 Mar 2020 01:14:29 +0100 Subject: [PATCH 16/18] reorder sentence {thinking-in-react-hu} --- content/docs/thinking-in-react.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/docs/thinking-in-react.md b/content/docs/thinking-in-react.md index 69088f28b..0b60ba23a 100644 --- a/content/docs/thinking-in-react.md +++ b/content/docs/thinking-in-react.md @@ -10,7 +10,7 @@ prev: composition-vs-inheritance.html A React, véleményünk szerint, elsőrendű módja nagy és gyors JavaScript alapú webalkalmazások készítésének. A Facebook és az Instagram esetében nekünk nagyon jól skálázódott. -Az egyik remek dolog – sok más mellett – ahogy a React átalakítja a gondolkodásodat az alkalmazásaidról miközben készíted őket. Ebben a fejezetben végigvezetünk a folyamaton, miközben egy kereshető terméktáblázatot tervezünk meg és építünk fel React használatával. +Az egyik remek dolog – sok más mellett – ahogy a React átalakítja a gondolkodásodat az alkalmazásaidról miközben készíted őket. Ebben a fejezetben végigvezetünk a folyamaton, miközben megtervezünk és felépítünk egy kereshető terméktáblázatot React használatával. ## Kezdjük a skiccel {#start-with-a-mock} From 10d3811aa0ecb8a9da8a47978fecfd0b9fcad2cc Mon Sep 17 00:00:00 2001 From: n3ko Date: Tue, 3 Mar 2020 01:20:11 +0100 Subject: [PATCH 17/18] Apply suggestions from code review {thinking-in-react-hu} --- content/docs/thinking-in-react.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/docs/thinking-in-react.md b/content/docs/thinking-in-react.md index 0b60ba23a..622a1c93d 100644 --- a/content/docs/thinking-in-react.md +++ b/content/docs/thinking-in-react.md @@ -82,7 +82,7 @@ Kétféle adatot használunk Reactban, van props és state. Fontos megérteni a Ahhoz, hogy a UI interaktív legyen, képesnek kell lenned változásokat kiváltani a mögöttes adatmodellben. A React ezt a **state** segítségével éri el. -A helyes felépítéshez először a megváltoztatható állapotok minimális halmazára van szükség. A kulcs itt, hogy [Ne ismételd önmagad](https://hu.wikipedia.org/wiki/Ne_ism%C3%A9teld_%C3%B6nmagad). Találd ki az abszolút minimális reprezentációt és minden mást menet közben számíttass ki igény szerint. Ha például egy TODO listát készítesz, legyen egy tömb a teendőkről, de nem kell egy külön változó a darabszámnak. Inkább mikor meg kell jeleníteni az elemek számát csak használd a *length*-et a tömbödből. +A helyes felépítéshez először a megváltoztatható állapotok minimális halmazára van szükség. A kulcs itt, hogy [Ne ismételd önmagad](https://hu.wikipedia.org/wiki/Ne_ism%C3%A9teld_%C3%B6nmagad). Találd ki az abszolút minimális reprezentációt és számíttas ki minden mást menet közben igény szerint. Ha például egy TODO listát készítesz, legyen egy tömb a teendőkről, de nem kell egy külön változó a darabszámnak. Inkább mikor meg kell jeleníteni az elemek számát csak használd a *length*-et a tömbödből. Vegyük végig a példánkban szereplő adatokat: From d476e4138f266ef1f66fd57906dd0805c72cfbbd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bal=C3=A1zs=20Orb=C3=A1n?= Date: Tue, 3 Mar 2020 09:31:43 +0100 Subject: [PATCH 18/18] Update content/docs/thinking-in-react.md --- content/docs/thinking-in-react.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/docs/thinking-in-react.md b/content/docs/thinking-in-react.md index 622a1c93d..7c8ea1670 100644 --- a/content/docs/thinking-in-react.md +++ b/content/docs/thinking-in-react.md @@ -82,7 +82,7 @@ Kétféle adatot használunk Reactban, van props és state. Fontos megérteni a Ahhoz, hogy a UI interaktív legyen, képesnek kell lenned változásokat kiváltani a mögöttes adatmodellben. A React ezt a **state** segítségével éri el. -A helyes felépítéshez először a megváltoztatható állapotok minimális halmazára van szükség. A kulcs itt, hogy [Ne ismételd önmagad](https://hu.wikipedia.org/wiki/Ne_ism%C3%A9teld_%C3%B6nmagad). Találd ki az abszolút minimális reprezentációt és számíttas ki minden mást menet közben igény szerint. Ha például egy TODO listát készítesz, legyen egy tömb a teendőkről, de nem kell egy külön változó a darabszámnak. Inkább mikor meg kell jeleníteni az elemek számát csak használd a *length*-et a tömbödből. +A helyes felépítéshez először a megváltoztatható állapotok minimális halmazára van szükség. A kulcs itt, hogy [Ne ismételd önmagad](https://hu.wikipedia.org/wiki/Ne_ism%C3%A9teld_%C3%B6nmagad). Találd ki az abszolút minimális reprezentációt és számíttass ki minden mást menet közben igény szerint. Ha például egy TODO listát készítesz, legyen egy tömb a teendőkről, de nem kell egy külön változó a darabszámnak. Inkább mikor meg kell jeleníteni az elemek számát csak használd a *length*-et a tömbödből. Vegyük végig a példánkban szereplő adatokat: