constlistener=()=>{console.log('상태가 업데이트됨');}constunsubscribe=store.subscribe(listener);unsubscribe();// 추후 구독을 비활성화할 때 함수를 호출
subscribe 함수 안에 리스너 함수를 파라미터로 넣어서 호출할 경우, 액션이 디스패치되어 상태가 업데이트될 때마다 호출됨
리액트 없이 쓰는 리덕스
리덕스는 Angular, Vue와 같은 다른 UI 라이브러리/프레임워크 또는 바닐라 JS와 사용할 수도 있음
// DOM 레퍼런스constdivToggle=document.querySelector('.toggle');constcounter=document.querySelector('h1');constbtnIncrease=document.querySelector('#increase');constbtnDecrease=document.querySelector('#decrease');// 액션 타입constTOGGLE_SWITCH='TOGGLE_SWITCH';constINCREASE='INCREASE';constDECREASE='DECREASE';// 액션 생성 함수consttoggleSwitch=()=>({type:TOGGLE_SWITCH});constincrease=difference=>({type:INCREASE,difference});constdecrease=()=>({type:DECREASE});// 초깃값 설정constinitialState={toggle:false,counter:0}// 리듀서 함수// state가 undefined일 때는 initialState를 기본값으로 사용functionreducer(state=initialState,action){// action.type에 따라 다른 작업을 처리함switch(action.type){caseTOGGLE_SWITCH:return{...state,// 불변성 유지toggle:!state.toggle}caseINCREASE:return{...state,counter:state.counter+action.difference};caseDECREASE:return{...state,counter:state.counter-1}default:returnstate;}}// 스토어conststore=createStore(reducer);// render 함수constrender=()=>{conststate=store.getState();// 현재 상태 불러옴// 토글 처리if(state.toggle){divToggle.classList.add('active');}else{divToggle.classList.remove('active');}// 카운터 처리counter.innerText=state.counter;};render();// 구독store.subscribe(render);// 액션 발생시키기 (디스패치)divToggle.onclick=()=>{store.dispatch(toggleSwitch());};btnIncrease.onclick=()=>{store.dispatch(increase(1));};btnDecrease.onclick=()=>{store.dispatch(decrease());};
querySelector(selector): selector 조건에 일치하는 첫 번째 element 반환