function App() {
const [n, setN] = useState(0);
const [m, setM] = useState(0);
return (
<div className="App">
<p>{n}</p>
<p>
<button onClick={() => setN(n + 1)}>+1</button>
</p>
<p>{m}</p>
<p>
<button onClick={() => setM(m + 1)}>+1</button>
</p>
</div>
);
}
复制代码
分析:react
import React from "react";
import ReactDOM from "react-dom";
const rootElement = document.getElementById("root");
let _state;
const myUseState = (initState) => {
_state = ( _state === undefined ? initState : _state);
const setState = (newState) => {
_state = newState
render()
}
return [_state,setState]
}
const render = () => ReactDOM.render(<App />, rootElement);
function App() {
const [n, setN] = myUseState(0);
return (
<div className="App">
<p>{n}</p>
<p>
<button onClick={() => setN(n + 1)}>+1</button>
</p>
</div>
);
}
ReactDOM.render(<App />, rootElement);
复制代码
import React from "react";
import ReactDOM from "react-dom";
const rootElement = document.getElementById("root");
let _state = [];
let index = 0;
const myUseState = (initState) => {
let currentIndex = index;
_state[currentIndex] = ( _state[currentIndex] === undefined ? initState : _state[currentIndex]);
const setState = (newState) => {
_state[currentIndex] = newState
index = 0
render()
}
index += 1
return [_state[currentIndex],setState]
}
const render = () => ReactDOM.render(<App />, rootElement);
function App() {
const [n, setN] = myUseState(0);
const [m, setM] = myUseState(0);
return (
<div className="App">
<p>{n}</p>
<p>
<button onClick={() => setN(n + 1)}>+1</button>
</p>
<p>{m}</p>
<p>
<button onClick={() => setM(m + 1)}>+1</button>
</p>
</div>
);
}
复制代码
const [n, setN] = React.useState(0);
let m, setM;
if (n % 2 === 1) {
[m, setM] = React.useState(0);
}
复制代码
function App() {
const [n, setN] = React.useState(0);
const log = () => setTimeout(() => console.log(`n: ${n}`), 3000);
return (
<div className="App">
<p>{n}</p>
<p>
<button onClick={() => setN(n + 1)}>+1</button>
<button onClick={log}>log</button>
</p>
</div>
);
}
//先点击 +1,再点 log,log 的值为 1
//先点击 log,再点 +1,log 的值为 0
复制代码
function App() {
const nRef = React.useRef(0);
//nRef 是一个对象 { current:0 }
const log = () => setTimeout(() => console.log(`n: ${nRef.current}`), 1000);
return (
<div className="App">
<p>{nRef.current}</p>
<p>
<button onClick={() => (nRef.current += 1)}>+1</button>
<button onClick={log}>log</button>
</p>
</div>
);
}
复制代码
const nRef = React.useRef(0);
const update = React.useState()[1];
const log = () => setTimeout(() => console.log(`n: ${nRef.current}`), 1000);
return (
<div className="App">
<p>{nRef.current} 这里并不能实时更新</p>
<p>
<button onClick={() => ((nRef.current += 1), update(nRef.current))}>
+1
</button>
<button onClick={log}>log</button>
</p>
</div>
);
复制代码
每一个函数组件对应一个 React 节点数组
每一个节点保存着 state 和 indexbash
useState 会读取 state[index]dom
index 由 useState 出现的顺序决定函数
setState 会修改 state ,并触发更新学习
每次渲染,组件函数就会再次执行ui
对应的全部 state 都会出现一个“分身”spa
若是不但愿出现这样“分身”的状况code
可使用 useRef / useContext 等对象