react-hooks - 下拉菜单不会随状态而变化
问题描述
当我更改下拉菜单时,我希望其他下拉菜单也会更改,但它们不会。
代码
尽管我进行了简化,但这仍然相当复杂,所以为了尽量减少重点,我只把重要的部分放在这里。如需更完整和更有效的代码,请前往codepen
这些是状态变量。templateOptions 描述了 csv 列以及如何映射到我的系统变量。
const [templateOptions,setTemplateOptions] = React.useState([
{ ingestTemplateId:80, name:'Template 1',
columns:[
{ id:0, name:'Date', required:true, value:{ id:8, name:'Date' }},
{ id:1, name:'Classification', required:true, value:{ id:7, name:'Classification' }}
]
},
{ ingestTemplateId:81, name:'Template 2',
columns:[
{ id:0, name:'Level', required:true, value:{ id:27,name:'Level' }},
{ id:1, name:'SSN', required:true, value:{ id:23,name:'SSN' }}
]
}])
const [ingestTemplate, setIngestTemplate] = React.useState(templateOptions[0]);
const [templateId, setTemplateId] = React.useState(ingestTemplate.ingestTemplateId);
const [templateColumns, setTemplateColumns] = React.useState(ingestTemplate.columns);
const [templateColVals, setTemplateColVals] = React.useState(ingestTemplate.columns.map(c=>c.value));
然后我有了 useEffect,我需要它才能使映射更改生效,但我不确定它的作用......
React.useEffect(updateStuff,[templateOptions,ingestTemplate,templateId,templateColumns])
function updateStuff(o){
console.log('UPDATE');
}
接下来是模板下拉菜单。当它被改变时,它应该更新映射和 csv 列:
<select defaultValue={templateId} onChange={e=> act_ChangeCurrentTemplate(e)}>
{templateOptions.map(t=>
<option value={ t.ingestTemplateId }>
{ t.name }
</option>
)}
</select>
这些是映射下拉列表:
{templateColVals.map((cv,i)=>{
let c = templateColumns[i]
return (
<select defaultValue={cv.id} onChange={e=>act_ChangeMapping(e, c.id)}>
{ mappingOptions.map(mo=>
<option
key={'c_'+c.ingestTemplateId+'_mo_'+mo.id}
id={'mo_'+mo.id}
value={ mo.id }>
{ mo.name }
</option>
)}
</select>
})
最后,这是应该更新下拉列表值的函数,但没有。我省略了act_ChangeMapping,因为它要复杂得多并且可以按预期工作
function act_ChangeCurrentTemplate(e){
let newIT = templateOptions.filter(t=>Number(t.ingestTemplateId) === Number(e.target.value))[0]
setIngestTemplate(newIT)
setTemplateColumns(newIT.columns)
setTemplateColVals(newIT.columns.map(c=>c.value)) // this change to state does not change the dropdowns' values
setTemplateName(newIT.name)
setTemplateId(newIT.ingestTemplateId)
}
背景和额外信息
这是一个大型应用程序的例外,简化为基本形式。它有助于将数据移植到我的系统中。
用户上传 CSV,然后这有助于他们定义它应该如何映射到我的数据。如您所见,一切都匹配:映射匹配 csv 列以及底部的状态转储。
但是当我更改模板时,除了下拉列表之外的所有内容都会更新:
如您所见,CSV 列更新为级别和 SSN,但映射保留日期和分类。然后,如果您查看状态输出,您可以看到映射本身在状态中发生了变化。
Codepen: https ://codepen.io/travisheeter/pen/YzVbKYm?editors=0010
编辑 1:简化问题以将问题放在前面,并将额外信息移到最后。
解决方案
推荐阅读
- python - Fatal Python error, ModuleNotFoundError: No module named 'encodings', when connecting to jupyter kernel
- javascript - 从javascript中的数组中删除项目
- r - R Combinatoric Sequence Generation
- shell - KSH: How to escape backslash and double quotes together
- python - ModuleNotFoundError: No module named 'products'
- python - Python BeautifulSoup 网页抓取
- apache-spark - Spark - hiding errors by nulling values?
- php - 如何修复:解析错误:语法错误,意外的“||” (T_BOOLEAN_OR)
- javascript - Twilio 消息响应返回为未定义的节点
- ios - MPVolumeView 在显示 AVPlayerViewController 后不抑制默认系统音量 UI