Хотя ответ Кайса разрешит симптомы, он не будет устранять причину. Он также потерпит неудачу, если будет несколько входов - какой из них должен автоматически фокусироваться при повторном рендеринге?
Проблема возникает, когда вы определяете компонент (FormComponent
) внутри области действия другой функции, которая вызывается при каждом рендеринге вашего компонента App
. Это дает вам совершенно новый FormComponent
каждый раз, когда ваш App
компонент перерисовывается и вызывает useState
. Этот новый компонент тогда, ну, без внимания.
Лично я чувствовал бы, что возвращаю компоненты с крючка. Вместо этого я бы определил компонент FormComponent
и возвращал бы состояние только из состояния useForm.
Но рабочий пример, ближайший к вашему исходному коду, может быть:
// useForm.js
import React, { useState } from "react";
// Define the FormComponent outside of your useForm hook
const FormComponent = ({ setState, state, label }) => (
<form>
<label htmlFor={label}>
{label}
<input
type="text"
id={label}
value={state}
placeholder={label}
onChange={e => setState(e.target.value)}
/>
</label>
</form>
);
export default function useForm(defaultState, label) {
const [state, setState] = useState(defaultState);
return [
state,
<FormComponent state={state} setState={setState} label={label} />,
setState
];
}
// App.js
import useForm from "./useForm";
export default function App() {
const [formValue, Form] = useForm("San Francisco, CA", "Location");
return (
<>
<h1>{formValue}</h1>
{Form}
</>
);
}
Вот песочница