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 等對象