2016-07-12 47 views
28

私は単純なアプリをreduxと非同期で学習するようにしています。私はすべての作業を行っている、今私はちょうど実際の状態をWebページに表示したい。レンダリングメソッドで実際にストアの状態にアクセスするにはどうすればよいですか?状態のrenderメソッドでは、私はストアからすべてのitem.titleをリストしたい、React Reduxでストア状態にアクセスするにはどうすればよいですか?

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

ので:

は、ここに私のコード(私はちょうど学んでいるので、すべてが1ページである)です。あなたがあなたのストアの現在の状態を取得するためにStore.getState()を使用する必要が

おかげ

+1

あなたはほとんどそこにいます。 'react-redux'ライブラリを使用してストアに接続されたコンポーネントを作成する必要があります。 https://egghead.io/courses/getting-started-with-redux – ctrlplusb

+1

あなたは実際に状態を読むために 'store.getState()'を行います。あなたの店。 http://redux.js.org/docs/api/Store.html#getState –

+1

このチュートリアルをお寄せいただきありがとうございます。私はreduxを完全に理解していないし、このチュートリアルは私を大きく助けます。 – Parkicism

答えて

24

あなたは状態の変化に耳を傾け、すべての状態変化を上に更新される、別のコンポーネントを作成する必要があります。

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

ご協力いただきありがとうございます! – Parkicism

+23

@ 1venここで 'store'変数をどのように定義するのですか? –

+2

@BangDao私たちは外部ファイルからインポートしていると仮定できます。 'store'変数 - これはstoreインスタンスを還元します。 – 1ven

5

getState()の詳細については、thisをご覧ください。

+0

'this.props.items'を' store.getState()。items'に変更するだけですか?私がやったとき、 'item.title'を出力していません。 – Parkicism

+0

@Parkicismいくつか間違いをしますか? – semanser

+0

エラーはありません。何も出力していません。 – Parkicism

3

あなただけgetState以上のものをやりたいです。ストア内の変更に対応したい。あなたが反応し、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 

しかし、より良いが反応-Reduxのを使用することです。この場合は前述のようにプロバイダを使用しますが、connectを使用してコンポーネントをストアに接続します。

+0

オペアンプはReact-Redux専用のものです。なぜリクエスト以外の解決策を提供するのですか? –

関連する問題