Skip to content

Commit 2e2955c

Browse files
Apply suggestions from code review
Co-Authored-By: jakubdrozdek <30927218+jakubdrozdek@users.noreply.github.com>
1 parent d065e35 commit 2e2955c

File tree

1 file changed

+22
-22
lines changed

1 file changed

+22
-22
lines changed

content/docs/render-props.md

Lines changed: 22 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,13 @@ Komponent z właściwością renderującą przyjmuje funkcję, zwracającą elem
1616

1717
Biblioteki używające właściwości renderujących to m.in. [React Router](https://reacttraining.com/react-router/web/api/Route/render-func) i [Downshift](https://github.com/paypal/downshift).
1818

19-
W tym dokumencie przedyskutujemy przydatność właściwości renderujących i dowiemy się, jak napisać je samemu.
19+
W tym dokumencie przedyskutujemy przydatność właściwości renderujących i dowiemy się, jak napisać je samodzielnie.
2020

2121
## Użycie właściwości renderujących przy zagadnieniach przekrojowych (ang. *cross-cutting concerns*) {#use-render-props-for-cross-cutting-concerns}
2222

23-
Komponenty są podstawową jednostką reużywalności kodu w Reakcie. Nie zawsze jednak jest oczywiste, jak należy współdzielić stan czy zachowanie enkapsulowane przez jeden komponent, tak aby miały do nich dostęp inne komponenty.
23+
Komponenty są podstawowym sposobem na wielokrotne używanie funkcjonalności w Reakcie. Nie zawsze jednak jest oczywiste, jak należy współdzielić stan czy zachowanie zawarte w jednym komponencie, tak aby miały do nich dostęp inne komponenty.
2424

25-
Dla przykładu, poniższy komponent śledzi pozycje myszki w aplikacji internetowej:
25+
Za przykład niech posłuży komponent śledzący pozycję kursora w aplikacji internetowej:
2626

2727
```js
2828
class MouseTracker extends React.Component {
@@ -43,7 +43,7 @@ class MouseTracker extends React.Component {
4343
return (
4444
<div style={{ height: '100%' }} onMouseMove={this.handleMouseMove}>
4545
<h1>Porusz myszką!</h1>
46-
<p>Aktualna pozycja myszki to ({this.state.x}, {this.state.y})</p>
46+
<p>Aktualna pozycja kursora to ({this.state.x}, {this.state.y})</p>
4747
</div>
4848
);
4949
}
@@ -52,12 +52,12 @@ class MouseTracker extends React.Component {
5252

5353
Podczas gdy kursor przemieszcza się po ekranie, komponent wyświetla jego koordynaty (x, y) wewnątrz znacznika `<p>`.
5454

55-
Pytanie brzmi: jak użyć ponownie tego zachowania w innym komponencie? Innymi słowy, jeżeli inny komponent potrzebuje wiedzieć o pozycji kursora, czy możemy enkapsulować to zachowanie tak, abyśmy mogli łatwo współdzielić je z tym komponentem?
55+
Pytanie brzmi: jak użyć ponownie tego zachowania w innym komponencie? Innymi słowy, jeżeli inny komponent potrzebuje współrzędnych pozycji kursora, czy możemy zaimplementować to zachowanie tak, abyśmy mogli łatwo współdzielić je z tym komponentem?
5656

57-
Ponieważ komponenty są podstawową jednostką reużywalności w Reakcie, spróbujmy zrefaktoryzować trochę powyższy kod, tak aby wykorzystać komponent `<Mouse>`, który enkapsuluje zachowanie wymagane przez inny komponent.
57+
Ponieważ komponenty są podstawowym sposobem na wielokrotne używanie funkcjonalności w Reakcie, spróbujmy przekształcić trochę powyższy kod tak, aby wykorzystać komponent `<Mouse>` zawierający w sobie zachowanie wymagane przez inny komponent.
5858

5959
```js
60-
// Komponent <Mouse> enkapsuluje zachowanie, którego potrzebujemy...
60+
// Komponent <Mouse> posiada funkcjonalność, której potrzebujemy...
6161
class Mouse extends React.Component {
6262
constructor(props) {
6363
super(props);
@@ -95,9 +95,9 @@ class MouseTracker extends React.Component {
9595
}
9696
```
9797

98-
Teraz komponent `<Mouse>` enkapsuluje wszystkie zachowania związane z nasłuchiwaniem na zdarzenia `mousemove` i przechowuje pozycję kursora (x, y), jednak nie jest jeszcze w pełni reużywalny.
98+
Teraz komponent `<Mouse>` implementuje wszystkie zachowania związane z nasłuchiwaniem na zdarzenie `mousemove` i przechowuje pozycję kursora (x, y), jednak nie jest jeszcze w pełni reużywalny.
9999

100-
Dla przykładu, powiedzmy że mamy komponent `<Cat>` który renderuje obrazek kota goniącego myszkę na ekranie. Moglibyśmy użyć właściwości `<Cat mouse={{ x, y }}>` aby przekazać komponentowi koordynaty kursora, tak aby wiedział, gdzie umieścić obrazek kota.
100+
Dla przykładu, powiedzmy że mamy komponent `<Cat>`, który renderuje obrazek kota goniącego kursor na ekranie. Moglibyśmy użyć właściwości `<Cat mouse={{ x, y }}>`, aby przekazać komponentowi koordynaty kursora, tak aby wiedział, gdzie umieścić obrazek kota.
101101

102102
Początkowo możesz chcieć wyrenderować komponent `<Cat>` *wewnątrz metody `render` komponentu `<Mouse>`*, na przykład w ten sposób:
103103

@@ -130,10 +130,10 @@ class MouseWithCat extends React.Component {
130130
<div style={{ height: '100%' }} onMouseMove={this.handleMouseMove}>
131131

132132
{/*
133-
Moglibyśmy w tym miejscu po prostu zamienić <p> na <Cat> ... ale później
133+
Moglibyśmy w tym miejscu po prostu zamienić <p> na <Cat>... ale później
134134
musielibyśmy stworzyć oddzielny komponent <MouseWithSomethingElse>
135-
za każdym razem, gdy chcielibyśmy go użyć, dlatego też <MouseWithCat>
136-
nie jest jeszcze naprawdę reużywalny.
135+
dla każdego przypadku użycia, dlatego też <MouseWithCat>
136+
nie jest jeszcze w pełni używalny wielokrotnie.
137137
*/}
138138
<Cat mouse={this.state} />
139139
</div>
@@ -153,7 +153,7 @@ class MouseTracker extends React.Component {
153153
}
154154
```
155155

156-
To podejście zadziałałoby w naszym specyficznym przypadku, ale nie osiągneliśmy prawdziwego celu, jakim jest enkapsulacja zachowania w taki sposób, aby można było je wykorzystywać wielokrotnie. Teraz za każdym razem, gdybyśmy potrzebowali pozycji myszki dla innego przypadku, musielibyśmy stworzyć nowy komponent (innymi słowy kolejny `<MouseWithCat>`), który wyrenderuje coś konkretnego dla danego przypadku.
156+
To podejście zadziałałoby w naszym specyficznym przypadku, ale nie osiągneliśmy prawdziwego celu, jakim jest hermetyzacja zachowania w taki sposób, aby można było je wykorzystywać wielokrotnie. W takim przypadku, za każdym razem gdy potrzebowalibyśmy inaczej wyświetlić coś na podstawie pozycji kursora, musielibyśmy stworzyć nowy komponent (innymi słowy, kolejny `<MouseWithCat>`), który wyrenderuje coś w odpowiedni sposób.
157157

158158
I tutaj do akcji wkracza właściwość renderująca. Zamiast na stałe osadzać `<Cat>` wewnątrz komponentu `<Mouse>`, jednocześnie zmieniając wyrenderowany przez niego wynik, możemy dostarczyć do komponentu `<Mouse>` właściwość będącą funkcją. Funkcja ta w sposób dynamiczny będzie określać, co powinno zostać wyrenderowane.
159159

@@ -209,17 +209,17 @@ class MouseTracker extends React.Component {
209209
}
210210
```
211211

212-
Teraz, zamiast faktycznie klonować komponent `<Mouse>` i na stałe wpisywać coś innego w jego metodzie `render` dla poszczególnych przypadków, dostarczamy właściwość `render`, którą komponent `<Mouse>` może użyć do dynamicznego określenia renderowanego wyniku.
212+
Teraz, zamiast faktycznie klonować komponent `<Mouse>` i na stałe wpisywać coś innego w jego metodzie `render` dla poszczególnych przypadków, dostarczamy właściwość `render`, której komponent `<Mouse>` może użyć do dynamicznego określenia renderowanego wyniku.
213213

214214
Konkretnie rzecz ujmując, **właściwość renderująca jest funkcją, której komponent używa, aby wiedzieć, co ma wyrenderować.**
215215

216-
Ta technika powoduje, że zachowanie, które chcemy współdzielić, staje się niezwykle przenośne. Aby uzyskać to zachowanie, wyrenderuj komponent `<Mouse>` wraz z właściwością `render`, która określi, co powinno zostać wyrenderowane, biorąc pod uwagę aktualną pozycję (x, y) kursora myszy.
216+
Ta technika powoduje, że zachowanie, które chcemy współdzielić, staje się niezwykle przenośne. Aby uzyskać zamierzony efekt, wyrenderuj komponent `<Mouse>` wraz z właściwością `render`, która określi, co powinno zostać wyrenderowane biorąc pod uwagę aktualną pozycję (x, y) kursora myszy.
217217

218-
Ciekawostką, o której warto wspomnieć podczas opisywania właściwości renderujących, jest to, że większość [komponentów wyższego rzędu (ang. *higher-order components*)](/docs/higher-order-components.html) (HOC) można zaimplementować przy użyciu zwykłego komponentu z właściwością renderującą. Dla przykładu, jeżeli preferujesz korzystanie z komponent wyższego rzędu `withMouse` zamiast komponentu `<Mouse>`, możesz z łatwością go stworzyć przy użyciu `<Mouse>` z właściwością renderującą:
218+
Ciekawostką, o której warto wspomnieć podczas opisywania właściwości renderujących, jest to, że większość [komponentów wyższego rzędu (ang. *higher-order components*, *HOC*)](/docs/higher-order-components.html) można zaimplementować przy użyciu zwykłego komponentu z właściwością renderującą. Dla przykładu, jeżeli wolisz korzystać z komponentu wyższego rzędu `withMouse` zamiast komponentu `<Mouse>`, możesz z łatwością go stworzyć przy użyciu `<Mouse>` z właściwością renderującą:
219219

220220
```js
221221
// Jeżeli z jakiegoś powodu naprawdę potrzebujesz HOC-a, możesz go łatwo
222-
// stworzyć, używając zwykłego komponentu z właściwością renderującą!
222+
// stworzyć używając zwykłego komponentu z właściwością renderującą!
223223
function withMouse(Component) {
224224
return class extends React.Component {
225225
render() {
@@ -239,20 +239,20 @@ Użycie właściwości renderującej powoduje, że jest możliwe użycie obu wzo
239239

240240
Pamiętaj, że pomimo iż wzorzec nosi nazwę "właściwości renderującej" (ang. *render prop*), nie musisz *używać właściwości o nazwie `render`, aby go zastosować*. W zasadzie [*każda* właściwość, która jest funkcją służącą do określenia, co powinno zostać wyrenderowane, jest technicznie rzecz ujmując "właściwością renderującą"](https://cdb.reacttraining.com/use-a-render-prop-50de598f11ce).
241241

242-
Pomimo że powyższe przykłady używają `render`, moglibyśmy po prostu użyć właściwości `children`!
242+
Pomimo że powyższe przykłady używają nazwy `render`, moglibyśmy po prostu użyć właściwości `children`!
243243

244244
```js
245245
<Mouse children={mouse => (
246-
<p>Pozycja myszki to {mouse.x}, {mouse.y}</p>
246+
<p>Pozycja kursora to {mouse.x}, {mouse.y}</p>
247247
)}/>
248248
```
249249

250-
Pamiętaj że właściwości `children` nie musisz przekazywać na liście "atrybutów" twojego elementu JSX. Zamiast tego możesz ją umieścić bezpośrednio *wewnątrz* znacznika!
250+
Pamiętaj, że w JSX właściwości `children` nie musisz przekazywać na liście "atrybutów" twojego elementu. Zamiast tego możesz ją umieścić bezpośrednio *wewnątrz* znacznika!
251251

252252
```js
253253
<Mouse>
254254
{mouse => (
255-
<p>Pozycja myszki to {mouse.x}, {mouse.y}</p>
255+
<p>Pozycja kursora to {mouse.x}, {mouse.y}</p>
256256
)}
257257
</Mouse>
258258
```
@@ -273,7 +273,7 @@ Mouse.propTypes = {
273273

274274
Jeżeli stworzysz funkcję wewnątrz metody `render`, użycie właściwości renderującej może zniwelować korzyści płynące z użycia [`React.PureComponent`](/docs/react-api.html#reactpurecomponent). Dzieje się tak ponieważ płytkie porównanie (ang. *shallow comparison*) dla nowych właściwości zawsze będzie zwracać wartość `false`, a w tym przypadku każde wywołanie `render` będzie generować nową wartość dla właściwości renderującej.
275275

276-
Dla przykładu, kontynując z komponentem `<Mouse>`, jeżeli `Mouse` rozszerzałaby klasę `React.PureComponent` zamiast `React.Component`, nasz przykład wyglądałby tak:
276+
Dla przykładu, kontynuując z komponentem `<Mouse>`, jeżeli `Mouse` rozszerzałaby klasę `React.PureComponent` zamiast `React.Component`, nasz przykład wyglądałby tak:
277277

278278
```js
279279
class Mouse extends React.PureComponent {

0 commit comments

Comments
 (0)