【发布时间】:2021-12-13 04:57:31
【问题描述】:
我正在尝试根据我拥有的对象创建一个下拉列表。我想不出一种不完全复杂的方法,而且我提出的解决方案也不起作用。我是反应和stackoverflow的新手,所以我不确定只是征求意见是否可以。如果不是,请原谅我。我正在用 React 构建它。有没有办法做到这一点,我错过了。如果您不应该在这里寻求帮助,再次抱歉
我已经创建了如下组件
const HardwearForm = ({isActive, Products, outputObj, setOutputObj}) => {
const handleSelect = e => {
let newParentNode = e.target;
let selectedNumber = newParentNode.options.selectedIndex;
let choice = newParentNode.options[selectedNumber].value;
setOutputObj(outputObj[newParentNode.id] = choice);
console.log(outputObj)
}
useEffect(() => {
let parentNode = document.getElementById("make");
Object.keys(Products[isActive]["hardwear"]).forEach(key => {
let newOption = document.createElement('option');
newOption.value = key;
newOption.innerText = key;
parentNode.appendChild(newOption);
})
},[isActive, Products]);
return (
<div>
<select name="make" className="hardwear" id="make" onChange={handleSelect}>
<option value="*">Manufacturer</option>
</select>
<select name="model" className="hardwear" id="model"></select>
{isActive === "handset"|| isActive==="tablet"?
<>
<select name="storage" className="hardwear" id="storage""></select></>:""}
{isActive === "handset"|| isActive==="tablet" ||isActive=== "watch"?
<>
<select name="color" className="hardwear"></select></>:""}
{isActive === "handset"|| isActive==="watch"?
<>
)
基本的想法是我有一个带有几个按钮的菜单。这些按钮更新 isActive 状态,然后导致 useEffect 运行并使用选项填充第一个选择。这很好用。然后我进行了设置,因此一旦选择了第一个下拉列表中的选择,它就会触发 handleSelect 函数,该函数对下一个选择执行相同的操作。我设置了一个空对象来存储所有选项。 setOutputObj(outputObj[newParentNode.id] = 选择);和该对象的键值对。问题是,如果您随后尝试更改所选选项,则会出错“TypeError: Cannot create property 'make' on string 'Huawei'”。
这是我正在使用的日期结构的示例。
"Fairphone": {
"3+": {
"color": ["Black"],
"storage": ["64GB"],
}
},
"Doro": {
"8050": {
"color": ["Black"],
"storage": ["16GB"],
}
},
"Mobiwire": {
"Smart N12": {
"color": ["Dark Metallic Blue"],
"storage": ["16GB"],
}
},
【问题讨论】:
-
可以修改数据结构还是必须坚持的东西?
-
目前我可以随意构建数据。我有 6 种产品类型的列表。上面是手机,分为制造商、型号、存储容量选项和颜色。重组结构会有帮助吗?
标签: javascript reactjs json oop react-hooks