javascript - React/Javascript 在实现字典时遇到问题
问题描述
我正在尝试在我的 React 项目中实现字典。我猜这是基本的 javascript,所以如果你不熟悉 React,你可能仍然可以提供帮助。
我的目标是拥有一个包含问题的字典,其中每个问题都有一系列答案。我希望能够先添加一个问题,然后再添加答案。
我可以添加记录,但在修改答案数组时遇到问题:
最初的
const [dict, setDict] = React.useState([])
添加字典记录
question = "question1"
const newDict = dict.concat({ key: question1, value: [] });
setDict(newDict);
修改字典值
const answer = "valueToAdd"
const newDict = dict;
newDict["test"].concat(answer);
setDict(newDict);
我收到以下错误。似乎 newDict["test"] 是未定义的,即使我刚刚添加了它。我究竟做错了什么?
TypeError: Cannot read property 'concat' of undefined
另外,这是附加到字典的正确方法吗?我正在这样做,所以字典会重新渲染。
解决方案
我相信您正在将 dict 状态变量的初始值设置为一个空数组,而不是您可能想要的真正的字典。Javascript 对象的行为与其他语言中的字典非常相似,因此您可能希望为此使用对象。
声明你的状态
const [dict,setDict] = useState({})
在这里,我们将状态(dict)初始化为一个空的 javascript 对象。这些对象的行为类似于您在其他语言中熟悉的字典。
添加键值对
setDict(prevDict => ({...prevDict, newKey: []}))
在这里,我们使用箭头函数为我们将用来更新状态的对象提供先前的状态。这样做是为了保持先前的状态不可变。spread/rest 操作符 "..." 用于收集前一个状态的所有值,然后添加新的键值对
更新值
setDict(prevDict => ({...prevDict, keyToUpdate: [...prevDict.keyToChange, "newValue"]}))
与上述类似,使用了扩展/休息运算符,这次是在两个地方。首先保留先前状态的键,其次保留我们将要添加到的数组中的所有值。
推荐阅读
- c# - 在 Selenium 测试中传递参数的正确位置?
- javascript - 在打印预览上重绘图形 - 不是函数(嵌套 Vue 组件)
- php - “未捕获的 Twig_Error_Loader”错误与 Materialise 模板,OpenCart 3
- python - 有条件的熊猫唯一值
- python - 在 Python 2.7 中,为什么字符串在文本模式下比在二进制模式下写得更快?
- spring - 使用 RestTemplae 获取 vavr Multimap 后的反序列化错误
- machine-learning - PyTorch 教程中的交叉熵计算
- excel - 更新图表的源数据范围
- git - 如果我从另一个分支推送,是否会在 git 分支上提交?
- ubuntu - Pylint 不能在 Jenkins 内部运行