reactjs - useState 不强制重新渲染反应组件
问题描述
我有一个组件,它的 propvalue
是一个对象,其中一个属性value
是aliases
一个字符串数组。我有一个添加别名按钮,它应该为对象添加一个别名。我.map
在组件中显示所有别名,但是当我添加别名时,组件不会重新渲染。我可以在浏览器中正确看到state
更新react dev-tools
,但组件不会重新呈现更新的列表。我究竟做错了什么?
import Accordion from "@components/common/Accordion"
import Alias from "./value-form/Alias"
const ValueItem = props => {
const { value } = props
/** EXAMPLE VALUE
"id": 1,
"name": "Primary Descriptor",
"programmaticName": "Primary_Descriptor",
"fileTypeDetailId": 9,
"fileType": "File Type no. 9",
"standardValue": "Outgoing",
"isActive": true,
"aliases": ["Alias 1", "Alias 2", "Alias 3"]
*/
const dispatch = useDispatch()
const [formValue, setFormValue] = useState(value)
const [formAliases, setFormAliases ] = useState(value.aliases)
const addAlias = () => {
const updatedFormValue = formValue;
updatedFormValue.aliases.push("");
setFormValue(updatedFormValue)
setFormAliases(updatedFormValue.aliases)
}
return (
<Accordion
key={value.id}
title={value.name} />
}
>
<div className={styles.valueFormContainer}>
{formAliases.map((alias) => {
return ({alias})
}
)}
<Button handleChange={() => { addAlias()}} buttonLabel="+ Add Alias" buttonTypes={["orange"]} />
</div>
</Accordion>)
}
export default ValueItem
解决方案
你的问题就在这里
const addAlias = () => {
const updatedFormValue = formValue;
updatedFormValue.aliases.push("");
setFormValue(updatedFormValue)
setFormAliases(updatedFormValue.aliases)
}
你正在改变存在状态。
https://reactjs.org/docs/hooks-state.html
在你的情况下,我会使用
setFormValue(prevState=>[...prevState,aliases:[...prevState.aliases,""])
推荐阅读
- kubernetes - 如何将现有的 git 项目导入具有多个微服务的 Jenkins X?
- direct3d - Direct3D 功能级别是否保证对体积纹理的非 2 次幂支持?
- sed - 在同一表达式侧使用 sed 参数 \1、\2
- c# - 用字典或列表作为值读取 Json 文件 C#
- php - ZipArchive::extractTo 不起作用并且不返回任何内容
- javascript - 开玩笑等到调用 typemoq 函数
- c# - 如何反转打印出的数字
- c# - 具有默认实现的接口和抽象类之间有什么区别?
- r - 将 R 日期值从字符类转换为日期类
- xcode - 查找故事板布局及其相关代码实现的简单方法?