Стандартний спосіб використання React useState Hook полягає в наступному:
const [count, setCount] = useState(0);
Однак ця const countзмінна, очевидно, буде перенесена на інше примітивне значення.
Чому тоді змінна не визначається як let count?
Стандартний спосіб використання React useState Hook полягає в наступному:
const [count, setCount] = useState(0);
Однак ця const countзмінна, очевидно, буде перенесена на інше примітивне значення.
Чому тоді змінна не визначається як let count?
Відповіді:
Очевидно, буде присвоєно інше примітивне значення
Не зовсім. Коли компонент передається, функція виконується знову, створюючи нову область, створюючи нову countзмінну, яка не має нічого спільного з попередньою змінною.
Приклад:
let _state;
let _initialized = false;
function useState(initialValue) {
if (!_initialized) {
_state = initialValue;
_initialized = true;
}
return [_state, v => _state = v];
}
function Component() {
const [count, setCount] = useState(0);
console.log(count);
setCount(count + 1);
}
Component();
Component(); // in reality `setCount` somehow triggers a rerender, calling Component again
Component(); // another rerender
Примітка: Гачки набагато складніші і насправді не реалізовані так. Це просто для демонстрації подібної поведінки.
const є захистом від перепризначення значення посилання в тому ж обсязі.
Від MDN
Це не означає, що значення, яке він містить, є незмінним, просто те, що ідентифікатор змінної не може бути перепризначений.
Також
Константа не може ділитися своїм ім'ям з функцією або змінною в тій же області.
Після виклику setCount компонент відновлюється, а новий виклик useState повертає нове значення. Справа в тому, що підрахунок незмінний. Так що друку тут немає.
Технічно це нова змінна при кожному візуалізації.
Джерело: React Github issue: Docs - Hooks: це те, що друкується помилка?
тут я виявив, що const засмучує, оскільки підрахунок повинен так змінитися
let [count, setCount] = useState(0)
// simply can't use ++ on either side of count increment given we declare as const [count, setCount]
// instead declaration of var or let [count, setCount] allows simpler code
const increment = () => {
setCount(count++); //const cannot do this only let or var
};