reactjs - 更新 "UseContext array"无法重新渲染/生成新组件

标签 reactjs react-hooks react-context

使用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

最佳答案

只有当上下文提供的发生变化时,订阅上下文的组件才会重新渲染。

将值推送到列表在这里不起作用,因为 list 数组的引用在您推送时不会改变。因此,在这种情况下,您应该结合使用状态和上下文。

在状态中维护列表,并将其与状态更新程序 setList 一起作为值传递给 Provider。

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>
      ))}
    </>
  );
}

关于reactjs - 更新 "UseContext array"无法重新渲染/生成新组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67802139/

相关文章:

javascript - 将 React Context API 类转换为 Hook 的函数

reactjs - react 从类到功能组件的调用。错误: Invalid hook call. Hooks只能在函数组件的主体内部调用

javascript - 为什么 useReducer 的调度会导致重新渲染?

reactjs - 从消费者 componentDidMount 更新 react 上下文会导致无限重新渲染

javascript - 没有无限的while循环,还有其他方法可以实现 “listening”函数吗?

javascript - 与 useEffect 一起使用时,自定义钩子(Hook)会被无限调用

javascript - 使用 Context API 在非嵌套组件之间传递变量

javascript - TypeScript 正在使用不同版本的@types 进行 react

javascript - react hook useState不能存储json或string

javascript - 如何使用 React 在单击时切换类?