React Reduxでストアの状態にアクセスするにはどうすればよいですか?


83

reduxとの非同期を学ぶための簡単なアプリを作っているだけです。すべてが機能するようになりました。今は、実際の状態をWebページに表示したいだけです。では、renderメソッドで実際にストアの状態にアクセスするにはどうすればよいですか?

これが私のコードです(私は学習しているだけなので、すべてが1ページにあります):

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')
);

したがって、状態のrenderメソッドでitem.title、ストアからすべてをリストしたいと思います。

ありがとう


5
あなたはもうすぐそこにいます。react-reduxライブラリを使用してストア接続コンポーネントを作成する必要があります。著者による無料コースでreduxの理解を深めることを強くお勧めします:egghead.io/courses/getting-started-with-redux
ctrlplusb 2016

3
あなたはstore.getState()実際にあなたの店から状態を読むために行います。redux.js.org/docs/api/Store.html#getState
Kenny Worden

2
チュートリアルをありがとう。私はreduxを完全には理解していません。このチュートリアルは、私を大いに助けてくれます。
パーキシズム2016

回答:


62

状態の変化をリッスンし、状態の変化ごとに更新する個別のコンポーネントを作成する必要があります。

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'));

60
@ 1storeここで定義された変数を取得する方法は?
バンダオ2017年

3
@BangDaoは、外部ファイルからインポートしていると想定できます。store変数-reduxストアインスタンスです。
2017年

28
@BangDaostoreわかりやすくするために、インポートを含める必要があります。
クライバンクス2018年

5
ReferenceError変数が見つかりません:ストア
Pete Alvin

4
import store from '../reducers/store';。そしてstore.js含んでいるでしょうconst createStoreWithMiddleware = applyMiddleware(thunkMiddleware,promise)(createStore); export default createStoreWithMiddleware(reducers);
AnBisw

44

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
パーキシズム2016

1
@Parkicismは、コンポーネントの初期レンダリングを行わなかったようです。このコースをご覧になる
semanser 2016

1
@Parkicismこれはアイテムを表示しません。これは、アプリが最初にレンダリングされるとき、サーバーからの応答がまだ受信されていないため、ストアをサブスクライブして、ストアが変更されるたびにコンポーネントを更新する必要があるためです。
2016

私はlet store = createStore(todoApp);中にいてindex.jsstore内部にアクセスしたい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を使用することをお勧めします。この場合、前述のようにプロバイダーを使用しますが、次に接続を使用してコンポーネントをストアに接続します。


6
作戦は特にReact-Reduxを求めました。なぜリクエスト以外の解決策を提供するのですか?
kermit_ice_tea

ReferenceError変数が見つかりません:ストア
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/

ここで2つのjsonオブジェクトを比較できます:http://www.jsondiff.com/


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.