function useState(init) {
let _val = init;
function setState(newVal) {
_val = newVal;
}
return [_val, setState];
}
값 자체가 아니라 호출하는 방식으로 바꾸면, 매 호출때, 바뀐 값도 가져올 수 있지 않을까?
const React = (function(){
let _val;
const useState = (initValue) => {
_val = _val || initValue;
const state = _val;
const setState = (newValue) => {
_val = newValue;
}
return [state, setState];
}
const render = (Components) =>
const C = Component()
C.render()
return C
}}
return {useState, render};
}) ()
function Component() {
const [state, setState] = useState(0);
return {
render: () => console.log("component render, state=", state),
click: () => setState(state + 1);
}
let App = React.render(Component);
App.click();
let App = React.render(Component);
```
const useState = (initValue) => {
let _val = initValue;
const state = _val;
const setState = (newValue) => {
_val = newValue;
}
return [state, setState];
}
```
- Before의 경우, useState가 재호출되면서 _val도 재선언되면서 initValue가 다시 들어가게 되므로, 계속 똑같은 값을 가져온다.
- 따라서, 이전 scope를 유지하도록 _val를 외부 scope로 뺴주는 것이 포인트!
...
let idx = 0;
const useState = (initValue) => {
const state = _val[idx] || initValue;
const _idx = idx;
const setState = (newValue) => {
_val[_idx] = newValue;
}
++idx; // 다음 useState를 위해 pointer를 다음 칸으로 이동시켜 준다.
}
- useState내부의 _idx는 setState에서 참조중이기에, setState에서 _idx는 이전 스코프가 유지되므로, 각 useState는 자신의 상태가 저장된 Idx를 유지할 수 있다!