react+redux 를 사용 하여 카운터 기능 및 문제 발생

12987 단어 react.redux카운터
Redux 는 그 자체 가 단순 한 상태 관리자 입 니 다.우 리 는 그의 역 사 를 거 슬러 올 라 가지 않 습 니 다.사용 측면 에서 볼 때 전체적인 대상 store 를 제공 합 니 다.store 에 state 대상 을 포함 하여 모든 응용 데 이 터 를 포함 하고 store 는 reducer 방법 을 제공 합 니 다.이 방법 들 은 호출 자 를 사용 하여 state 의 값 을 바 꿀 수 있 도록 사용자 정의 할 수 있 습 니 다.state 의 값 은 읽 기 전용 이 며,변경 이 필요 하 다 면 reducer 를 통과 해 야 합 니 다.
Redux
  • 핵심 대상:store
  • 데이터 저장:state
  • 상태 업데이트 제출 인터페이스:==dispatch==
  • 상태 업데이트 제출 매개 변수:type 과 payload 가 있 는=Action===
  • 상태 업데이트 계산:=reducer==
  • 제한:reducer 는 순 함수 여야 하 며 비동기
  • 는 지원 되 지 않 습 니 다.
  • 특성:미들웨어 지원
  • React + Redux
    recat 에서 redux 를 사용 하지 않 을 때 발생 하 는 문제
    react 에서 구성 요소 통신 의 데 이 터 는 단 방향 입 니 다.최상 위 구성 요 소 는 props 속성 을 통 해 하층부 구성 요소 에 데 이 터 를 전달 할 수 있 습 니 다.하층부 구성 요 소 는 상층 부 구성 요소 에 데 이 터 를 전달 할 수 없습니다.하층부 구성 요소 가 데 이 터 를 수정 하려 면 상층 부 에서 데 이 터 를 수정 하 는 방법 을 하층부 구성 요소 로 전달 해 야 합 니 다.프로젝트 가 갈수 록 구성 요소 간 에 데 이 터 를 전달 하 는 것 이 점점 어려워 집 니 다.

    react 에 redux 를 넣 으 면 좋 은 점
    redux 관리 데 이 터 를 사용 합 니 다.Store 는 구성 요소 에 독립 되 어 데이터 관 리 를 구성 요소 에 독립 시 켜 구성 요소 간 에 데 이 터 를 전달 하 는 데 어려움 을 해결 합 니 다.

    redux 사용 하기
    다운로드 redux
    
    npm install redux react-redux
    redux 작업 절차
  • 구성 요소 가 dispatch 를 통 해 action 을 촉발 합 니 다
  • store 는 action 을 받 아들 여 action 을 reducer
  • 에 게 나 누 어 준다.
  • reducer 는 action 형식 에 따라 상 태 를 변경 하고 변 경 된 데 이 터 를 store
  • 에 되 돌려 줍 니 다.
  • 구성 요 소 는 store 의 상 태 를 구독 하고 store 의 상태 업 데 이 트 는 구성 요소
  • 에 동기 화 됩 니 다.

    react+redux 를 사용 하여 계수 기 를 실현 합 니 다.
    1.프로젝트 를 만 들 고 redux 를 설치 합 니 다.
    
    #       react            reate   
    npm install -g create-react-app
    #   reate  
    create-react-app    
    #     
    cd    
    #    redux
    npm install redux reate-redux
    2.redux 를 도입 하고 시 작 된 코드 에 따라 react 에서 계수 기 를 실현 합 니 다.
    
    //index.js
    import React from 'react';
    import ReactDOM from 'react-dom';
    import App from './App';
    import { createStore } from 'redux';
    
    const initialState = {
      count: 0
    }
    function reducer(state = initialState, action) {
      switch (action.type) {
        case 'increment':
          return {
            count: state.count + 1
          }
        case 'decrement':
          return {
            count: state.count - 1
          }
    
        default:
          return state
      }
    }
    const store = createStore(reducer)
    
    const increment = {
      type: 'increment'
    }
    
    const decrement = {
      type: 'decrement'
    }
    
    function Count() {
      return <div>
        <button onClick={() => store.dispatch(increment)}>+</button>
        <span>{store.getState().count}</span>
        <button onClick={() => store.dispatch(decrement)}>-</button>
      </div>
    }
    
    store.subscribe( () => {
      console.log(store.getState())
      ReactDOM.render(
        <React.StrictMode>
          <Count />
        </React.StrictMode>,
        document.getElementById('root')
      );
    })
    
    ReactDOM.render(
      <React.StrictMode>
        <Count />
      </React.StrictMode>,
      document.getElementById('root')
    );
    분명히 상기 방식 은 계수기 의 기능 을 실현 할 수 있 지만 실제 항목 에 서 는 이렇게 사용 할 수 없습니다.구성 요 소 는 보통 단독 파일 에 있 기 때문에 다른 구성 요소 에서 Store 를 가 져 올 수 없습니다.
    카운터 사례 코드 최적화-store 전역 접근 가능
    Store 에서 문 제 를 해결 하기 위해 서 는 react-redux 를 사용 하여 이 문 제 를 해결 해 야 합 니 다.react-redux 는 Provider 구성 요소 와 connect 방법 을 제공 합 니 다.
    구성 요소 제공
    구성 요소 입 니 다.만 든 store 는 전역 적 인 곳 에 두 고 구성 요소 가 store 를 가 져 올 수 있 도록 합 니 다.provider 구성 요 소 를 통 해 store 를 전역 적 인 구성 요소 가 닿 을 수 있 는 곳 에 두 었 습 니 다.provider 는 최상 위 구성 요소 에 두 라 고 요구 합 니 다.
    connect
    connect 는 store 의 상 태 를 구독 하 는 데 도움 을 줍 니 다.상태 가 바 뀌 면 구성 요 소 를 다시 렌 더 링 하 는 데 도움 을 줍 니 다.
    connect 방법 을 통 해 store 의 상 태 를 가 져 와 store 의 상 태 를 props 에 투사 할 수 있 습 니 다.
    connect 방법 으로 dispatch 방법 을 얻 을 수 있 습 니 다.
    connect 의 매개 변 수 는 함수 입 니 다.이 함수 가 store 의 상 태 를 가 져 올 수 있 습 니 다.이 함수 가 대상 으로 돌아 가 야 합 니 다.이 대상 에 쓴 내용 은 구성 요소 의 props 속성 에 매 핑 됩 니 다.
    connect 호출 후 함수 가 되 돌아 오 는 이 함 수 를 계속 호출 하려 면 connect 에 매 핑 해 야 하 는 props 를 알려 야 합 니 다.
    새 Component 폴 더,Count.js 파일 생 성
    
    import React from 'react'
    
    function Count() {
        return <div>
            <button onClick={() => store.dispatch(increment)}>+</button>
            <span>{store.getState().count}</span>
            <button onClick={() => store.dispatch(decrement)}>-</button>
        </div>
    }
    
    export default Count
    Provider 구성 요 소 를 가장 바깥쪽 에 도입 하고 store 를 만 듭 니 다.
    
    ReactDOM.render(
      //   provider     store                   provider           
      <Provider store={store}><Count /></Provider>,
      document.getElementById('root')
    );
    connect 방법 을 도입 하여 connect 의 사용 에 따라 구성 요 소 를 감 싸 줍 니 다.
    
    const mapStateProps = state => ({
        count: state.count,
        a: '1'
    })
    // connect                  store    ,                ,                  props  
    // connect                              connect          props
    export default connect(mapStateProps)(Count)
    Count 구성 요 소 를 개조 하여 action 을 이 파일 에 복사 합 니 다.
    
    const increment = {
        type: 'increment'
    }
    
    const decrement = {
        type: 'decrement'
    }
    function Count({count,dispatch}) {
        return <div>
            <button onClick={() => {dispatch(increment)}}>+</button>
            <span>{count}</span>
            <button onClick={() => {dispatch(decrement)}}>-</button>
        </div>
    }
    현재 프로젝트 는 실행 할 수 있 지만 Count 구성 요소 에서 Action 을 제출 하 는 긴 코드 는 보기 의 가 독성 에 영향 을 미 치기 때문에 코드 는 최적화 되 어야 합 니 다.
    카운터 사례 코드 최적화-보기 의 코드 가 독성 을 높 입 니 다.
    우 리 는 보기에 서 함 수 를 직접 호출 하 기 를 원 합 니 다.이렇게 보기 코드 는 가 독성 이 강 합 니 다.이것 은 connect 의 두 번 째 매개 변 수 를 이용 해 야 합 니 다.두 번 째 매개 변 수 는 함수 입 니 다.이 함수 의 형 삼 은 dispatch 방법 입 니 다.이 함수 에 게 대상 을 되 돌려 달라 고 요구 합 니 다.돌아 오 는 이 대상 의 내용 은 구성 요소 의 props 속성 에 반 영 됩 니 다.
    하나의 변 수 를 connect 의 두 번 째 매개 변수 로 설명 하고 이 변수 에서 서로 다른 action 작업 을 수행 하 는 대상 을 되 돌려 줍 니 다.
    
    // connect                          dispatch                            props 
    const mapDispatchToProps = dispatch => ({
        increment (){
            dispatch({
                type: 'increment'
            })
        },
        decrement (){
            dispatch({
                type: 'decrement'
            })
        }
    })
    
    // connect                  store    ,                ,                  props  
    // connect                              connect          props
    export default connect(mapStateProps, mapDispatchToProps)(Count)
    구성 요소 에서 props 를 구성 하여 보기 에서 이벤트 에 직접 연결 합 니 다.
    
    function Count({count,increment,decrement}) {
        return <div>
            <button onClick={increment}>+</button>
            <span>{count}</span>
            <button onClick={decrement}>-</button>
        </div>
    }
    이번 최적화 를 통 해 우 리 는 dispatch 가 action 을 촉발 하 는 방법 을 호출 하 는 코드 가 모두 중복 되 었 기 때문에 계속 최적화 해 야 한 다 는 것 을 알 게 되 었 다.
    dispatch 트리거 action 방법 을 최적화 하 는 중복 코드 간소화
    bindActionCreators 를 이용 하여 dispatch 가 action 을 촉발 하 는 동작 을 간소화 합 니 다.bindActionCreators 는 action 동작 을 수행 하 는 함 수 를 생 성 하 는 데 도움 을 줍 니 다.
    bindAction Creators 는 두 개의 매개 변수 가 있 습 니 다.첫 번 째 매개 변 수 는 action 을 실행 하 는 대상 이 고 두 번 째 매개 변 수 는 dispatch 방법 입 니 다.
    action 작업 을 분리 합 니 다.새 store/actions/conter.actions.js 파일 은 action 작업 을 이 파일 에 따로 두 고 내 보 냅 니 다.
    
    export const increment = () => ({type: 'increment'})
    export const decrement = () => ({type: 'decrement'})
    Count.js 에서 계수기 에 대한 action 을 가 져 오고 bindAction Creators 방법 으로 dispatch 실행 action 함 수 를 생 성 합 니 다.
    
    import { bindActionCreators } from 'redux'
    import * as counterActions from './../store/actions/counter.actions'
    
    
    const mapDispatchToProps = dispatch => (bindActionCreators(counterActions, dispatch))
    // connect                  store    ,                ,                  props  
    // connect                              connect          props
    export default connect(mapStateProps, mapDispatchToProps)(Count)
    코드 가 여기까지 최적화 되 었 습 니 다.redux 의 코드 는 구성 요소 와 융합 되 어 있 기 때문에 저 는 독립 적 으로 나 누 어야 합 니 다.왜 redux 를 빼 야 합 니까?왜냐하면 저희 가 코드 구 조 를 좀 더 합 리 적 으로 해 야 돼 요.
    계수 기 를 재 구성 하여 redux 관련 코드 를 분리 합 니 다.
    reducer 함 수 를 단독 파일 로 추출 하고 store 생 성 을 단독 파일 로 추출 합 니 다.
    reducer 와 actions 에서 문자열 을 썼 지만 문자열 에 알림 이 없 기 때문에 단어 오류 가 발생 하지 않도록 문자열 을 상수 로 정의 합 니 다.src/store/const/conter.const.js 파일 을 새로 만 듭 니 다.
    
    export const INCREMENT = 'increment'
    export const DECREMENT = 'decrement'
    새 src/store/reducers/counter.reducers.js 파일 은 reducer 함 수 를 이 파일 에서 추출 합 니 다.
    
    import { INCREMENT, DECREMENT} from './../const/counter.const'
    const initialState = {
        count: 0
    }
    // eslint-disable-next-line import/no-anonymous-default-export
    export default (state = initialState, action) => {
        switch (action.type) {
            case INCREMENT:
                return {
                    count: state.count + 1
                }
            case DECREMENT:
                return {
                    count: state.count - 1
                }
    
            default:
                return state
        }
    }
    actions 의 문자열 을 도입 변수 로 변경 합 니 다.
    
    import { INCREMENT, DECREMENT} from './../const/counter.const'
    
    export const increment = () => ({type: INCREMENT})
    export const decrement = () => ({type: DECREMENT})
    src/store/index.js 파일 을 만 들 고 이 파일 에서 store 를 만 들 고 내 보 냅 니 다.
    
    import { createStore } from 'redux';
    import reducer from './reducers/counter.reducers'
    
    export const store = createStore(reducer)
    store 를 도입 한 파일 에서 충돌 항목 으로 변경 합 니 다 store 파일 에 store 를 도입 합 니 다.
    
    import React from 'react';
    import ReactDOM from 'react-dom';
    import Count from './components/Count';
    import { store } from './store'
    import { Provider } from 'react-redux'
    /**
     * react-redux  react   redux     
    *    Provider               store                  store
    *    connect       
     */
    
    
    ReactDOM.render(
      //   provider     store                   provider           
      <Provider store={store}><Count /></Provider>,
      document.getElementById('root')
    );
    
    action 전달 매개 변 수 를 위해 계수기 사례 를 확장 합 니 다.
    이 계수기 사례 는 버튼 을 누 르 면 1 을 줄 이 는 작업 을 실 현 했 습 니 다.지금 은 새로운 수요 가 있 습 니 다.예 를 들 어 5 를 줄 이 는 것 과 같은 수 치 를 더 줄 여야 합 니 다.
    action 에 인 자 를 전달 해 야 합 니 다.
    보기 에서 단추 바 인 딩 함수 입력 매개 변수
    
    function Count({count,increment,decrement}) {
        return <div>
            <button onClick={() => increment(5)}>+</button>
            <span>{count}</span>
            <button onClick={() => decrement(5)}>-</button>
        </div>
    }
    disfacth 에서 action 동작 을 수행 할 때 인 자 를 받 아들 여 action 에 전달 합 니 다.
    
    export const increment = payload => ({type: INCREMENT, payload})
    export const decrement = payload => ({type: DECREMENT, payload})
    reducers 에서 파 라 메 터 를 수신 하고 해당 하 는 처 리 를 합 니 다.
    
    export default (state = initialState, action) => {
        switch (action.type) {
            case INCREMENT:
                return {
                    count: state.count + action.payload
                }
            case DECREMENT:
                return {
                    count: state.count - action.payload
                }
    
            default:
                return state
        }
    }
    원본 주소:https://kspf.xyz/archives/10/
    react 에서 redux 를 사용 하고 카운터 사례 를 실현 하 는 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 react redux 실현 카운터 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 많은 응원 바 랍 니 다!

    좋은 웹페이지 즐겨찾기