처음부터 나만의 redux 구축

Redux는 단일 객체에서 앱 상태를 관리하는 데 도움이 되므로 전체 앱 상태가 단일 객체에 있음을 의미하므로 React 앱을 위한 상태 관리 라이브러리입니다.

redux 스토어를 연결하려고 하면 때때로 혼란스러운 반응 앱에 대한 상용구 설정을 수행해야 합니다.

그래서 처음부터 작성합니다.

반응 앱에서 store.js 파일을 생성합니다.

먼저 디스패치 함수, 구독 함수, 썽크 함수를 만들어야 합니다.




1.getState 함수는 앱의 현재 상태를 가져오는 데 도움이 됩니다.

2.thunk는 네트워크 요청을 지연시킬 수도 있는 aysnc 작업을 수행하는 데 사용됩니다.



reducers.js 파일 생성



<script id="gist-ltag"src="https://gist.github.com/saigowthamr/52f707d08c06a744cbf3df93e9b4c67e.js"/>


감속기



액션을 발송하면 이전 상태를 변경하는 대신 새로운 앱 상태를 제공합니다.



Redux를 React 앱에 연결하는 방법은 무엇입니까?



index.js 파일을 열고 스토어에서 구독을 가져오면 아래 코드에서 내가 한 것처럼 스토어에 연결됩니다.




import React from "react";
import { render } from "react-dom";
import "./index.css";
import App from "./App";
import { subscribe } from './store';

subscribe(()=>render(
  <App />,
  document.getElementById("root")
))


이제 카운터와 할 일을 구현하고 redux가 올바르게 작동하는지 알 수 있도록 일부 네트워크 요청을 보내겠습니다.



todo.js 파일




<script id="gist-ltag"src="https://gist.github.com/saigowthamr/b923a643d6e9e674f810871a69c8a6e5.js"/>


위의 코드에서 먼저 getState를 가져오고 스토어에서 발송했습니다.



할 일 추가 버튼을 클릭하면 페이로드와 함께 작업 유형을 전달하고 getState는 스토어에서 추가된 할 일을 가져오는 데 도움이 됩니다.



counterbuttons.js 파일




import React from "react";
import {dispatch} from './store'

function Inc() {
    dispatch({
        type: 'INC'
    })
}
function Dec() {
    dispatch({
        type: 'DEC'
    })
}

const width = { width: '2rem' ,fontSize:'1.2rem'}

const CounterButtons= () => (
  <div>
    <button onClick={Inc} style={width} >+</button>
    <button onClick={Dec}  style={width} >-</button>
  </div>
);

export default CounterButtons;


썽크를 사용하여 네트워크 요청을 보낼 때이며 썽크는 네트워크 요청을 만드는 데 사용됩니다.



thunks.js 파일 생성



import { dispatch, thunk } from "./store";
import axios from "axios";

export const users = () => thunk(
    function (res) {
        dispatch({
            type: "GET_USERS",
            users: res.data
        });
    }, (cb) => {
        axios.get('https://jsonplaceholder.typicode.com/users')
            .then(response => cb(response)) 
            .catch(err => cb({ err:'Error occurred'}))
    },5000 //delay time
)


thunk 함수는 세 개의 인수를 사용합니다. 처음 두 개는 콜백 함수입니다. 마지막

인수는 지연이며 선택 사항입니다.



첫 번째 콜백 함수에서 작업 유형 및 페이로드와 함께 디스패치를 ​​호출해야 합니다.



두 번째 콜백에서는 응답이 돌아올 때마다 네트워크 요청을 cb(callback) 함수로 감싸야 합니다. 첫 번째 콜백 함수 매개변수에서 응답을 받을 수 있습니다.



FetchData 구성요소



import React from "react";
import { getState } from "./store";
import { users } from "./thunks";

function Loading() {
  return <h1 style={{ color: "red" }}>Loading</h1>;
}

class FetchData extends React.Component {
  componentDidMount() {
    users();
  }
  Users = () => {
    if (getState().users) {
      return getState().users.map(user => (
        <ul key={user.id}>
          <li>{user.name}</li>
          <li>{user.email}</li>
        </ul>
      ));
    } else {
      return <h1 style={{color:'red'}}>Delaying request for 5seconds</h1>;
    }
  };

  render() {
    return (
      <div>
        <ul>
          <li>{getState().data ? getState().data : <Loading />}</li>
        </ul>

        <hr />
        <h1>Users</h1>
        <hr />

        {this.Users()}
      </div>
    );
  }
}

export default FetchData;


이것으로 모든 구성요소 생성이 완료되었습니다.



이제 앱이 이러한 구성 요소를 인식하지 못하므로 App.js 파일에서 이러한 구성 요소를 가져와야 합니다.



App.js 파일



<script id="gist-ltag"src="https://gist.github.com/saigowthamr/55a8097cffca4b1ff872df6282dbe4d9.js"/>


후 성공적으로 완료되었습니다



최종 출력





즐거우셨기를 바랍니다...👍🏻



코드 저장소

좋은 웹페이지 즐겨찾기