@architect_711

Хороша ли практика мутирования input элемента в React без useState?

Я ради интереса решил сделать компонент, что будет создавать новый Todo без useState

interface Props {
    createNewTodo: (title: string) => void
}

export default function TodosCreation({createNewTodo}: Props) {
    let inputValue: string = '';

    function onClickCreateNewTodoButtonHandler(): void {
        createNewTodo(inputValue);

        document.getElementById('create_input').value = '';
    }

    return (
        <>
            <input
                type="text"
                placeholder="Title..."
                id="create_input"
                onChange={event => inputValue = event.target.value}
            />
            <button onClick={onClickCreateNewTodoButtonHandler}>Create!</button>
        </>
    );
}


И вот не понятно, хорошо ли так делать? Все гайды как под копирку (совпадение?) при обучении управления состоянием input используют useState, но какая разница? Быть может разница в перерисовывании дерева.
  • Вопрос задан
  • 657 просмотров
Решения вопроса 1
@nokkc
Получение элементов из DOM через querySelector или getElementBy считается плохой практикой и более идиоматичный для React-а способ - использовать useRef для функциональных / createRef для классовых компонентов.

А сам подход без использования useState называется uncontrolled components и он достаточно часто используется, основное отличие в данном случае будет в том, что изменение значения в инпуте таким образом не вызывает нового рендера и если от этого значения зависят другие компоненты/эффекты, то и они обновляться/вызываться тоже не будут.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@Yozi
Именно так писать с точки зрения react некорректно и, вроде, не запуская код, предположу, что не должно работать правильно, потому что onCreate возьмёт старое значение из замыкания.

Либо следует вовсе убрать onChange, можно ведь не синхронизировать переменную и взять input.value в момент создания. Тогда получится классический uncontrolled. Либо же использовать useState.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы