앞서 포스팅 했듯 context의 한계점은 명확하다.
또 극한의 성능충들은 대규모 플젝이 아닌이상 굳이 서드 파티 라이브러리까지 끌어와서 사용할 이유가 없다고 생각할 수 있다.
그래서 성능충(나)를 위한 useState만으로 Context API 커스텀 훅 구현하기를 시작해보겠다.
let globalState = {};
let listeners = [];
let actions = {};
export const useStore = (shouldListen = true) => {
const setState = useState(globalState)[1]; // 1.
useEffect(() => { // 2.
if (shouldListen) {
listeners.push(setState); // 3.
}
return () => {
if (shouldListen) {
listeners = listeners.filter(li => li !== setState); // 4.
}
};
}, [setState, shouldListen]);
return [globalState, dispatch];
};
import { useState, useEffect } from 'react';
let globalState = {};
let listeners = [];
let actions = {};
export const useStore = (shouldListen = true) => {
const setState = useState(globalState)[1];
const dispatch = (actionIdentifier, payload) => { // 1.
const newState = actions[actionIdentifier](globalState, payload); // 2.
globalState = { ...globalState, ...newState };
for (const listener of listeners) { // 3.
listener(globalState);
}
};
useEffect(() => {
if (shouldListen) {
listeners.push(setState);
}
return () => {
if (shouldListen) {
listeners = listeners.filter(li => li !== setState);
}
};
}, [setState, shouldListen]);
return [globalState, dispatch];
};
export const initStore = (userActions, initialState) => { // 4.
if (initialState) {
globalState = { ...globalState, ...initialState };
}
actions = { ...actions, ...userActions };
};