Проблема с тегом ввода в функции — React JS

#javascript #reactjs

Вопрос:

Поэтому я пытаюсь условно отобразить входной тег, поэтому я использую функцию, а не просто помещаю все это в оператор return. Проблема, с которой я сталкиваюсь, заключается в том, что всякий раз, когда я вводлю одно слово во входной тег, оно теряет фокус, и мне приходится нажимать на него снова, чтобы снова сфокусироваться. Мой код выглядит так:

 function App() {
    function InputTag() {
        if (someCondition) {
            return (
                <input onChange={(e) => setState(e.target.value)} value={State} />
            )
        } else {
            return (
                <input disabled value={State} />
            )
        }
    }
    return (
        <div>
            <InputTag />
        </div>
    )
}
 

После некоторого устранения ошибок я обнаружил, что эта проблема возникает, когда я использую функцию для возврата входного тега, но в моем случае я должен использовать функцию для возврата входного тега.

Вы можете столкнуться с этой проблемой по адресу : https://codesandbox.io/s/xenodochial-bassi-3gmyk

Ответ №1:

InputTag переопределяется каждый раз App при рендеринге. И App перерисовывается каждый раз onChange при запуске события, потому что его состояние обновляется.

Одним из решений было бы выйти InputTag за пределы App , передав состояние и установщик состояний в качестве реквизитов компонентов.

 import { useState } from "react";

export default function App() {
  const [State, setState] = useState("");

  return (
    <div className="App">
      <InputTag State={State} setState={setState} />
    </div>
  );
}

function InputTag({ State, setState }) {
  return <input onChange={(e) => setState(e.target.value)} value={State} />;
}
 

Редактировать скучно-сара-l3yvr


Однако не совсем понятно, почему вы говорите, что вам нужно использовать функцию для выполнения некоторого условного рендеринга.

Если вы отключаете ввод только на основе someCondition , вы можете легко сделать это в App инструкции return.

 import { useState } from "react";

export default function App() {
  const [state, setState] = useState("");
  const [someCondition, setSomeCondition] = useState(true);

  return (
    <div className="App">
      <input
        onChange={(e) => setState(e.target.value)}
        value={state}
        disabled={!someCondition}
      />

      <button onClick={() => setSomeCondition(!someCondition)}>
        someCondition: {someCondition.toString()}
      </button>
    </div>
  );
}
 

Редактировать святое-фреймворк-w8n1m