更新“UseContext 数组”无法重新渲染/生成新组件

时间:2021-06-02 09:08:00

标签: reactjs react-hooks react-context

使用上下文存储数组并尝试通过 array.map 生成组件列表,但 UI 没有重新渲染以显示所有组件。

项目背景:

我有一个包含数组的上下文,UI 将有一个“添加”按钮。

我的目标:

  1. 当用户按下“添加”时
  2. 上下文中的数组将被推入一个新值
  3. UI 将重新渲染并生成一个新组件

我的问题:

我尝试使用 useState 来存储数组,这完全没问题,因为一旦我使用 setArray 更新列表,就会触发重新渲染并显示一个新组件。

但是,当我尝试使用 useContext 时,页面不会被重新渲染。

  1. 我还应该使用 useState 来实现我的目标吗? (然后我必须管理 2 个变量,即上下文和状态,我认为这是一种处理它的虚拟方式。)
  2. 还有其他方法可以实现我的目标吗?

这是沙盒演示: https://codesandbox.io/s/falling-field-ur748?file=/src/App2.js

1 个答案:

答案 0 :(得分:1)

订阅上下文的组件只有在上下文提供的 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>
      ))}
    </>
  );
}