将选项元素的顶部设置为默认值
Set the Top of the Option Element as a Default Value
假设我有一个名为 response
的状态变量,它包含一个动态 API 响应,它的值用作选项标签中的下拉选项。我想要做的是将选项值的顶部设置为另一个名为 selectedOption
的状态变量作为默认值。之后,我将使用它进行另一个 API 调用。这是我正在谈论的片段。
// response = useState([]) <- contains an api response
// selectedOption = useState('')
// response -> recordset = [{name: 'John'}, {name: 'Mary'}, {name 'Michael'}] *These objects vary depending on an api call.
<select onChange={(e) => setselectedOption(e.target.value)>
{response?.recordset?.map((obj, key) => {
return <option key={key} value={obj.name}>{obj.name}</option>
})}
</select>
在上述情况下,John 显示在下拉列表的顶部。但是,selectedOption
为空。打开下拉菜单并单击任何选项后,selectedOption
将更新为所选值。有什么方法可以将 John 设置为 selectedOption
而无需打开下拉菜单并单击它?
由于您在 <option/>
映射中遍历数组 response.recordset
,因此只需使用初始状态中的第一项
const [response] = useState([]); // <- contains an api response
//response -> recordset = [{name: 'John'}, {name: 'Mary'}, {name 'Michael'}] // *These objects vary depending on an api call.
const [selectedOption] = useState( response.recordset[0] );
// This bit here --^
<select onChange={(e) => setselectedOption(e.target.value)>
{response?.recordset?.map((obj, key) => {
return <option key={key} value={obj.name}>{obj.name}</option>
})}
</select>
如果你因为你的 useEffect
是异步的而不能这样做,只要你得到 API 响应就设置 selectedOption
,我会包含一个空选项.
const [response, setResponse] = useState([]); // <- contains an api response
const [selectedOption, setSelectedOption] = useState('');
useEffect(() => {
// your fetch
// response -> recordset = [{name: 'John'}, {name: 'Mary'}, {name 'Michael'}] *These objects vary depending on an api call.
setResponse(response);
setSelectedOption(response.recordset[0]);
},[])
<select onChange={(e) => setselectedOption(e.target.value)>
<option value="">Please select something below</option>
{response?.recordset?.map((obj, key) => {
return <option key={key} value={obj.name}>{obj.name}</option>
})}
</select>
如果 response
是一个数组,您可以在每次迭代中访问您的对象,这意味着,您可以只执行 resopnse.map()
而不是 response.recordset.map
您还需要使用 setSelectedOption
来更新您的状态变量。这是 useState
提供的自定义命名函数。
至于选择第一个元素,将selected
属性添加到第一个选项。
[response, setResponse] = useState([])
[selectedOption, setSelectedOption] = useState('')
<select onChange={(e) => setSelectedOption(e.target.value)>
{response.map((obj, key) => {
return <option key={key} value={obj.name} selected={key === 0}>{obj.name}</option>
})}
</select>
假设我有一个名为 response
的状态变量,它包含一个动态 API 响应,它的值用作选项标签中的下拉选项。我想要做的是将选项值的顶部设置为另一个名为 selectedOption
的状态变量作为默认值。之后,我将使用它进行另一个 API 调用。这是我正在谈论的片段。
// response = useState([]) <- contains an api response
// selectedOption = useState('')
// response -> recordset = [{name: 'John'}, {name: 'Mary'}, {name 'Michael'}] *These objects vary depending on an api call.
<select onChange={(e) => setselectedOption(e.target.value)>
{response?.recordset?.map((obj, key) => {
return <option key={key} value={obj.name}>{obj.name}</option>
})}
</select>
在上述情况下,John 显示在下拉列表的顶部。但是,selectedOption
为空。打开下拉菜单并单击任何选项后,selectedOption
将更新为所选值。有什么方法可以将 John 设置为 selectedOption
而无需打开下拉菜单并单击它?
由于您在 <option/>
映射中遍历数组 response.recordset
,因此只需使用初始状态中的第一项
const [response] = useState([]); // <- contains an api response
//response -> recordset = [{name: 'John'}, {name: 'Mary'}, {name 'Michael'}] // *These objects vary depending on an api call.
const [selectedOption] = useState( response.recordset[0] );
// This bit here --^
<select onChange={(e) => setselectedOption(e.target.value)>
{response?.recordset?.map((obj, key) => {
return <option key={key} value={obj.name}>{obj.name}</option>
})}
</select>
如果你因为你的 useEffect
是异步的而不能这样做,只要你得到 API 响应就设置 selectedOption
,我会包含一个空选项.
const [response, setResponse] = useState([]); // <- contains an api response
const [selectedOption, setSelectedOption] = useState('');
useEffect(() => {
// your fetch
// response -> recordset = [{name: 'John'}, {name: 'Mary'}, {name 'Michael'}] *These objects vary depending on an api call.
setResponse(response);
setSelectedOption(response.recordset[0]);
},[])
<select onChange={(e) => setselectedOption(e.target.value)>
<option value="">Please select something below</option>
{response?.recordset?.map((obj, key) => {
return <option key={key} value={obj.name}>{obj.name}</option>
})}
</select>
如果 response
是一个数组,您可以在每次迭代中访问您的对象,这意味着,您可以只执行 resopnse.map()
而不是 response.recordset.map
您还需要使用 setSelectedOption
来更新您的状态变量。这是 useState
提供的自定义命名函数。
至于选择第一个元素,将selected
属性添加到第一个选项。
[response, setResponse] = useState([])
[selectedOption, setSelectedOption] = useState('')
<select onChange={(e) => setSelectedOption(e.target.value)>
{response.map((obj, key) => {
return <option key={key} value={obj.name} selected={key === 0}>{obj.name}</option>
})}
</select>