更新 "UseContext array" 失败 re-render/generate 新组件
Update a "UseContext array" fail to re-render/generate a new component
使用上下文存储数组并尝试array.map生成组件列表,但UI没有重新渲染以显示所有组件。
节目背景:
我有一个包含数组的上下文,UI 将有一个“添加”按钮。
我的目标:
- 当用户按下“添加”时
- 上下文中的数组将被推入其中的新值
- UI 将重新渲染并生成一个新组件
我的问题:
我尝试使用 useState 来存储数组,这完全没问题,因为一旦我使用 setArray 更新列表,它将触发重新渲染并显示一个新组件。
但是,当我尝试使用 useContext 时,页面不会重新呈现。
- 我还应该使用 useState 来实现我的目标吗? (然后我必须管理 2 个变量,它们是上下文和状态,我认为这是处理它的虚拟方法。)
- 还有其他方法可以实现我的目标吗?
这是沙盒演示:
https://codesandbox.io/s/falling-field-ur748?file=/src/App2.js
订阅上下文的组件只有在上下文提供的value
发生变化时才会重新渲染。
将值推送到列表在这里不起作用,因为 list
数组的引用在您推送时不会改变。所以在这种情况下你应该使用状态和上下文的组合。
在状态中维护列表并将其与状态更新器setList
作为值传递给提供者。
const [ list , setList ] = React.useState([121, 123])
return (
<UserContext.Provider value={[list, setList]}>
<App2 />
</UserContext.Provider>
);
现在从订阅上下文的组件更新状态。
export default function App2() {
const [list, setList] = useContext(UserContext);
const buttonOnClick = () => {
setList(prevList => [...prevList, 321])
};
return (
<>
<button onClick={buttonOnClick}>Add</button>
{list.map((item) => (
<p>{item}</p>
))}
</>
);
}
使用上下文存储数组并尝试array.map生成组件列表,但UI没有重新渲染以显示所有组件。
节目背景:
我有一个包含数组的上下文,UI 将有一个“添加”按钮。
我的目标:
- 当用户按下“添加”时
- 上下文中的数组将被推入其中的新值
- UI 将重新渲染并生成一个新组件
我的问题:
我尝试使用 useState 来存储数组,这完全没问题,因为一旦我使用 setArray 更新列表,它将触发重新渲染并显示一个新组件。
但是,当我尝试使用 useContext 时,页面不会重新呈现。
- 我还应该使用 useState 来实现我的目标吗? (然后我必须管理 2 个变量,它们是上下文和状态,我认为这是处理它的虚拟方法。)
- 还有其他方法可以实现我的目标吗?
这是沙盒演示: https://codesandbox.io/s/falling-field-ur748?file=/src/App2.js
订阅上下文的组件只有在上下文提供的value
发生变化时才会重新渲染。
将值推送到列表在这里不起作用,因为 list
数组的引用在您推送时不会改变。所以在这种情况下你应该使用状态和上下文的组合。
在状态中维护列表并将其与状态更新器setList
作为值传递给提供者。
const [ list , setList ] = React.useState([121, 123])
return (
<UserContext.Provider value={[list, setList]}>
<App2 />
</UserContext.Provider>
);
现在从订阅上下文的组件更新状态。
export default function App2() {
const [list, setList] = useContext(UserContext);
const buttonOnClick = () => {
setList(prevList => [...prevList, 321])
};
return (
<>
<button onClick={buttonOnClick}>Add</button>
{list.map((item) => (
<p>{item}</p>
))}
</>
);
}