# 用useContext封装主题
// index.js
import React from 'react';
import FunctionContextComponent from './FunctionContextComponent.js';
import {ThemeProvider} from './ThemeContext';
export default function App() {
return (
<>
<ThemeProvider>
<FunctionContextComponent></FunctionContextComponent>
</ThemeProvider>
</>
);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
//ThemeContext.jsx
import React, { useState, useContext } from 'react';
const themeContext = React.createContext();
const ThemeUpdateContext = React.createContext();
export function useTheme() {
return useContext(themeContext)
}
export function useThemeUpdate() {
return useContext(ThemeUpdateContext)
}
export function ThemeProvider({children}) {
const [darkTheme, setDarkTheme] = useState(true);
function toggleTheme() {
setDarkTheme(preDarkTheme => !preDarkTheme)
}
return (
<themeContext.Provider value={darkTheme}>
<ThemeUpdateContext.Provider value={toggleTheme}>
{children}
</ThemeUpdateContext.Provider>
</themeContext.Provider>
)
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
// FunctionContextComponent.js
import React, {useContext} from 'react';
import { themeStyles } from './utils.js';
import { useTheme, useThemeUpdate } from './ThemeContext';
export default function FunctionContextComponent() {
const darkTheme = useTheme();
const toggleTheme = useThemeUpdate();
return (
<>
<button onClick={toggleTheme} >toggle theme</button>
<div style={themeStyles(darkTheme)}>funtion theme</div>
</>
)
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16