You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
*[Jak w leniwy sposób tworzyć "ciężkie" komponenty?](#how-to-create-expensive-objects-lazily)
53
53
*[Czy hooki są wolne z powodu tworzenia funkcji podczas renderowania?](#are-hooks-slow-because-of-creating-functions-in-render)
@@ -671,87 +671,87 @@ Zauważ, że w powyższym przykładzie **musieliśmy** przekazać funkcję do ta
671
671
672
672
### Co zrobić, gdy zależności mojego efektu zmieniają się zbyt często? {#what-can-i-do-if-my-effect-dependencies-change-too-often}
673
673
674
-
Sometimes, your effect may be using state that changes too often. You might be tempted to omit that state from a list of dependencies, but that usually leads to bugs:
674
+
Czasem twój efekt może korzystać ze stanu, który zmienia się zbyt często. Może cię kusić usunięcie go z listy zależności, jednak zwykle prowadzi to do błędów.:
675
675
676
676
```js{6,9}
677
677
function Counter() {
678
678
const [count, setCount] = useState(0);
679
679
680
680
useEffect(() => {
681
681
const id = setInterval(() => {
682
-
setCount(count + 1); // This effect depends on the `count` state
682
+
setCount(count + 1); // Ten efekt zależy od wartości `count`
683
683
}, 1000);
684
684
return () => clearInterval(id);
685
-
}, []); // 🔴 Bug: `count` is not specified as a dependency
685
+
}, []); // 🔴 Błąd: Zmienna `count` nie została wymieniona w zależnościach
686
686
687
687
return <h1>{count}</h1>;
688
688
}
689
689
```
690
690
691
-
The empty set of dependencies, `[]`, means that the effect will only run once when the component mounts, and not on every re-render. The problem is that inside the `setInterval` callback, the value of `count` does not change, because we've created a closure with the value of `count`set to`0` as it was when the effect callback ran. Every second, this callback then calls`setCount(0 + 1)`, so the count never goes above 1.
691
+
Pusty zbiór zależności, `[]`, oznacza, że efekt ten zostanie uruchomiony tylko jeden raz podczas montowania komponentu, a nie przy każdym ponownym renderowaniu. Problem polega na tym, iż wartość zmienne `count` wewnątrz funkcji zwrotnej przekazanej do `setInterval` nie będzie się zmieniać. Dzieje się dlatego, że stworzyliśmy dla niej "domknięcie", w którym `count`ma wartość`0`, ponieważ z taką wartością uruchomiono ten efekt. Co sekundę funkcja zwrotna będzie wywoływała`setCount(0 + 1)`, przez co wartość licznika nigdy nie przekroczy 1.
692
692
693
-
Specifying`[count]`as a list of dependencies would fix the bug, but would cause the interval to be reset on every change. Effectively, each`setInterval`would get one chance to execute before being cleared (similar to a`setTimeout`.) That may not be desirable. To fix this, we can use the [functional update form of`setState`](/docs/hooks-reference.html#functional-updates). It lets us specify *how* the state needs to change without referencing the *current* state:
693
+
Podanie`[count]`jako lista zależności mogłoby naprawić ten błąd, jednak spowodowałoby to resetowanie się interwału przy każdej zmianie stanu. W konsekwencji, każdy`setInterval`miałby jedną szansę na wykonanie, zanim zostałby wyczyszczony (zachowanie podobne do`setTimeout`). Raczej nie o to nam chodzi. Aby temu zapobiec, możemy skorzystać z [funkcyjnego wariantu aktualizacji poprzez`setState`](/docs/hooks-reference.html#functional-updates). Pozwoli to nam określić, *jak* stan powinien się zmienić, bez odnoszenia się do konkretnego *aktualnego* stanu:
694
694
695
695
```js{6,9}
696
696
function Counter() {
697
697
const [count, setCount] = useState(0);
698
698
699
699
useEffect(() => {
700
700
const id = setInterval(() => {
701
-
setCount(c => c + 1); // ✅ This doesn't depend on `count` variable outside
701
+
setCount(c => c + 1); // ✅ Nie zależy od zewnętrznej zmiennej `count`
702
702
}, 1000);
703
703
return () => clearInterval(id);
704
-
}, []); // ✅ Our effect doesn't use any variables in the component scope
704
+
}, []); // ✅ Nasz efekt nie korzysta z żadnych zmiennych z zakresu komponentu
705
705
706
706
return <h1>{count}</h1>;
707
707
}
708
708
```
709
709
710
-
(The identity of the `setCount`function is guaranteed to be stable so it's safe to omit.)
710
+
(Stałość referencyjna funkcji `setCount`jest zagwarantowana przez Reacta, więc można ją pominąć na liście zależności.)
711
711
712
-
Now, the `setInterval`callback executes once a second, but each time the inner call to `setCount`can use an up-to-date value for`count` (called `c` in the callback here.)
712
+
Teraz funkcja zwrotna przekazana do `setInterval`wywoływana jest co sekundę, lecz za każdym razem wywołanie `setCount`wewnątrz korzysta z aktualnej wartości licznika`count` (nazwanej lokalnie jako `c`).
713
713
714
-
In more complex cases (such as if one state depends on another state), try moving the state update logic outside the effect with the [`useReducer` Hook](/docs/hooks-reference.html#usereducer). [This article](https://adamrackis.dev/state-and-use-reducer/)offers an example of how you can do this. **The identity of the `dispatch`function from`useReducer`is always stable** — even if the reducer function is declared inside the component and reads its props.
714
+
W bardziej zawiłych przypadkach (np. gdy jeden stan zależy od drugiego), spróbuj przenieść logikę zmiany stanu poza efekt przy pomocy [hooka `useReducer`](/docs/hooks-reference.html#usereducer). [W tym artykule](https://adamrackis.dev/state-and-use-reducer/)pokazano przykład jego zastosowania. **Tożsamość funkcji `dispatch`zwróconej przez`useReducer`jest zawsze stabilna** — nawet jeśli reduktor jest deklarowany wewnątrz komponentu i odczytuje jego właściwości.
715
715
716
-
As a last resort, if you want something like`this` in a class, you can [use a ref](/docs/hooks-faq.html#is-there-something-like-instance-variables)to hold a mutable variable. Then you can write and read to it. For example:
716
+
Ostatecznie, jeśli zechcesz skorzystać z czegoś w rodzaju klasowego`this`, możesz [użyć referencji](/docs/hooks-faq.html#is-there-something-like-instance-variables)do przechowania mutowalnej zmiennej. Wtedy możliwe będzie jej nadpisywanie i odczytywanie w dowolnym momencie. Na przykład:
717
717
718
718
```js{2-6,10-11,16}
719
719
function Example(props) {
720
-
// Keep latest props in a ref.
720
+
// Trzymaj ostatnie właściwości w referencji.
721
721
const latestProps = useRef(props);
722
722
useEffect(() => {
723
723
latestProps.current = props;
724
724
});
725
725
726
726
useEffect(() => {
727
727
function tick() {
728
-
// Read latest props at any time
728
+
// Odczytaj ostatnie właściwości w dowolnym momencie
729
729
console.log(latestProps.current);
730
730
}
731
731
732
732
const id = setInterval(tick, 1000);
733
733
return () => clearInterval(id);
734
-
}, []); // This effect never re-runs
734
+
}, []); // Ten efekt nigdy nie uruchomi się ponownie
735
735
}
736
736
```
737
737
738
-
Only do this if you couldn't find a better alternative, as relying on mutation makes components less predictable. If there's a specific pattern that doesn't translate well, [file an issue](https://github.com/facebook/react/issues/new) with a runnable example code and we can try to help.
738
+
Rób tak tylko gdy nie znajdziesz lepszej alternatywy, ponieważ poleganie na mutacjach negatywnie wpływa na przewidywalność zachowania się komponentów. Jeśli znasz jakiś wzorzec, którego nie da się w prosty sposób wyrazić za pomocą hooków, [zgłoś to](https://github.com/facebook/react/issues/new), załączając przykład działającego kodu, a postaramy się pomóc.
739
739
740
-
### How do I implement`shouldComponentUpdate`? {#how-do-i-implement-shouldcomponentupdate}
740
+
### Jak zaimplementować`shouldComponentUpdate`? {#how-do-i-implement-shouldcomponentupdate}
741
741
742
-
You can wrap a function component with `React.memo` to shallowly compare its props:
742
+
Możesz opakować komponent funkcyjny za pomocą `React.memo`, aby zastosować płytkie porównanie jego właściwości:
743
743
744
744
```js
745
745
constButton=React.memo((props) => {
746
-
//your component
746
+
//twój komponent
747
747
});
748
748
```
749
749
750
-
It's not a Hook because it doesn't compose like Hooks do. `React.memo`is equivalent to`PureComponent`, but it only compares props. (You can also add a second argument to specify a custom comparison function that takes the old and new props. If it returns true, the update is skipped.)
750
+
Nie jest to hook, bo nie komponuje się jak hooki. `React.memo`jest odpowiednikiem klasy`PureComponent`, jednak ogranicza się do porównywania wyłącznie właściwości. (Możesz także jako drugi argument przekazać funkcję porównującą poprzednie i aktualne właściwości. Jeśli zwróci `true`, aktualizacja komponentu zostanie pominięta.)
751
751
752
-
`React.memo`doesn't compare state because there is no single state object to compare. But you can make children pure too, or even [optimize individual children with`useMemo`](/docs/hooks-faq.html#how-to-memoize-calculations).
752
+
`React.memo`nie porównuje stanu komponentu, ponieważ nie ma jednego jedynego obiektu stanu, jak to ma miejsce w komponentach klasowych. Możesz jednak sprawić, by potomkowie również byli "czystymi" komponentami (ang. *pure components*), a nawet [zoptymalizować poszczególnych potomków za pomocą`useMemo`](/docs/hooks-faq.html#how-to-memoize-calculations).
753
753
754
-
### How to memoize calculations? {#how-to-memoize-calculations}
754
+
### Jak memoizować obliczenia? {#how-to-memoize-calculations}
755
755
756
756
The [`useMemo`](/docs/hooks-reference.html#usememo) Hook lets you cache calculations between multiple renders by "remembering" the previous computation:
0 commit comments