React
Provider 传入 value,消费者通过 useContext 读取。
在线预览
Consumer A
小明
当前角色:访客
组件关系与数据流
StateComponentContext
差异焦点Provider 的 value 引用变化会推动 Context 消费者重新渲染。
实线表示依赖、数据或命令传递,虚线表示事件、回调或清理路径。
flowchart TB
accTitle: React Context Provider 更新机制
accDescr: ReactDemo 每次渲染创建 Provider value 对象,value 身份变化后 useContext 消费者重新渲染,UserActions 通过 setUser 更新源状态。
user(["user state"]) --> render{{"ReactDemo render 创建 value"}}
render --> context[("UserContext.Provider value")]
context --> profile["UserProfile useContext"]
context --> actions["UserActions useContext"]
actions -.->|"setUser"| user
class user state
class profile,actions component
class render process
class context resource
classDef state fill:#ffffff,stroke:#149eca,color:#172033,stroke-width:1.2px
classDef component fill:#e5f6fb,stroke:#149eca,color:#172033,stroke-width:2px,font-weight:600
classDef process fill:#f4fbfd,stroke:#149eca,color:#172033,stroke-width:1.6px
classDef resource fill:#f3f5f8,stroke:#778195,color:#172033,stroke-width:1.4pxProvider value 身份随 render 更新,useContext 消费者接收新的上下文值。
实际运行源码
import { createContext, useContext, useState } from "react";
type User = { name: string; role: "访客" | "管理员";};
type UserContextValue = { user: User; setName: (name: string) => void; toggleRole: () => void;};
const UserContext = createContext<UserContextValue | null>(null);
function useUser() { const context = useContext(UserContext); if (!context) throw new Error("Missing UserProvider"); return context;}
function UserProfile() { const { user } = useUser(); return ( <div className="demo-card"> <span className="demo-tag">Consumer A</span> <h2>{user.name}</h2> <p>当前角色:{user.role}</p> </div> );}
function UserActions() { const { user, setName, toggleRole } = useUser(); return ( <div className="demo-form"> <label className="demo-field"> Consumer B 修改用户名 <input className="demo-input" value={user.name} onChange={(event) => setName(event.target.value)} /> </label> <div className="demo-actions"> <button className="demo-button" type="button" onClick={toggleRole}> 切换角色 </button> </div> </div> );}
export function ReactDemo() { const [user, setUser] = useState<User>({ name: "小明", role: "访客" });
const value: UserContextValue = { user, setName: (name) => setUser((current) => ({ ...current, name: name || "小明" })), toggleRole: () => setUser((current) => ({ ...current, role: current.role === "访客" ? "管理员" : "访客", })), };
return ( <UserContext.Provider value={value}> <div className="demo-stack"> <UserProfile /> <UserActions /> </div> </UserContext.Provider> );}