useState 不强制重新渲染反应组件
useState not forcing re-render of react component
我有一个组件,它的道具 value
是一个对象,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,""])
您不能将新项目推送到数组以更新状态。您的 push
将直接改变状态,这可能会导致代码容易出错。如果您想将项目推送到状态数组,您可以使用 destructuring-assignment
制作状态的浅表副本,推送到它并最终使用复制的数组更新状态:
const addAlias = () => {
const updatedFormValue = formValue;
let copy = [...updatedFormValue.aliases];
copy.push("");
setFormValue(updatedFormValue);
setFormAliases(copy);
}
我有一个组件,它的道具 value
是一个对象,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,""])
您不能将新项目推送到数组以更新状态。您的 push
将直接改变状态,这可能会导致代码容易出错。如果您想将项目推送到状态数组,您可以使用 destructuring-assignment
制作状态的浅表副本,推送到它并最终使用复制的数组更新状态:
const addAlias = () => {
const updatedFormValue = formValue;
let copy = [...updatedFormValue.aliases];
copy.push("");
setFormValue(updatedFormValue);
setFormAliases(copy);
}