【发布时间】:2021-03-02 13:44:13
【问题描述】:
当我的父组件中有新的更新时,发生在 function updateItemValue() 中,items 状态只会在父组件中更新。子组件不会在实例中更新。仅当updateItemValue() 被触发两次时才会更新。
有点像:
- 第一轮,家长更新项目,孩子没有收到更新。
- 第二轮,家长更新项目,孩子只收到第一轮的更新
父组件
const SelectItem = () => {
const { items } = useSelector(state => state.itemsReducer);
const [ itemUpdate, setItemUpdate ] = useState(false);
const [ group_id, setGroupId ] = useState(false);
useEffect(() => {
updateItemValue()
}, [itemUpdate])
function updateItemValue(){
// original items value
/*
[
{"_id":1, "name":"Item 1", "description":"Item 1 description"},
{"_id":2, "name":"Item 2", "description":"Item 2 description"},
{"_id":3, "name":"Item 3", "description":"Item 3 description"}
]
*/
// step 3 : now this function get called because the group_id is updated
items.forEach((item, i) => {
if (group_id == item.group_id) {
// step 4 : update the value of items state, add extra data, once this updated, I expect the new items value to be passed to child component
items[i].extra = true;
}
});
}
// step 2 : update the group_id and set the itemUpdate to true to trigger useEffect
function selectGroup(group_id){
setItemUpdate(true)
setGroupId(group_id)
}
return(
<div>
{/* step 1: select option */}
<button onClick={() => selectGroup(1)}>Option 1</button>
<button onClick={() => selectGroup(2)}>Option 2</button>
{
items.map((item) => (
<ItemCard
key={item._id}
id={item._id}
name={item.name}
description={item.description}
onClick={(value) => updateSelectedItem(value)}
/>
))
}
</div>
)
}
子组件
export default function ItemCard({id, name, description, onClick, extra}){
console.log(extra) // the value is undefined when selectGroup() 1st triggered from parent
return (
<div onClick={() => onClick(id)}>
<div>
<p>{name}</p>
<p>{description}</p>
{ extra ? '<p>Extra item is required</p>' : null }
</div>
</div>
)
}
p/s : 状态 items 来自 redux 状态。所以updateItemValue() 的状态更新是添加一些我想在子组件中使用的额外值。
【问题讨论】:
-
您能否更新问题以包含更多Minimal, Complete, and Reproducible 组件代码示例? “子组件”不是有效的反应组件。我们是否假设“子组件”是
ItemCard?itemUpdate是什么?updateSelectedItem在哪里定义?什么叫updateItemValue? -
我已经更新了我的代码。
-
我不知道
items是什么,但是您正在对其进行变异,因此父组件可能会看到相同的对象引用,因此不知道要重新渲染。你能分享一下items是什么,在哪里定义的吗? -
@DrewReese 对此感到抱歉。我忘了包括它。请再次检查最新更新。谢谢!
标签: reactjs react-redux state