Я представляю два разных способа визуализации компонента ввода;
function myComponent(){
const [st, setSt] = useState('');
return <div>
{Math.random()}
<input value = {st}
onChange = {e=>setSt(e.target.value)/>
</div>
function StateHelper() {
const [st, setSt] = useState("");
return { context: { st, setSt } };
}
function MyHelper(prop) {
const ActualComponent = prop.capture;
return <ActualComponent />;
}
function MyComponent() {
const { context } = StateHelper();
const capturedComponent = () => (
<input
value = {context.st}
onChange = {(e) => {
context.setSt(e.target.value);
}}
/>
);
return <MyHelper capture = {capturedComponent} />;
}
Кажется, я запутался в одной из основ.
Например, 1, когда я печатаю, я не теряю фокус на компоненте ввода.
Например, 2, на каждой набранной букве я теряю фокус.
В обоих этих примерах Math.random() изменяется, поэтому они оба перерисовываются.
Я не знаю, в чем разница и почему я продолжаю терять внимание, например. 2 ?
Я пытаюсь следовать, например. 2, так как это помогает мне лучше управлять своим кодом, но я не могу его понять. Что я не понимаю в повторном рендеринге компонентов реагирования и как это исправить?
🤔 А знаете ли вы, что...
JavaScript можно использовать для манипуляции DOM (Document Object Model), что позволяет изменять содержимое и структуру веб-страницы.
Ваша const capturedComponent = () => (
— это внутренняя функция, идентичность которой меняется при каждом вызове объявляющего ее компонента.
Это заставляет React думать, что компонент не тот, который он рендерил в прошлый раз, поэтому он размонтирует старый и перемонтирует новый (даже если они могут быть идентичны на выходе), что, в свою очередь, приводит к потере фокуса на входной элемент.
Более подробную информацию см. в документации по правилу React ESlint для этой проблемы.