基本理念
用原生JS來觀察
{
let context = {};
window.setContext = function(key, value) {
context[key] = value;
};
window.f1 = function f1() {
console.log(1);
f2();
};
function f2() {
console.log(2);
f3();
}
function f3() {
console.log(3);
f4();
}
function f4() {
console.log(4, context["n"]);
}
}
將代碼構(gòu)建一個(gè)獨(dú)立的作用域(其實(shí)就是閉包)
將外部的變量傳遞給獨(dú)立作用域的變量(能訪問到是因?yàn)楸┞兑粋€(gè)接口出來)
{
window.setContext("n", 100);
setTimeout(() => {
window.f1();
}, 1000);
console.log("done");
}
React Context
API
const themeContext = React.createContext();
class App extends React.Component {
change = () => {
if (this.state.theme === "green") {
this.setState({ theme: "red" });
} else {
this.setState({ theme: "green" });
}
};
constructor() {
super();
this.state = {
theme: "green"
};
}
render() {
return (
<themeContext.Provider value={this.state.theme}>
<div className="App">
<button onClick={this.change}>換膚</button>
<themeContext.Consumer>
{theme => (
<div>
<Box theme={theme}>
<Button />
</Box>
<Box theme={theme}>
<Input />
</Box>
</div>
)}
</themeContext.Consumer>
</div>
</themeContext.Provider>
);
}
}
const rootElement = document.getElementById("root");
ReactDOM.render(<App />, rootElement);```