如何在不使用 onChange 的情况下使用 React 设置 <select> 的值?
How do I set a value for a <select> with React without using onChange?
我得到了以下 HTML select 元素
<select id="bars" onChange={(e) => onBarChange(e)}>
{props.results.map((bar, y) => (
<option value={bar.id} key={bar.id} data-key={bar.id}>
{bar.name} in {bar.city}
</option>
))}
</select>;
使用以下 onChange 方法作为回调:
const onBarChange = (e: React.ChangeEvent<HTMLSelectElement>) => {
setBarId(parseInt(e.target.value));
};
但是,只要 props.results
中只有 一个 栏(props.results.length === 1),那么 onBarChange(e)
将永远不会被调用并且因此 barId
将始终保持为 0(我猜是默认值 select)。
我尝试将该逻辑放入提交表单中,如下所示:
if(props.results.length === 1) {
setBarId(props.results[0].id)
}
但这也不起作用。如果我控制台日志 props.results[0].id
我得到正确的 ID 但如果我控制台日志 barId
在此之后它仍然是 0。怎么会这样?是否触发了重新渲染并且 select 立即再次将默认状态设置为 0?
我该如何解决这个问题,以便当 props.results
中只有一个栏时,包裹此 select 的提交按钮将正确的 barId 发送到后端(当然也应该与多个栏一起使用。 .)?
当您使用 useState 创建 barId 时传递默认值。
const [barId, setBarId] = useState(props?.results[0]?.id ?? 0)
const onBarChange = (e: React.ChangeEvent<HTMLSelectElement>) => {
setBarId(parseInt(e.target.value));
};
<select id="bars" onChange={(e) => onBarChange(e)}>
{props.results.map((bar, y) => (
<option value={bar.id} key={bar.id} data-key={bar.id}>
{bar.name} in {bar.city}
</option>
))}
</select>;
您可以做的另一件事是先添加一个空值。
<select id="bars" onChange={(e) => onBarChange(e)}>
<option>Select Bar</option>
{props.results.map((bar, y) => (
<option value={bar.id} key={bar.id} data-key={bar.id}>
{bar.name} in {bar.city}
</option>
))}
</select>;
我得到了以下 HTML select 元素
<select id="bars" onChange={(e) => onBarChange(e)}>
{props.results.map((bar, y) => (
<option value={bar.id} key={bar.id} data-key={bar.id}>
{bar.name} in {bar.city}
</option>
))}
</select>;
使用以下 onChange 方法作为回调:
const onBarChange = (e: React.ChangeEvent<HTMLSelectElement>) => {
setBarId(parseInt(e.target.value));
};
但是,只要 props.results
中只有 一个 栏(props.results.length === 1),那么 onBarChange(e)
将永远不会被调用并且因此 barId
将始终保持为 0(我猜是默认值 select)。
我尝试将该逻辑放入提交表单中,如下所示:
if(props.results.length === 1) {
setBarId(props.results[0].id)
}
但这也不起作用。如果我控制台日志 props.results[0].id
我得到正确的 ID 但如果我控制台日志 barId
在此之后它仍然是 0。怎么会这样?是否触发了重新渲染并且 select 立即再次将默认状态设置为 0?
我该如何解决这个问题,以便当 props.results
中只有一个栏时,包裹此 select 的提交按钮将正确的 barId 发送到后端(当然也应该与多个栏一起使用。 .)?
当您使用 useState 创建 barId 时传递默认值。
const [barId, setBarId] = useState(props?.results[0]?.id ?? 0)
const onBarChange = (e: React.ChangeEvent<HTMLSelectElement>) => {
setBarId(parseInt(e.target.value));
};
<select id="bars" onChange={(e) => onBarChange(e)}>
{props.results.map((bar, y) => (
<option value={bar.id} key={bar.id} data-key={bar.id}>
{bar.name} in {bar.city}
</option>
))}
</select>;
您可以做的另一件事是先添加一个空值。
<select id="bars" onChange={(e) => onBarChange(e)}>
<option>Select Bar</option>
{props.results.map((bar, y) => (
<option value={bar.id} key={bar.id} data-key={bar.id}>
{bar.name} in {bar.city}
</option>
))}
</select>;