【发布时间】:2021-08-11 21:23:18
【问题描述】:
我正在我的应用程序中创建一个带有布尔值isDark 的上下文。布尔值isDark 是用useState 创建的,我提供了这个布尔值和一个将布尔值更改为ThemeContext 的函数,以便在组件树的下方访问它。
在下面,我正在创建 ThemeContext,布尔值初始化为 false 和一个在控制台中警告正在使用初始值的函数:
//ThemeContext.tsx
export type ContextType = {
isDark: boolean
toggleTheme: () => void
}
const ThemeContext = createContext<ContextType>({
isDark: false,
toggleTheme: () => console.warn('Still using initial value'),
})
export const useTheme = () => useContext(ThemeContext)
export default ThemeContext
这里我提供了主题和通过toggleTheme 函数更改它的功能:
//CustomThemeProvider.tsx
export const CustomThemeProvider: React.FC = ({ children }) => {
const [isDark, setDark] = useState(false)
const toggleTheme = () => {
console.log('Change theme')
setDark(!isDark)
}
const providerTheme = useMemo(
() => ({ isDark, toggleTheme }),
[isDark, toggleTheme],
)
return (
<ThemeProvider theme={isDark ? darkTheme : lightTheme}>
<ThemeContext.Provider value={providerTheme}>
{children}
</ThemeContext.Provider>
</ThemeProvider>
)
}
我现在想访问布尔值和 toggleTheme 函数,并通过我在开始时创建的自定义挂钩 (useTheme) 来实现,它只使用 useContext:
//App.tsx
export default function App() {
const { isDark, toggleTheme } = useTheme()
return (
<CustomThemeProvider>
<Box flex={1} justifyContent="center">
<Paper title="Test Title">
<Switch onValueChange={toggleTheme} value={isDark} />
</Box>
</CustomThemeProvider>
)
}
当我现在尝试使用 Switch 组件 (React Native) 切换主题时,我收到控制台警告说我的初始函数正在被调用。这意味着我的toggleTheme 函数仍然是初始函数() => console.warn('Still using initial value'),即使我提供了一个新函数,它应该用我的ThemeContext.Provider 更改isDark 布尔值。
为什么我的初始函数仍然被 Switch 调用,而不是我提供的函数来更改主题?
【问题讨论】:
标签: react-native react-hooks use-context