在对象内的数组将项目推送到它之后,React 组件不会重新呈现
React component not rerendering after array inside object has items pushed to it
我有一个上下文对象,其中一个对象包含应用程序特定部分所需的所有信息。该对象包含一些数组。
数据
{
groupname: 'a',
members: {
regular: [
{ id: 1, name: 'x' },
{ id: 2, name: 'y' },
],
premium: []
}
}
我有一个可以创建新成员的表单。创建成员后,我在挂钩中有一个函数,我在其中调用 addMember 函数来添加这个新创建的成员。
function useGroup({ initialGroup: GroupType }: Props) {
const [group, setGroup] = useState<GroupType>(initialGroup)
const addMember = (member) => {
group.members.regular = [...group.members.regular, member]
setGroup(group)
}
return {
group,
addMember
}
}
我可以使用控制台日志并看到它有效地工作,但是这并没有反映在我的 UI 中。当我刷新页面时,我可以看到这些项目。这告诉我当我将额外的项目推入我的状态对象时 UI 不是 'refreshing'。
我感觉好像这是因为它是对象内部的嵌套数组。我应该将成员拆分到自己的 'useState' 数组中,还是我缺少一些东西来让我的 UI 反映这个被添加?
您正在直接更改状态变量。
试试下面的方法。
function useGroup({ initialGroup: GroupType }: Props) {
const [group, setGroup] = useState<GroupType>(initialGroup)
const addMember = (member) => {
setGroup(state => {
const _state = {...state};
_state.members.regular.push(member);
return _state;
});
}
return {
group,
addMember
}
}
更新:
您还可以使用 useCallback
来防止 addMember
函数被创建。
const addMember = useCallback((member) => {
setGroup(state => {
const _state = {...state};
_state.members.regular.push(member);
return _state;
});
}, []);
您实际上错误地更改了状态变量。
您可以尝试修改addMember函数如下:
const addMember = (member) => {
setGroup({...group,members:{
regular: [...group.members.regular, member]
}})
}
编辑:在 onClick 上(作为示例)您必须执行该函数,而不是调用它才能工作。
例如:<button onClick={addMember({...})}>Example</button>
.
不是 <button onClick={() => addMember({...})}>Example</button>
我有一个上下文对象,其中一个对象包含应用程序特定部分所需的所有信息。该对象包含一些数组。
数据
{
groupname: 'a',
members: {
regular: [
{ id: 1, name: 'x' },
{ id: 2, name: 'y' },
],
premium: []
}
}
我有一个可以创建新成员的表单。创建成员后,我在挂钩中有一个函数,我在其中调用 addMember 函数来添加这个新创建的成员。
function useGroup({ initialGroup: GroupType }: Props) {
const [group, setGroup] = useState<GroupType>(initialGroup)
const addMember = (member) => {
group.members.regular = [...group.members.regular, member]
setGroup(group)
}
return {
group,
addMember
}
}
我可以使用控制台日志并看到它有效地工作,但是这并没有反映在我的 UI 中。当我刷新页面时,我可以看到这些项目。这告诉我当我将额外的项目推入我的状态对象时 UI 不是 'refreshing'。
我感觉好像这是因为它是对象内部的嵌套数组。我应该将成员拆分到自己的 'useState' 数组中,还是我缺少一些东西来让我的 UI 反映这个被添加?
您正在直接更改状态变量。
试试下面的方法。
function useGroup({ initialGroup: GroupType }: Props) {
const [group, setGroup] = useState<GroupType>(initialGroup)
const addMember = (member) => {
setGroup(state => {
const _state = {...state};
_state.members.regular.push(member);
return _state;
});
}
return {
group,
addMember
}
}
更新:
您还可以使用 useCallback
来防止 addMember
函数被创建。
const addMember = useCallback((member) => {
setGroup(state => {
const _state = {...state};
_state.members.regular.push(member);
return _state;
});
}, []);
您实际上错误地更改了状态变量。
您可以尝试修改addMember函数如下:
const addMember = (member) => {
setGroup({...group,members:{
regular: [...group.members.regular, member]
}})
}
编辑:在 onClick 上(作为示例)您必须执行该函数,而不是调用它才能工作。
例如:<button onClick={addMember({...})}>Example</button>
.
不是 <button onClick={() => addMember({...})}>Example</button>