Estou trabalhando com ReactJs
e React-Hook-Form
. Tenho um componente com uma lista selecionada de marcas de automóveis. Quando o componente for renderizado inicialmente, quero que a opção da lista de seleção tenha como padrão o valor Other
e tenha uma exibição de entrada de texto para que o usuário possa inserir uma marca que não esteja presente na lista de seleção. Se o usuário selecionar uma marca existente na lista de seleção, a entrada de texto deverá ser ocultada. Aqui está o meu código:
export default function Test() {
type Car = {
brandId: number,
brand: string
}
const defaultBrandId = 5; // 'Other'
const [showBrandInput, setShowBrandInput] = useState<boolean>(true);
const { register, handleSubmit, setValue, getValues, watch} = useForm<Car>();
useEffect(() => {
fetchCarBrands();
}, [])
useEffect(() => {
setShowBrandInput(getValues().brandId === defaultBrandId);
}, [watch('brandId')]);
function fetchCarBrands() {
// API call to get select list data
// Set default select list value to 'Other'
setValue("brandId", defaultBrandId);
}
function onSubmit() {
alert("form submitted");
}
return (
<>
<Form onSubmit={handleSubmit(onSubmit)} noValidate>
<Div className="mb-4">
<FormLabel>Brand</FormLabel>
<Row>
<Col>
<Form.Select {...register("brandId")}>
<option value="1">Chevy</option>
<option value="2">Ford</option>
<option value="3">Honda</option>
<option value="4">Toyota</option>
<option value="5">Other</option>
</Form.Select>
</Col>
<Col>
{showBrandInput &&
<Form.Control type="text" {...register("brand")} />
}
</Col>
</Row>
</Div>
<Button type="submit" className="btn-dk-blue">
Submit
</Button>
</Form>
</>
)
}
O código acima é renderizado inicialmente corretamente com o valor da lista de seleção padrão Other
selecionado e a entrada de texto fica visível. Se eu selecionar um valor diferente na lista de seleção, a entrada de texto ficará oculta. Meu problema é que se eu selecionar novamente Other
na lista de seleção, a entrada de texto não será exibida.
Problema
este é um caso simples de comparação de tipos errados. O código acima está tentando comparar uma string com um número e é por isso que ela só aparece durante o carregamento. Se você converter ambos como números em seu efeito de uso (ou como strings), o problema será resolvido.
Solução
Abaixo está um exemplo funcional do seu código (com algum HTML modificado, já que não tenho os mesmos componentes que você) com ambas as variáveis convertidas como números inteiros para comparação correta.
Para obter detalhes sobre as alterações e por que foram feitas, consulte o final desta postagem.
Mudanças:
defaultValue