React Redux에서 저장 상태에 어떻게 액세스합니까?


86

나는 redux와 비동기를 배우는 간단한 앱을 만들고 있습니다. 나는 모든 것을 작동 시켰습니다. 이제 실제 상태를 웹 페이지에 표시하고 싶습니다. 이제 render 메서드에서 실제로 상점의 상태에 어떻게 액세스합니까?

다음은 내 코드입니다 (방금 배우기 때문에 모든 것이 한 페이지에 있습니다).

const initialState = {
        fetching: false,
        fetched: false,
        items: [],
        error: null
    }

const reducer = (state=initialState, action) => {
    switch (action.type) {
        case "REQUEST_PENDING": {
            return {...state, fetching: true};
        }
        case "REQUEST_FULFILLED": {
            return {
                ...state,
                fetching: false,
                fetched: true,
                items: action.payload
            }
        }
        case "REQUEST_REJECTED": {
            return {...state, fetching: false, error: action.payload}   
        }
        default: 
            return state;
    }
};

const middleware = applyMiddleware(promise(), thunk, logger());
const store = createStore(reducer, middleware);

store.dispatch({
    type: "REQUEST",
    payload: fetch('http://localhost:8000/list').then((res)=>res.json())
});

store.dispatch({
    type: "REQUEST",
    payload: fetch('http://localhost:8000/list').then((res)=>res.json())
});

render(
    <Provider store={store}>
        <div>
            { this.props.items.map((item) => <p> {item.title} </p> )}
        </div>
    </Provider>,
    document.getElementById('app')
);

따라서 상태의 렌더링 메서드 item.title에서 상점의 모든 항목을 나열하고 싶습니다 .

감사


5
거의 다 왔습니다. react-redux라이브러리를 사용하여 상점 연결 구성 요소를 작성해야합니다 . 내가보기 엔 당신이 저자 자유 코스 REDUX에 대한 이해를 닦는 것이 좋습니다 egghead.io/courses/getting-started-with-redux
ctrlplusb

3
당신은 어떻게 store.getState()실제로 상점에서 상태를 읽을 수 있습니다. redux.js.org/docs/api/Store.html#getState
Kenny Worden

2
튜토리얼 주셔서 감사합니다. 나는 redux를 완전히 이해하지 못하며이 튜토리얼은 나를 많이 도울 것입니다.
Parkicism

답변:


64

상태 변경을 수신하고 모든 상태 변경에 대해 업데이트하는 별도의 구성 요소를 만들어야합니다.

import store from '../reducers/store';

class Items extends Component {
  constructor(props) {
    super(props);

    this.state = {
      items: [],
    };

    store.subscribe(() => {
      // When state will be updated(in our case, when items will be fetched), 
      // we will update local component state and force component to rerender 
      // with new data.

      this.setState({
        items: store.getState().items;
      });
    });
  }

  render() {
    return (
      <div>
        {this.state.items.map((item) => <p> {item.title} </p> )}
      </div>
    );
  }
};

render(<Items />, document.getElementById('app'));

61
@ 1ven store여기서 변수를 정의 하는 방법은 무엇입니까?
Bang Dao

3
@BangDao는 외부 파일에서 가져오고 있다고 가정 할 수 있습니다. store변수-redux 스토어 인스턴스입니다.
1ven 1ven

28
@BangDao store명확성을 위해 가져 오기를 포함해야 합니다.
Kurai Bankusu

5
가기 : ReferenceError가이 변수를 찾을 수 없습니다
피트 앨빈에게

4
import store from '../reducers/store';. 그리고 store.js포함됩니다const createStoreWithMiddleware = applyMiddleware(thunkMiddleware,promise)(createStore); export default createStoreWithMiddleware(reducers);
AnBisw

45

가져 오기 connect에서 react-redux와 상태와 구성 요소를 연결하는 데 사용connect(mapStates,mapDispatch)(component)

import React from "react";
import { connect } from "react-redux";


const MyComponent = (props) => {
    return (
      <div>
        <h1>{props.title}</h1>
      </div>
    );
  }
}

마지막으로 상태를 소품에 매핑해야합니다. this.props

const mapStateToProps = state => {
  return {
    title: state.title
  };
};
export default connect(mapStateToProps)(MyComponent);

매핑 한 상태 만 다음을 통해 액세스 할 수 있습니다. props

이 답변을 확인하십시오 : https://stackoverflow.com/a/36214059/4040563

추가 정보 : https://medium.com/@atomarranger/redux-mapstatetoprops-and-mapdispatchtoprops-shorthand-67d6cd78f132


1
참고 : 이렇게하면 작업을 호출하지 않으면 소품에 액세스 할 수 없습니다 (에서 정의 됨 mapDispatchToProps). 다른 가져 오기주기를 디스패치하지 않고 이미 스토어에있는 항목을 얻으려면 subscribe또는 getState에서 를 사용해야 합니다 store.
AnBisw

13

Store.getState()스토어의 현재 상태를 가져 오려면 을 사용해야 합니다.

자세한 내용은 짧은 비디오를 getState()시청 하십시오 .


그래서 난 그냥 변경합니까 this.props.itemsstore.getState().items? 내가했을 때 item.title.
Parkicism

1
@Parkicism은 구성 요소에 대한 초기 렌더링을 수행하지 않은 것 같습니다. : 내가보기 엔이 과정보고를 추천 egghead.io/courses/getting-started-with-redux
semanser

1
@Parkicism이 항목을 표시하지 않습니다. 앱이 처음 렌더링 될 때 아직 서버로부터 응답이 수신되지 않았기 때문에 스토어를 구독하고 스토어가 변경 될 때마다 컴포넌트를 업데이트해야합니다.
1ven

내가 가진 let store = createStore(todoApp);index.js내가이 액세스하려는 store내부를 App.js- 그것의 방법은 무엇입니까?
N Sharma

TypeError : undefined는 객체가 아닙니다 ( '_redux.Store.getState'평가)
Pete Alvin

6

당신은 단지 getState. 상점의 변화에 ​​반응하고 싶습니다.

react-redux를 사용하지 않는다면 다음과 같이 할 수 있습니다.

function rerender() {
    const state = store.getState();
    render(
        <div>
            { state.items.map((item) => <p> {item.title} </p> )}
        </div>,
        document.getElementById('app')
    );
}

// subscribe to store
store.subscribe(rerender);

// do initial render
rerender();

// dispatch more actions and view will update

그러나 더 나은 방법은 react-redux를 사용하는 것입니다. 이 경우 언급 한대로 Provider를 사용하지만 connect 를 사용하여 구성 요소를 저장소에 연결합니다.


6
op는 특별히 React-Redux를 요청했습니다. 요청 이외의 다른 솔루션을 제공하는 이유는 무엇입니까?
Kermit_ice_tea

ReferenceError Ca n't find variable : store
Pete Alvin

3

강력한 디버깅을 원하는 경우 상태의 모든 변경 사항을 구독하고 앱을 일시 중지하여 다음과 같이 자세한 내용을 확인할 수 있습니다.

store.js
store.subscribe( () => {
  console.log('state\n', store.getState());
  debugger;
});

당신이 할 파일에 그것을 넣으십시오 createStore.

state콘솔에서 클립 보드로 개체 를 복사 하려면 다음 단계를 수행하십시오.

  1. Chrome 콘솔에서 개체를 마우스 오른쪽 버튼으로 클릭하고 컨텍스트 메뉴에서 전역 변수로 저장을 선택합니다. 변수 이름으로 temp1과 같은 것을 반환합니다.

  2. Chrome에도 copy()메서드가 있으므로 copy(temp1)콘솔에서 해당 개체를 클립 보드에 복사해야합니다.

https://stackoverflow.com/a/25140576

https://scottwhittaker.net/chrome-devtools/2016/02/29/chrome-devtools-copy-object.html

다음과 같은 json 뷰어에서 객체를 볼 수 있습니다. http://jsonviewer.stack.hu/

여기에서 두 개의 json 객체를 비교할 수 있습니다. http://www.jsondiff.com/


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.