React - 如何在上下文中获取钩子的值
React - How to get the value of the hooks inside the context
我有一个 LessonThemes 组件。我使用钩子,然后使用 context 在 Test 组件中应用逻辑,问题是我不明白如何获取color
值并将其应用到 context 中。 export const CounterContext = createContext ([ ]);
我需要在 CounterContext
中应用值 color
LessonThemes.jsx
import React, {useState, useEffect, createContext} from "react";
import ThemeContext from "./ThemeContext";
export default function LessonThemes(props) {
const [color, setColor] = useState(localStorage.getItem("color"));
const [themes, setThemes] = useState([
{ name: "G", color: "green" },
{ name: "R", color: "red" },
{ name: "B", color: "blue" },
])
useEffect(() => {
localStorage.setItem("color", color);
})
const SideBarPageContent = (SideBarPageContentBackground) => {
localStorage.setItem('color', SideBarPageContentBackground);
setColor(SideBarPageContentBackground);
}
return (
<CounterContext.Provider value={[color, setColor]}>
{
themes.map((theme, index) => {
return (
<label key={index}>
<input
onChange={() => SideBarPageContent(theme.color)}
type="radio"
name="background"
/>{theme.name}</label>
);
})
}
</CounterContext.Provider>
);
}
export const CounterContext = createContext([]);
Lesson.js
import React, { useContext } from "react";
import "./css/Sidebar.css";
export default function Test(props) {
const [color] = useContext(CounterContext);
return (
<div className="page-wrapper chiller-theme toggled">
<LessonThemes />
<div style={{background: color}}>
<i className="fas fa-bars"></i>
</div>
</div>
);
}
你这样做的方式似乎没有任何问题,但不清楚你需要如何消费 Context.Provider
。
我假设您已经制作了一个功能最少的示例,因为从您的示例代码来看,不需要 Context
首先出现,因为您没有渲染任何上下文提供程序“下”的组件。
这就是您从嵌套组件中使用它的方式。即:<YourContext.Provider/>
.
下的组件
const CounterContext = React.createContext([]);
function LessonThemes(props) {
const [color, setColor] = React.useState("initialColor");
const [themes, setThemes] = React.useState([
{ name: "G", color: "green" },
{ name: "R", color: "red" },
{ name: "B", color: "blue" },
])
const inputItems = themes.map((theme,index) => (
<React.Fragment>
<label key={index}>
<input
onChange={() => setColor(theme.color)}
type="radio"
name="background"
/>
{theme.name}
</label>
</React.Fragment>
));
return (
<CounterContext.Provider value={[color, setColor]}>
{inputItems}
<NestedComponent/>
</CounterContext.Provider>
);
}
// NESTED COMPONENT THAT WILL CONSUME THE CONTEXT
function NestedComponent() {
const [color,setColor] = React.useContext(CounterContext);
return(
<div>
<div>I am NestedComponent</div>
<div><b>color:</b>{color}</div>
</div>
);
}
ReactDOM.render(<LessonThemes/>, document.getElementById("root"));
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.8.3/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.8.3/umd/react-dom.production.min.js"></script>
<div id="root"/>
我有一个 LessonThemes 组件。我使用钩子,然后使用 context 在 Test 组件中应用逻辑,问题是我不明白如何获取color
值并将其应用到 context 中。 export const CounterContext = createContext ([ ]);
我需要在 CounterContext
color
LessonThemes.jsx
import React, {useState, useEffect, createContext} from "react";
import ThemeContext from "./ThemeContext";
export default function LessonThemes(props) {
const [color, setColor] = useState(localStorage.getItem("color"));
const [themes, setThemes] = useState([
{ name: "G", color: "green" },
{ name: "R", color: "red" },
{ name: "B", color: "blue" },
])
useEffect(() => {
localStorage.setItem("color", color);
})
const SideBarPageContent = (SideBarPageContentBackground) => {
localStorage.setItem('color', SideBarPageContentBackground);
setColor(SideBarPageContentBackground);
}
return (
<CounterContext.Provider value={[color, setColor]}>
{
themes.map((theme, index) => {
return (
<label key={index}>
<input
onChange={() => SideBarPageContent(theme.color)}
type="radio"
name="background"
/>{theme.name}</label>
);
})
}
</CounterContext.Provider>
);
}
export const CounterContext = createContext([]);
Lesson.js
import React, { useContext } from "react";
import "./css/Sidebar.css";
export default function Test(props) {
const [color] = useContext(CounterContext);
return (
<div className="page-wrapper chiller-theme toggled">
<LessonThemes />
<div style={{background: color}}>
<i className="fas fa-bars"></i>
</div>
</div>
);
}
你这样做的方式似乎没有任何问题,但不清楚你需要如何消费 Context.Provider
。
我假设您已经制作了一个功能最少的示例,因为从您的示例代码来看,不需要 Context
首先出现,因为您没有渲染任何上下文提供程序“下”的组件。
这就是您从嵌套组件中使用它的方式。即:<YourContext.Provider/>
.
const CounterContext = React.createContext([]);
function LessonThemes(props) {
const [color, setColor] = React.useState("initialColor");
const [themes, setThemes] = React.useState([
{ name: "G", color: "green" },
{ name: "R", color: "red" },
{ name: "B", color: "blue" },
])
const inputItems = themes.map((theme,index) => (
<React.Fragment>
<label key={index}>
<input
onChange={() => setColor(theme.color)}
type="radio"
name="background"
/>
{theme.name}
</label>
</React.Fragment>
));
return (
<CounterContext.Provider value={[color, setColor]}>
{inputItems}
<NestedComponent/>
</CounterContext.Provider>
);
}
// NESTED COMPONENT THAT WILL CONSUME THE CONTEXT
function NestedComponent() {
const [color,setColor] = React.useContext(CounterContext);
return(
<div>
<div>I am NestedComponent</div>
<div><b>color:</b>{color}</div>
</div>
);
}
ReactDOM.render(<LessonThemes/>, document.getElementById("root"));
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.8.3/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.8.3/umd/react-dom.production.min.js"></script>
<div id="root"/>