You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

向React全局状态添加项目不生效,如何用Context API实现并渲染传参?

基于React Context API实现全局状态新增项目与列表渲染方案

1. Context与全局状态定义

首先封装Context层,全局状态和操作方法统一在Provider中维护,注意更新数组时必须返回新引用,不能直接修改原数组,这是新增项目不生效的核心原因。

// BoxContext.js
import { createContext, useContext, useState } from 'react';

const BoxContext = createContext();

export function BoxProvider({ children }) {
  // 全局存储项目列表,每个项目自带唯一id
  const [boxList, setBoxList] = useState([
    { id: 1, content: '默认项目1' },
    { id: 2, content: '默认项目2' }
  ]);

  // 新增项目方法
  const addBoxItem = (newItemContent) => {
    const newItem = {
      // 简单场景用时间戳生成唯一id,复杂场景建议引入uuid库
      id: Date.now(),
      content: newItemContent
    };
    // 必须生成新数组更新状态,禁止直接push原数组后set值
    setBoxList(prev => [...prev, newItem]);
  };

  return (
    <BoxContext.Provider value={{ boxList, addBoxItem }}>
      {children}
    </BoxContext.Provider>
  );
}

// 封装自定义hook简化调用
export function useBoxContext() {
  return useContext(BoxContext);
}

2. 全局注入Provider

在项目入口文件用Provider包裹根组件,保证所有子组件都能访问到全局状态。

// index.js
import React from 'react';
import ReactDOM from 'react-dom/client';
import App from './App';
import { BoxProvider } from './BoxContext';

const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(
  <BoxProvider>
    <App />
  </BoxProvider>
);

3. 新增项目功能实现

任意业务组件都可以调用Context中的addBoxItem方法完成全局新增。

// AddBox.jsx
import { useBoxContext } from './BoxContext';

export default function AddBox() {
  const { addBoxItem } = useBoxContext();
  return <button onClick={() => addBoxItem('新增的项目内容')}>添加项目</button>;
}

4. map渲染列表并传入id参数

直接读取全局的boxList数组遍历渲染,绑定唯一id作为key,同时将id传递给子项组件。

// BoxContainer.jsx
import { useBoxContext } from './BoxContext';
import BoxItem from './BoxItem';

export default function BoxContainer() {
  const { boxList } = useBoxContext();
  return (
    <div className="box-list">
      {boxList.map(item => (
        <BoxItem 
          key={item.id}
          id={item.id}
          content={item.content}
        />
      ))}
    </div>
  );
}

// BoxItem.jsx 接收id参数
export default function BoxItem({ id, content }) {
  return <div>项目ID:{id},内容:{content}</div>;
}

注意:如果更新状态时直接修改原数组(比如boxList.push(newItem)后调用setBoxList(boxList)),React无法检测到数组引用变化,不会触发组件重渲染,就会出现新增项目不生效的问题。

内容的提问来源于stack exchange,提问作者Richardson

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 16:06:04