在 React 中,并没有内置的 inject
API(这是 Vue 中的概念),但 React 中有类似的跨层级组件通信方案,主要通过以下方式实现类似 provide/inject
的功能:
React 的 Context
机制是实现跨层级数据传递的官方方案,相当于 Vue 中的 provide/inject
:
provide
,提供数据inject
,消费数据示例代码:
// 1. 创建 Context(相当于定义注入的"键")
const ThemeContext = React.createContext();
// 2. 顶层组件提供数据(类似 provide)
function App() {
const theme = {
color: "blue",
size: "16px"
};
return (
<ThemeContext.Provider value={theme}>
<ParentComponent />
</ThemeContext.Provider>
);
}
// 3. 深层子组件获取数据(类似 inject)
function DeepChild() {
// 通过 useContext 注入数据
const theme = React.useContext(ThemeContext);
return (
<div style={{ color: theme.color, fontSize: theme.size }}>
我是深层子组件
</div>
);
}
// 中间组件无需传递 props
function ParentComponent() {
return <DeepChild />;
}
对于复杂应用,可通过状态管理库实现全局数据注入:
provide
)inject
)Redux 示例:
// 1. 定义并提供全局状态
import { Provider, useSelector } from 'react-redux';
import store from './store';
function App() {
return (
<Provider store={store}>
<DeepChild />
</Provider>
);
}
// 2. 深层组件获取数据
function DeepChild() {
// 类似 inject 获取全局状态
const user = useSelector(state => state.user);
return <div>{user.name}</div>;
}
可以封装类似 Vue inject
的 API:
// 封装工具
const { Provider, useContext } = React.createContext();
export function provide(value) {
return <Provider value={value} />;
}
export function inject() {
return useContext(Provider);
}
// 使用
function App() {
return (
{provide({ appName: "My App" })}
<DeepChild />
</Provider>
);
}
function DeepChild() {
const config = inject();
return <div>{config.appName}</div>;
}
Context
provide
提供任意键值useState
/useReducer
provide/inject
可直接传递响应式对象React 中最推荐的"注入"方案是 Context + useContext,它能满足大多数跨层级通信需求,且是官方原生支持的方案。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。