useContext의 어두운 면
useState: 참 또는 거짓
React에서 다크 모드 토글을 추가하는 것은 페이지에 적용되는 CSS 스타일을 제어하는 데 사용할 상태 변수를 만드는 것만큼 간단합니다. React의 useState 후크에 익숙하지 않은 경우 문서here를 확인하십시오. 이 첫 번째 방법에서는 부울 값을 상태 변수로 사용합니다.
// ./src/components/App
import React, { useState } from 'react'
import ChildComponent from './ChildComponent'
const App = () => {
// Create state variable for dark mode with a default value
// of false
const [darkMode, setDarkMode] = useState(false)
// Write callback function for the toggle button;
// can also be written inline as
// () => setDarkMode(darkMode => !darkMode)
function changeMode() {
setDarkMode(darkMode => !darkMode)
}
return (
// Use ternaries to dynamically update the div className
// and button text
<div className={darkMode ? "App Dark" : "App"}>
<header>
<h2>My App</h2>
<button onClick={changeMode}>
{darkMode ? "Light Mode" : "Dark Mode"}
</button>
</header>
// Pass down state variable through props for children to use
<ChildComponent darkMode={darkMode} />
</div>
);
}
export default App;
이 방법은 단일 버튼이나 체크박스를 사용하여 두 모드 사이를 전환하려는 경우에 가장 적합합니다. 그러나 사용자가 선택할 수 있는 두 개 이상의 테마를 제공하려는 경우 부울 값으로는 충분하지 않습니다.
문자열 변수가 있는 useState
// ./src/components/App
import React, { useState } from 'react'
import ChildComponent from './ChildComponent'
const App = () => {
// Create state with a default value of "App",
// the default option of your dropdown below
const [theme, setTheme] = useState("App")
// Write callback function for dropdown to update state
function handleThemeChange(e) {
setTheme(e.target.value)
}
return (
<div className={theme}>
<header>
<h2>My App</h2>
<select name="theme" onChange={handleThemeChange}>
// Option values equal CSS classes (.App.Dark, etc)
<option value="App">Select Theme</option>
<option value="App Dark">Dark Mode</option>
<option value="App Blue">Ocean</option>
<option value="App Purple">Galaxy</option>
</select>
</header>
// Pass down state value through props
<ChildComponent theme={theme} />
</div>
);
}
export default App;
상태 변수를 문자열로 설정하면 모드가 2개이든 20개이든 관계없이 작동하므로 원하는 경우 나중에 더 많은 테마를 추가할 수 있는 유연성을 제공합니다.
이러한 방법은 스타일이 App 수준에서만 처리될 수 있을 만큼 간단하거나 추가 하위 구성 요소 한두 개에서 처리될 수 있는 경우 잘 작동합니다. 다른 CSS 스타일이 필요한 많은 요소가 포함된 보다 광범위한 구성 요소 계층 구조로 작업하는 경우에는 어떻게 해야 합니까? 물론 props를 사용하여 구성 요소 세대를 통해 상태 변수를 전달할 수 있지만 지루하고 지저분해질 수 있습니다. 다른 React hook에 대해 알아보자!
useContext 후크를 사용하여 앱에 다크 모드 추가
React에서 context을 사용하는 것은 많은 구성 요소가 동일한 데이터에 액세스해야 하는 상황에 가장 적합합니다. 전체 앱의 모양을 제어하는 상태 변수와 같은 데이터는 무엇입니까? 생성하려는 컨텍스트에 대한 새 JS 파일을 생성한 다음 상태 변수를 이 파일로 이동하는 것으로 시작합니다.
// ./src/context/theme
import React, { useState } from "react";
// Create a new Context object with... React.createContext()
const ThemeContext = React.createContext();
// Create your Provider component, and set its value to an
// object containing everything to be passed down to consumers
function ThemeProvider({ children }) {
// The state you created before now lives here
const [theme, setTheme] = useState("App");
return (
<ThemeContext.Provider value={{ theme, setTheme }}>
{children}
</ThemeContext.Provider>
)}
export { ThemeContext, ThemeProvider }
그런 다음 공급자와 함께 새 컨텍스트를 사용해야 하는 모든 구성 요소를 래핑해야 합니다. 이 경우 index.js 파일로 바로 이동하여 App 구성 요소를 'ThemeProvider'로 래핑합니다.
// ./src/index
import React from "react";
import ReactDOM from "react-dom";
import App from "./components/App";
import "./index.css";
import { ThemeProvider } from './context/theme'
ReactDOM.render(
<ThemeProvider>
<App />
</ThemeProvider>,
document.getElementById("root"));
마지막으로 테마 컨텍스트를 활용할 각 구성 요소는 React의 useContext와 ThemeContext라는 두 가지 새로운 항목을 가져와야 합니다. 그런 다음 useContext 후크를 사용하여 ThemeContext에서 가져오려는 값을 분해하고 자유롭게 사용할 수 있습니다.
// ./src/components/App
import React, { useContext } from "react";
import ChildComponent from "./ChildComponent";
import { ThemeContext } from "../context/theme";
function App() {
// Pass your new Context object (ThemeContext) as an
// argument to useContext, which returns the current value
// of the Context object, and destructure the data you need
const { theme, setTheme } = useContext(ThemeContext)
function handleThemeChange(e) {
setTheme(e.target.value)
}
return (
<div className={theme}>
<header>
<h2>My App</h2>
<select name="theme" onChange={handleThemeChange}>
<option value="App">Select Theme</option>
<option value="App.Dark">Dark Mode</option>
<option value="App.Blue">Ocean</option>
<option value="App.Purple">Galaxy</option>
</select>
</header>
// No passing props here! If ChildComponent needs to know
// about theme, it can talk to our new friend Context
<ChildComponent />
</div>
);
}
export default App;
응용 프로그램 전체에서 다크 모드(또는 다른 사용자가 선택한 테마)의 영광스러운 광채를 경험하기 위해 때로는 사용하지도 않는 구성 요소를 통해 소품을 전달하던 시대는 지났습니다. 컨텍스트는 필요할 때마다 상태 및/또는 세터 기능을 펌핑할 수 있는 기능을 부여하여 더 깨끗한 코드로 어두운 모드를 제공합니다. 암흑기에 오신 것을 환영합니다... 좋은 의미에서요!
Reference
이 문제에 관하여(useContext의 어두운 면), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/dawnteigh/the-dark-side-of-usecontext-5bf1텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)