以下是一个使用 React Context 封装组件传参的示例代码
import React, { createContext, useContext, useState } from 'react';
// 创建一个 Context 对象
const ThemeContext = createContext();
// 创建一个 Provider 组件,用于提供 Context 的值
const ThemeProvider = ({ children }) => {
const [theme, setTheme] = useState('light');
const toggleTheme = () => {
setTheme(theme === 'light' ? 'dark' : 'light');
};
return (
<ThemeContext.Provider value={{ theme, toggleTheme }}>
{children}
</ThemeContext.Provider>
);
};
// 创建一个自定义 hooks,用于获取 Context 的值
const useTheme = () => {
const context = useContext(ThemeContext);
if (!context) {
throw new Error('useTheme must be used within a ThemeProvider');
}
return context;
};
// 使用示例
const App = () => {
const { theme, toggleTheme } = useTheme();
return (
<div className={theme}>
<h1>My App</h1>
<button onClick={toggleTheme}>Toggle Theme</button>
</div>
);
};
// 在根组件中使用 ThemeProvider 包裹整个应用
const Root = () => {
return (
<ThemeProvider>
<App />
</ThemeProvider>
);
};
export default Root;
在上面的代码中,我们创建了一个名为 ThemeContext
的 Context 对象,并使用 createContext
函数进行创建。然后,我们创建了一个名为 ThemeProvider
的 Provider 组件,用于提供 ThemeContext
的值。在 ThemeProvider
组件中,我们使用 useState
hooks 来管理主题的状态,并提供了一个 toggleTheme
函数,用于切换主题。最后,我们使用 ThemeContext.Provider
组件将 theme
和 toggleTheme
作为 Context 的值传递给子组件。
在 useTheme
自定义 hooks 中,我们使用 useContext
hooks 来获取 ThemeContext
的值,并返回 theme
和 toggleTheme
。如果在 useTheme
hooks 中没有找到 ThemeContext
,则会抛出一个错误。
在 App
组件中,我们使用 useTheme
自定义 hooks 来获取 theme
和 toggleTheme
,并将 theme
作为 className
属性的值,以便在 CSS 中使用。最后,我们在 button
元素上绑定 toggleTheme
函数,以便在点击按钮时切换主题。
最后,在根组件中,我们使用 ThemeProvider
包裹整个应用,以便在整个应用中使用 ThemeContext
的值。