useContext
useContext γ―γ³γ³γγΌγγ³γγ§γ³γ³γγ―γΉγ (Context) οΏ½?θͺγΏεγγ¨γ΅γγΉγ―γ©γ€γοΌsubscribe, ε€ζ΄οΏ½?εγεγοΌγθ‘γγγοΏ½? React γγγ―γ§γγ
const value = useContext(SomeContext)- γͺγγ‘γ¬γ³γΉ
- δ½Ώη¨ζ³
- γγͺγΌοΏ½?ζ·±γγ«γγΌγΏγζΈ‘γ
- γ³γ³γγ―γΉγη΅η±γ§ζΈ‘γγγγγΌγΏοΏ½?ζ΄ζ°
- γγ©γΌγ«γγγ―γ¨γͺγγγγ©γ«γε€οΏ½?ζοΏ½?οΏ½
- γγͺγΌοΏ½?δΈι¨γ§γ³γ³γγ―γΉγοΏ½?ε€γδΈζΈγγγ
- γͺγγΈγ§γ―γγι’ζ°γζΈ‘γγ¨γοΏ½?εγ¬γ³γγΌοΏ½?ζι©ε
- γγ©γγ«γ·γ₯γΌγγ£γ³γ°
γͺγγ‘γ¬γ³γΉ
useContext(SomeContext)
γ³γ³γγΌγγ³γοΏ½?γγγγ¬γγ«γ§ useContext γεΌγ³εΊγγ¦γγ³γ³γγ―γΉγγθͺγΏεγγγ΅γγΉγ―γ©γ€γγγΎγγ
import { useContext } from 'react';
function MyComponent() {
const theme = useContext(ThemeContext);
// ...εΌζ°
SomeContext: δΊεγ«createContextγ§δ½ζγγγ³γ³γγ―γΉγγ§γγγ³γ³γγ―γΉγγ¨γ―γγθͺδ½γζ ε ±γδΏζγγ¦γγγγγ§γ―γͺγγγ³γ³γγΌγγ³γγ§ζδΎ (provide) γγγθͺγΏεγ£γγγ§γγγζ ε ±οΏ½?οΏ½?ε₯γγ葨γγοΏ½?γ§γγ
θΏγε€
useContext γ―γεΌγ³εΊγγγ³γ³γγΌγγ³γγ«ε―ΎεΏγγγ³γ³γγ―γΉγοΏ½?ε€γθΏγγΎγγε€γ―γγγͺγΌε
γ§ useContext γεΌγ³εΊγγγ³γ³γγΌγγ³γοΏ½?δΈδ½γγ€ζγθΏγ SomeContext.Provider γ«ζΈ‘γγγ value γ¨γγ¦ζ±ΊοΏ½?οΏ½γγγΎγγγοΏ½?γγγͺγγγγ€γγεε¨γγͺγε ΄εγ―γθΏγε€γ―γοΏ½?γ³γ³γγ―γΉγοΏ½? createContext γ«ζΈ‘γγ defaultValue γ«γͺγγΎγγθΏγε€γ―εΈΈγ«γ³γ³γγ―γΉγοΏ½?ζζ°οΏ½?ε€γ§γγReact γ―γγ³γ³γγ―γΉγγ«ε€ζ΄γγγγ¨γγγγθͺγΏεγ£γ¦γγγ³γ³γγΌγγ³γγθͺεηγ«εγ¬γ³γγΌγγΎγγ
注ζηΉ
- γ³γ³γγΌγγ³γοΏ½?
useContext()εΌγ³εΊγγ―γεγγ³γ³γγΌγγ³γγγθΏγγγγγγγ€γοΏ½?ε½±ιΏγεγγΎγγγε―ΎεΏγγ<Context.Provider>γ―γuseContext()γεΌγ³εΊγγ³γ³γγΌγγ³γοΏ½?δΈγ«γγεΏ θ¦γγγγΎγγ - γγγ³γ³γγ―γΉγοΏ½?γγγγ€γγη°γͺγ
valueγεγεγγ¨γε½θ©²γγγγ€γγγδΈγ«γγγοΏ½?γ³γ³γγ―γΉγγδ½Ώη¨γγ¦γγγγΉγ¦οΏ½?εγ³γ³γγΌγγ³γγ―γReact γ«γγ£γ¦θͺεηγ«εγ¬γ³γγΌγγγΎγγεοΏ½?ε€γ¨ζ¬‘οΏ½?ε€γ―γObject.isγ§ζ―θΌγγγΎγγmemoγδ½Ώγ£γ¦εγ¬γ³γγΌγγΉγγγγγε ΄εγ§γγεγ³γ³γγΌγγ³γγγ³γ³γγ―γΉγγγζ°γγε€γεγεγγγ¨γ«γγεγ¬γ³γγΌγ―妨γγγγΎγγγ - γγ«γγ·γΉγγ γηζγγεΊεοΏ½?δΈγ«γ’γΈγ₯γΌγ«οΏ½?ιθ€γγγε ΄εοΌγ·γ³γγͺγγ―γͺγ³γ―γ§θ΅·γγεΎγε ΄εγγγοΌγγ³γ³γγ―γΉγγε£γγε―θ½ζ§γγγγΎγγγ³γ³γγ―γΉγγδ»γγε€οΏ½?εγζΈ‘γγεδ½γγοΏ½?γ―γγ³γ³γγ―γΉγγζδΎγγγγγ«δ½Ώη¨γγ
SomeContextγ¨γθͺγΏθΎΌγγγγ«δ½Ώη¨γγSomeContextγγ===γ«γγζ―θΌγ§ε³ε―γ«εγγͺγγΈγ§γ―γγ§γγε ΄εοΏ½?γΏγ§γγ
δ½Ώη¨ζ³
γγͺγΌοΏ½?ζ·±γγ«γγΌγΏγζΈ‘γ
γ³γ³γγΌγγ³γοΏ½?γγγγ¬γγ«γ§ useContext γεΌγ³εΊγγ¦γ³γ³γγ―γΉγγθͺγΏεγγγ΅γγΉγ―γ©γ€γγγΎγγ
import { useContext } from 'react';
function Button() {
const theme = useContext(ThemeContext);
// ...useContext γ―ζΈ‘γγγ³γ³γγ―γΉγγ«ε―ΎεΏγγγ³γ³γγ―γΉγοΏ½?ε€γθΏγγΎγγγ³γ³γγ―γΉγοΏ½?ε€γζ±ΊοΏ½?οΏ½γγγγγ«γReact γ―γ³γ³γγΌγγ³γγγͺγΌγζ’η΄’γγγοΏ½?γ³γ³γγ―γΉγγ«ε―Ύγγ¦ζγθΏγδΈδ½οΏ½?γ³γ³γγ―γΉγγγγγ€γγθ¦γ€γγΎγγ
γ³γ³γγ―γΉγγδΈθ¨οΏ½? Button γ«ζΈ‘γγ«γ―γθ©²ε½οΏ½?γγΏγ³γγγγ―γοΏ½?θ¦ͺγ³γ³γγΌγγ³γοΏ½?γγγγγγε―ΎεΏγγγ³γ³γγ―γΉγγγγγ€γγ§γ©γγγγΎγγ
function MyPage() {
return (
<ThemeContext.Provider value="dark">
<Form />
</ThemeContext.Provider>
);
}
function Form() {
// ... renders buttons inside ...
}γγγγ€γγ¨ Button οΏ½?ιγ«γ©γγ γε€γοΏ½?γ³γ³γγΌγγ³γγζγΎγ£γ¦γγ¦γι’δΏγγγΎγγγForm οΏ½?ε
ι¨οΏ½?γ©γγγ§ Button γ useContext(ThemeContext) γεΌγ³εΊγγ¨γγε€γ¨γγ¦ "dark" γεγεγγΎγγ
import { createContext, useContext } from 'react'; const ThemeContext = createContext(null); export default function MyApp() { return ( <ThemeContext.Provider value="dark"> <Form /> </ThemeContext.Provider> ) } function Form() { return ( <Panel title="Welcome"> <Button>Sign up</Button> <Button>Log in</Button> </Panel> ); } function Panel({ title, children }) { const theme = useContext(ThemeContext); const className = 'panel-' + theme; return ( <section className={className}> <h1>{title}</h1> {children} </section> ) } function Button({ children }) { const theme = useContext(ThemeContext); const className = 'button-' + theme; return ( <button className={className}> {children} </button> ); }
γ³γ³γγ―γΉγη΅η±γ§ζΈ‘γγγγγΌγΏοΏ½?ζ΄ζ°
ε€γοΏ½?ε ΄εγζιγ¨γ¨γγ«γ³γ³γγ―γΉγγε€εγγγγγ¨ζγγ§γγγγγ³γ³γγ―γΉγγζ΄ζ°γγγ«γ―γγγγ state γ¨η΅γΏεγγγΎγγθ¦ͺγ³γ³γγΌγγ³γγ§ state ε€ζ°γοΏ½?οΏ½θ¨γγηΎε¨οΏ½? state γγ³γ³γγ―γΉγοΏ½?ε€γ¨γγ¦γγγγ€γγ«ζΈ‘γγΎγγ
function MyPage() {
const [theme, setTheme] = useState('dark');
return (
<ThemeContext.Provider value={theme}>
<Form />
<Button onClick={() => {
setTheme('light');
}}>
Switch to light theme
</Button>
</ThemeContext.Provider>
);
}γγγ«γγγγγγγ€γοΏ½?ε
ι¨γ«γγγγ©οΏ½? Button γηΎε¨οΏ½? theme οΏ½?ε€γεγεγγγγ«γͺγγΎγγsetTheme γεΌγ³εΊγγ¦γγγγ€γγ«ζΈ‘γ theme ε€γζ΄ζ°γγγ¨γγγΉγ¦οΏ½? Button γ³γ³γγΌγγ³γγ―ζ°γγͺε€γ§γγ 'light' γδ½Ώγ£γ¦εγ¬γ³γγΌγγγΎγγ
δΎ 1/5: γ³γ³γγ―γΉγη΅η±γ§ζΈ‘γγγε€οΏ½?ζ΄ζ°
γοΏ½?δΎγ§γ―γMyApp γ³γ³γγΌγγ³γγ state ε€ζ°γδΏζγγγγγ ThemeContext γγγγ€γγ«ζΈ‘γγγΎγγβDark modeβ οΏ½?γγ§γγ―γγγ―γΉγιΈζγγγ¨γstate γζ΄ζ°γγγΎγγγγγγ€γγ«ζΈ‘γε€γζ΄ζ°γγγ¨γγοΏ½?γ³γ³γγ―γΉγγδ½Ώη¨γγ¦γγγγΉγ¦οΏ½?γ³γ³γγΌγγ³γγεγ¬γ³γγΌγγγΎγγ
import { createContext, useContext, useState } from 'react'; const ThemeContext = createContext(null); export default function MyApp() { const [theme, setTheme] = useState('light'); return ( <ThemeContext.Provider value={theme}> <Form /> <label> <input type="checkbox" checked={theme === 'dark'} onChange={(e) => { setTheme(e.target.checked ? 'dark' : 'light') }} /> Use dark mode </label> </ThemeContext.Provider> ) } function Form({ children }) { return ( <Panel title="Welcome"> <Button>Sign up</Button> <Button>Log in</Button> </Panel> ); } function Panel({ title, children }) { const theme = useContext(ThemeContext); const className = 'panel-' + theme; return ( <section className={className}> <h1>{title}</h1> {children} </section> ) } function Button({ children }) { const theme = useContext(ThemeContext); const className = 'button-' + theme; return ( <button className={className}> {children} </button> ); }
value="dark" γ― "dark" γ¨γγζεεγζΈ‘γγΎγγγvalue={theme} γ― JavaScript οΏ½? theme ε€ζ°οΏ½?ε€γ JSX οΏ½?ζ³’ζ¬εΌ§γ§ζΈ‘γγ¦γγγγ¨γ«ζ³¨ζγγ¦γγ γγγζ³’ζ¬εΌ§γδ½Ώγγγ¨γ§γζεεδ»₯ε€οΏ½?γ³γ³γγ―γΉγε€γζΈ‘γγγ¨γγ§γγΎγγ
γγ©γΌγ«γγγ―γ¨γͺγγγγ©γ«γε€οΏ½?ζοΏ½?οΏ½
React γγγγ³γ³γγ―γΉγγ«ε―ΎεΏγγγγγγ€γγθ¦ͺγγͺγΌγ§θ¦γ€γγγγͺγε ΄εγuseContext() γθΏγγ³γ³γγ―γΉγοΏ½?ε€γ―γγ³γ³γγ―γΉγγδ½ζγγγ¨γγ«ζοΏ½?οΏ½γγγγγ©γ«γε€γ¨ηγγγͺγγΎγοΌ
const ThemeContext = createContext(null);γγγ©γ«γε€γ―η΅Άε―Ύγ«ε€ζ΄γγγΎγγγγ³γ³γγ―γΉγγζ΄ζ°γγγε ΄εγδΈθ¨γ§θͺ¬ζγγγγγ«γstate γ¨η΅γΏεγγγ¦δ½Ώη¨γγΎγγ
ε€γοΏ½?ε ΄εγnull οΏ½?代γγγ«γγγ©γ«γε€γ¨γγ¦δ½Ώγγγζε³οΏ½?γγε€γγγγ―γγ§γγδΎγγ°οΌ
const ThemeContext = createContext('light');γγγγγ°γε―ΎεΏγγγγγγ€γγͺγγ«γ³γ³γγΌγγ³γγιιγ£γ¦γ¬γ³γγΌγγ¦γγΎγ£γ¦γγε£γγγγ¨γ―γγγΎγγγγγΉγη°ε’γ§γγγγΉγγ³γΌγγ«γγγγ€γγγγγγθ¨οΏ½?οΏ½γγγ¨γγ³γ³γγΌγγ³γγγγΎγεδ½γγγγγ«γͺγγΎγγ
δΈθ¨οΏ½?δΎγ§γ―γβToggle themeβ γγΏγ³γ―γγγγγγΌγγ³γ³γγ―γΉγγγγγ€γοΏ½?ε€ι¨γ«γγγγγ€γγΌγγ³γ³γγ―γΉγοΏ½?γγγ©γ«γε€γ 'light' γ§γγγγγεΈΈγ« light οΏ½?θ²θͺΏγ§θ‘¨η€ΊγγγΎγγγγΌγοΏ½?εζε€γ 'dark' γ«ε€ζ΄γγ¦γΏγ¦γγ γγγ
import { createContext, useContext, useState } from 'react'; const ThemeContext = createContext('light'); export default function MyApp() { const [theme, setTheme] = useState('light'); return ( <> <ThemeContext.Provider value={theme}> <Form /> </ThemeContext.Provider> <Button onClick={() => { setTheme(theme === 'dark' ? 'light' : 'dark'); }}> Toggle theme </Button> </> ) } function Form({ children }) { return ( <Panel title="Welcome"> <Button>Sign up</Button> <Button>Log in</Button> </Panel> ); } function Panel({ title, children }) { const theme = useContext(ThemeContext); const className = 'panel-' + theme; return ( <section className={className}> <h1>{title}</h1> {children} </section> ) } function Button({ children, onClick }) { const theme = useContext(ThemeContext); const className = 'button-' + theme; return ( <button className={className} onClick={onClick}> {children} </button> ); }
γγͺγΌοΏ½?δΈι¨γ§γ³γ³γγ―γΉγοΏ½?ε€γδΈζΈγγγ
η°γͺγε€γζγ€γγγγ€γγ§γγͺγΌοΏ½?δΈι¨γγ©γγγγγγ¨γ«γγγγοΏ½?ι¨εοΏ½?γ³γ³γγ―γΉγγδΈζΈγγ§γγΎγγ
<ThemeContext.Provider value="dark">
...
<ThemeContext.Provider value="light">
<Footer />
</ThemeContext.Provider>
...
</ThemeContext.Provider>γγγγ€γοΏ½?γγΉγγ¨δΈζΈγγ―εΏ θ¦γͺγ γθ‘γγγ¨γγ§γγΎγγ
δΎ 1/2: γγΌγοΏ½?δΈζΈγ
γοΏ½?δΎγ§γ―γFooter οΏ½?ε
ι¨γ«γγγγΏγ³γ―γε€ι¨γ«γγγγΏγ³οΌ"dark"οΌγ¨γ―ιγγ³γ³γγ―γΉγε€οΌ"light"οΌγεγεγγΎγγ
import { createContext, useContext } from 'react'; const ThemeContext = createContext(null); export default function MyApp() { return ( <ThemeContext.Provider value="dark"> <Form /> </ThemeContext.Provider> ) } function Form() { return ( <Panel title="Welcome"> <Button>Sign up</Button> <Button>Log in</Button> <ThemeContext.Provider value="light"> <Footer /> </ThemeContext.Provider> </Panel> ); } function Footer() { return ( <footer> <Button>Settings</Button> </footer> ); } function Panel({ title, children }) { const theme = useContext(ThemeContext); const className = 'panel-' + theme; return ( <section className={className}> {title && <h1>{title}</h1>} {children} </section> ) } function Button({ children }) { const theme = useContext(ThemeContext); const className = 'button-' + theme; return ( <button className={className}> {children} </button> ); }
γͺγγΈγ§γ―γγι’ζ°γζΈ‘γγ¨γοΏ½?εγ¬γ³γγΌοΏ½?ζι©ε
γ³γ³γγ―γΉγγδ»γγ¦γγͺγγΈγ§γ―γγι’ζ°γε«γγ γ©γγͺε€γζΈ‘γγγ¨γγ§γγΎγγ
function MyApp() {
const [currentUser, setCurrentUser] = useState(null);
function login(response) {
storeCredentials(response.credentials);
setCurrentUser(response.user);
}
return (
<AuthContext.Provider value={{ currentUser, login }}>
<Page />
</AuthContext.Provider>
);
}γγγ§γ―γγ³γ³γγ―γΉγοΏ½?ε€γ―γ2 γ€οΏ½?γγγγγ£γζγ€ JavaScript γͺγγΈγ§γ―γγ§γγγγοΏ½?γγ‘οΏ½? 1 γ€γ―ι’ζ°γ«γͺγγΎγγMyApp γεγ¬γ³γγΌγγγγγ³γ«οΌδΎγγ°γγγΌγΈι·η§»γͺγ©οΌγγγγ―η°γͺγι’ζ°οΏ½?ε
₯γ£γη°γͺγγͺγγΈγ§γ―γγζγγγγReact γ―γγͺγΌγ«γγ useContext(AuthContext) γεΌγ³εΊγγ¦γγγγΉγ¦οΏ½?γ³γ³γγΌγγ³γγεγ¬γ³γγΌγγͺγγγ°γͺγγΎγγγ
ε°θ¦ζ¨‘γͺγ’γγͺγ§γ―γει‘γ«γͺγγΎγγγγ§γγγcurrentUser οΏ½?γγγͺε
ι¨οΏ½?γγΌγΏγε€ζ΄γγγ¦γγͺγγͺγγεγ¬γ³γγΌγγεΏ
θ¦γ―γγγΎγγγγγΌγΏγε€γγ£γ¦γγͺγγ¨γγδΊοΏ½?οΏ½γ React γζε€§ιγ«ζ΄»η¨γ§γγγγγ«γlogin ι’ζ°γ useCallback γ§γ©γγγγγͺγγΈγ§γ―γοΏ½?ηζγ useMemo γ§γ©γγγγγγ¨γγ§γγΎγγγγγ―γγγ©γΌγγ³γΉοΏ½?ζι©εγ§γοΌ
import { useCallback, useMemo } from 'react';
function MyApp() {
const [currentUser, setCurrentUser] = useState(null);
const login = useCallback((response) => {
storeCredentials(response.credentials);
setCurrentUser(response.user);
}, []);
const contextValue = useMemo(() => ({
currentUser,
login
}), [currentUser, login]);
return (
<AuthContext.Provider value={contextValue}>
<Page />
</AuthContext.Provider>
);
}γοΏ½?ε€ζ΄οΏ½?η΅ζγMyApp γεγ¬γ³γγΌγγεΏ
θ¦γγγ£γ¦γγcurrentUser γε€ζ΄γγγ¦γγͺγιγγuseContext(AuthContext) γεΌγ³εΊγγ¦γγγ³γ³γγΌγγ³γγεγ¬γ³γγΌγγεΏ
θ¦γ―γͺγγͺγγΎγγ
θ©³γγγ― useMemo γ¨ useCallback γεη
§γγ¦γγ γγγ
γγ©γγ«γ·γ₯γΌγγ£γ³γ°
γγγγ€γγ«ζΈ‘γγε€γθͺεοΏ½?γ³γ³γγΌγγ³γγγθ¦γγͺγ
γγγθ΅·γγδΈθ¬ηγͺηη±γ―γγγ€γγγγΎγοΌ
useContext()γεΌγ³εΊγγ¦γγγ³γ³γγΌγγ³γγ¨εγοΌγΎγγ―δΈδ½οΏ½?οΌγ³γ³γγΌγγ³γγ§<SomeContext.Provider>γγ¬γ³γγΌγγ¦γγγ<SomeContext.Provider>γuseContext()γεΌγ³εΊγγ³γ³γγΌγγ³γοΏ½?ε€ε΄γγ€δΈδ½γ«η§»εγγ¦γγ γγγ- γ³γ³γγΌγγ³γγ
<SomeContext.Provider>γ§γ©γγγεΏγγ¦γγγγγγͺγΌε οΏ½?ζγ£γ¦γγοΏ½?γ¨γ―ιγε ΄ζγ«ι οΏ½?γγ¦γγΎγ£γ¦γγγReact DevTools γδ½Ώγ£γ¦γγͺγΌιε±€γζ£γγγη’Ίθͺγγ¦γΏγ¦γγ γγγ - γγγγ€γγ³γ³γγΌγγ³γγγθ¦γ
SomeContextγ¨γε©η¨ε΄οΏ½?γ³γ³γγΌγγ³γγγθ¦γSomeContextγγγγ«γγγΌγ«οΏ½?ει‘γ«γγ 2 γ€οΏ½?η°γͺγγͺγγΈγ§γ―γγ«γͺγ£γ¦γγγγγγ―δΎγγ°γγ·γ³γγͺγγ―γͺγ³γ―γδ½Ώη¨γγ¦γγε ΄εγͺγ©γ«ηΊηγγΎγγγγγη’Ίθͺγγγγγ«γγγγγwindow.SomeContext1γwindow.SomeContext2οΏ½?γγγͺγ°γγΌγγ«ε€ζ°γ«ε²γε½γ¦γγ³γ³γ½γΌγ«γ§window.SomeContext1 === window.SomeContext2γζγη«γ€γη’Ίθͺγγ¦γΏγ¦γγ γγγγγεδΈγ§γͺγγͺγγγγ«γγγΌγ«οΏ½?γ¬γγ«γ§γγοΏ½?ει‘γοΏ½?ζ£γγεΏ θ¦γγγγΎγγ
ιγγγγ©γ«γε€γζοΏ½?οΏ½γγ¦γγοΏ½?γ«γ³γ³γγ―γΉγγγεΈΈγ« undefined γθΏγ£γ¦γγ
γγͺγΌοΏ½?δΈγ« value οΏ½?γͺγγγγγ€γγγγοΏ½?γγγγγΎγγοΌ
// π© Doesn't work: no value prop
<ThemeContext.Provider>
<Button />
</ThemeContext.Provider>value γζοΏ½?οΏ½γεΏγγε ΄εγγγγ― value={undefined} γζΈ‘γοΏ½?γ¨εγγ§γγ
γΎγγθͺ€γ£γ¦ props γ¨γγ¦ιγεεγδ½Ώγ£γ¦γγοΏ½?γγγγγΎγγοΌ
// π© Doesn't work: prop should be called "value"
<ThemeContext.Provider theme={theme}>
<Button />
</ThemeContext.Provider>γ©γ‘γοΏ½?ε ΄εγγReact γγοΏ½?θ¦εγγ³γ³γ½γΌγ«γ«θ‘¨η€Ίγγγγ―γγ§γγοΏ½?ζ£γγγ«γ―γprops γ¨γγ¦ value γδ½ΏγγΎγοΌ
// β
Passing the value prop
<ThemeContext.Provider value={theme}>
<Button />
</ThemeContext.Provider>createContext(defaultValue) γ§ζοΏ½?οΏ½γγγγγ©γ«γε€γ―γγγͺγΌοΏ½?δΈε΄γ«δΈθ΄γγγγγγ€γγδΈεεε¨γγͺγε ΄εγ«οΏ½?γΏδ½Ώη¨γγγγγ¨γ«ζ³¨ζγγ¦γγ γγγθ¦ͺοΏ½?γγͺγΌοΏ½?γ©γγγ« <SomeContext.Provider value={undefined}> οΏ½?γγγͺγ³γ³γγΌγγ³γγγγγ°γuseContext(SomeContext) γεΌγ³εΊγγ³γ³γγΌγγ³γγ―γ³γ³γγ―γΉγε€γ¨γγ¦γοΏ½? undefined γεγεγγΎγγ