React: Do czego służy useEffect?

Opublikowano: 17.01.2023 - tagi: JavaScript React Hook Komponent Stan

Kiedy użyć useEffect?

useEffect jest to hook wprowadzony w React w wersji 16.8 dla komponentów stworzonych przez funkcję. Jego zadaniem jest obsługa różnego rodzaju efektów ubocznych. A jaśniej?

Za efekty uboczne można uznać: komunikacja za pomocą requestów, tworzenie subskrypcji (na przykład: obsługa RxJS), ale także ich kasowanie. Do tej kategorii zalicza się także obsługa timerów: setInterval oraz setTimeout.

useEffect ma wiele wspólnego z cyklem istnienia komponentu. Chcesz wywołać jakiś kod, gdy komponent został stworzony? Użyj useEffect. Chcesz posprzątać po sobie, gdy komponent jest usuwany? Użyj useEffect. Potrzebujesz wywołać dany fragment kodu, gdy została zmieniona wartość jakiejś zmiennej? Użyj useEffect.

Poniżej przykład, z czego się składa useEffect:

import React, { useEffect } from 'react';

useEffect(() => {

}, []);

Pierwszy parametr to funkcja, która zostanie wywołana w określonym przez Ciebie momencie: tutaj po prostu umieszczamy nasz kod. Drugi parametr jest opcjonalny, jest to tablica zależności. Przekazujemy tam zmienne, na które chcesz zareagować, gdy zmieni się ich wartość. Tablica zależności może być pusta lub nie musisz jej w ogóle przekazywać, co z kolei ma swoje konsekwencje. O tym piszę w dalszej części wpisu.

Przykład 1: Za każdym razem

Jak wspomniałem we wstępie nie musimy przekazywać tablicy zależności do useEffect:

import React, { useEffect, useState } from 'react';

const App = () => {
    const [count, setCount] = useState(0);

    useEffect(() => {
        console.log(`Count: ${count}`);
    });

    const onClick = () => {
        setCount(count + 1);
    }

    return (
        <button onClick={onClick} type="button">Click me!</button>
    )
}

Po uruchomieniu aplikacji. W konsoli zostanie wyświetlone Counter: 0. To oznacza, że useEffect wywołał kod, gdy komponent został stworzony.

Po kliknięciu przycisk mamy w konsoli: Counter: 1. Możemy z tego wyciągnąć wniosek, że useEffect wywołuje nasz kod, w momencie, gdy stan komponentu się zmienił.

Wnioski: jeśli nie przekażesz tablicy zależności do useEffect kod tam umieszczony zostanie: a) Wywołany w momencie, gdy komponent zostanie stworzony b) Wywołany, gdy stan komponentu się zmieni

Przykład 2: Komponent został stworzony

Jeśli chcemy wywołać kod tylko w momencie, gdy komponent zostanie stworzony, wystarczy przekazać pustą tablicę jako drugi parametr:

import React, { useEffect, useState } from 'react';

const App = () => {
    const [count, setCount] = useState(0);

    useEffect(() => {
        console.log('Component is mounted!')
    }, []);

    const onClick = () => {
        setCount(count + 1);
    }

    return (
        <button onClick={onClick} type="button">Click me!</button>
    )
}

Nawet jeśli zmienisz stan komponentu, wciskając przycisk: kod umieszczony w useEffect nie zostanie wywołany.

Przykład 3: Zmiana wartości zmiennej

Załóżmy, że chcesz zareagować w momencie zmiany stanu danej zmiennej:

import React, { useEffect, useState } from 'react';

const App = () => {
    const [count, setCount] = useState(0);

    useEffect(() => {
        console.log(`Count: ${count}`);
    }, [count]);

    const onIcrement = () => {
        setCount(count + 1);
    }

    const onDecrement = () => {
        setCount(count - 1);
    }

    return (
        <button onClick={onIcrement} type="button">Increment</button>
        <button onClick={onDecrement} type="button">Decrement</button>
    )
}

W momencie stworzenia komponentu w konsoli zostanie wyświetlony log: Count: 0. Jest tak, ponieważ zmiennej count ustawiamy początkowy stan za pomocą useState.

Klikając w oba przyciski będziemy zmieniać stan zmiennej count więc kod umieszczony w useEffect za każdym razem zostanie wywołany.

Przykład 4: Sprzątanie po sobie

useEffect pozwala nam także posprzątać po sobie, jeśli będzie taka potrzeba. Wygląda to tak:

useEffect(() => {
		...
		return () => { ... };
}, [count]);

Wystarczy zwrócić funkcję, a w niej zdefiniować kod sprzątający.

Przykład:

const Count = () => {
    const [count, setCount] = useState(0);

    useEffect(() => {
        let intervalId = null;
        intervalId = setInterval(() => {
            console.log('Tik Tok')
            setCount(c => c + 1);
        }, 1000);

        return () => {
            clearInterval(intervalId);
        }
    }, []);

    return <div>Count: {count}</div>
}

const App = () => {
    const [clicked, setClicked] = useState(true);

    return <div>
            {clicked && <Count></Count>}
            <button onClick={() => setClicked(!clicked)}>Click me!</button>
        </div>;
}

Mamy tutaj komponent Count. W momencie stworzenia tego komponentu uruchamiany jest kod umieszczony w useEffect. Co sekundę zwiększany jest licznik stałej count. Z tego powodu, że używamy funkcji setInterval wypadałoby po sobie posprzątać, w momencie, gdy komponent nie jest używany. Robione jest to za pomocą funkcji clearInterval.

Żeby zademonstrować, że funkcja czyszcząca działa wciśnij przycisk. W konsoli nie będzie wyświetlony log: Tik Tok


TypeScript: Jak stworzyć pustą liczbę?

Opublikowano: 10.01.2023 - tagi: TypeScript JavaScript Liczba

Czym jest pusta liczba?

Ostatnio stanąłem przed zadaniem napisania testu jednostkowego, który sprawdzał przypadek: przekazany do funkcji model danych jest niepoprawny, więc walidacja powinna to wykryć i nie stworzyć rekordu w bazie danych. Jedno z wymaganych pól jest liczbą. Na przykład:

interface Model {
    name: string;
    value: number;
};

test('should not allow empty number', () => {
    // given
    const model: Model = {
        name: 'Test',
    };

    // when
    const result: boolean = validate(model);

    // given
    expect(result).toBeFalsy();
});

W tym teście symuluję przypadek, gdy do modelu nie jest przekazana wartość dla pola value. Problem w tym, że taki zapis nie zadziała, ponieważ TypeScript wyrzuci błąd:

error TS2741: Property 'value' is missing in type '{ name: string; }' but required in type 'Model'

Ten problem można rozwiązać poprzez małą zmianę w definicji modelu:

interface Model {
    name: string;
    value?: number;
};

Za pomocą operatora: ? informujemy TypeScript, że pole value jest opcjonalne, ale... to nie prawda, bo powinno być wymagane!

Jak to rozwiązać?

Pusta liczba przykład

Żeby stworzyć "pustą" liczbę można jej przypisać wartość NaN:

interface Model {
    name: string;
    value: number;
};

test('should not allow empty number', () => {
    // given
    const model: Model = {
        name: 'Test',
        value: NaN
    };

    // when
    const result: boolean = validate(model);

    // given
    expect(result).toBeFalsy();
});

Wartość NaN jest typu number i dlatego TypeScript nie sygnalizuje błędu.


React: Do czego służy useState?

Opublikowano: 07.01.2023 - tagi: JavaScript React Komponent Hook Stan

Czym jest useState?

useState w React jest to hook, który służy do zarządzania stanem komponentu. Może on zostać wykorzystany tylko w komponencie stworzonym za pomocą funkcji.

Przykład użycia useState

Poniżej prosty przykład użycia useState:

import React, { useState } from 'react';

const Counter = () => {
    const [counter, setCounter] = useState(0);


    const onIncrement = () => {
        setCounter(counter + 1);
    }

    const onDecrement = () => {
        setCounter(counter - 1);
    }

    return (
        <div>
            <button onClick={onDecrement}>-</button>
            <h2>{counter}</h2>
            <button onClick={onIncrement}>+</button>
        </div>
    )
}

Linijka:

const [counter, setCounter] = useState(0);

jest odpowiedzialna za stworzenie stanu naszego komponentu. Tutaj chcemy stworzyć stan do zarządzania wartością licznika.

useState przyjmuje jeden argument: wartość początkową, gdy komponent jest tworzony.

useState zwraca: zmienną, która przechowuje aktualny stan. W tym przypadku stała counter. Zwraca także funkcję, która pozwala zmienić stan na nowy: setCounter.

Jeśli potrzebujemy stworzyć stan dla różnych danych wystarczy wywołać jeszcze raz useState na przykład:

const [counter, setCounter] = useState(0);
const [list, setList] = useState([]);

Comics: Code smells

Opublikowano: 05.01.2023 - tagi: Komiks Rysowanie Kod

Code smells

6 sposobów na lepszą koncentrację

Opublikowano: 03.01.2023 - tagi: Produktywność Skupienie Nawyk

Skup się!

Moim zdaniem umiejętność skupienia się na tym, czym się aktualnie zajmuję to jedna z najważniejszych umiejętności, w jakich czasach żyjemy. Dlaczego? Przede wszystkim pozwala Ci to szybciej skończyć zadanie, które masz do zrobienia. Kiedy jesteś skoncentrowany na jednej rzeczy, poświęcasz cały swój czas i energię właśnie na tym. Właściwy poziom skupienia pozwala zaoszczędzić czas i energię. Te zasoby są ograniczone, więc warto nimi mądrze zarządzać.

Dlaczego tak trudno się skupić?

Problem polega na tym, że znacznie łatwiej stracić koncentrację niż się skupić. Wszystko przez różnego rodzaju rozpraszacze. Rozpraszając się, pozwalasz na to, żeby Twoja uwaga była podzielona w kilku miejscach. Tracisz przez to czas i energię. Działając w ten sposób, często zmieniasz kontekst, co powoduje zmęczenie psychiczne.

Nie raz miałem sytuację, że po dniu pracy zastanawiałem się, co ja właściwie dzisiaj zrobiłem? Jestem zmęczony, a właściwie nic konkretnego nie udało mi się zrobić. Wpadamy w taki stan, kiedy często pozwalamy się rozpraszać.

Dlatego mając świadomość o sile, jaką daje skupienie, warto zbudować dobry nawyk koncentracji.

Poniżej znajdziesz listę kilku ćwiczeń na lepsze skupienie.

Ćwiczenia na skupienie

Czytanie książek

Poświęć co najmniej 30 minut na czytanie. Jest to idealne ćwiczenie na koncentrację. W dziale książki znajdziesz kilka pozycji, które mogą Cię zainteresować.

Medytacja

Wystarczy sesja 10 minut dziennie. Ja poświęcam na medytację 2 × 10 minut: rano i wieczorem. Jest wiele rodzajów medytacji. Ja medytuję, w taki sposób, że skupiam się na swoim oddechu.

Na przykład:

Wciągam powietrze. Trzymam powietrze w płucach na jakieś 5 sekund i następnie wypuszczam je powoli.

Rób jedną rzecz na raz

Wielozadaniowość to zły nawyk! Skacząc po zadaniach, będziesz bardziej zmęczony. Znacznie lepiej skupić się na jednym zadaniu i przejść do kolejnego.

Wyrób w sobie nawyk koncentracji na jednym zadaniu.

Skupienie poprzez dźwięk

Żeby lepiej się skupić, możesz wykorzystać narzędzie, jakim jest dźwięk. Zakładasz słuchawki, włączasz odpowiedni dźwięk i koncentrujesz się na swoim celu.

Dźwięk pomaga w walce z rozpraszaczami. Jeśli jesteś zainteresowany tym ćwiczeniem, polecam dwa linki: Endel świetna aplikacja! Tylko że jest płatna.

Są też darmowe sposoby na skupienie poprzez dźwięk

Unikaj rozpraszaczy

Ten punkt powinien być pierwszy na liście, ale jest to trudne. W tym ćwiczeniu chodzi o zbudowanie dobrego nawyku: kiedy coś robię, zajmuję się tylko tym. Kuszące jest na przykład pisanie kodu + słuchanie audiobook'a, ale na dłuższą metę nie da to dobrych efektów. Szczególnie gdy zadanie wymaga dużej koncentracji.

Technika Pomodoro

Tecznika Pomodoro to jedno z pierwszych narzędzi, które pozwoliły mi zbudować dobry nawyk koncentracji. Polega na interwałowym trybie pracy. Więcej informacji znajdziesz tutaj