私はただ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')
);
だから、状態のレンダリングメソッドで私はストアからすべてのitem.title
をリストしたいです。
ありがとう
個別のコンポーネントを作成する必要があります。これは状態の変化を監視し、状態が変化するたびに更新されます。
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'));
react-redux
からconnect
をインポートし、それを使用してコンポーネントを状態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/404056
さらに読むために: https://medium.com/@atomarranger/redux-mapstatetoprops-and-mapdispatchtoprops-shorthand-67d6cd78f132
ストアの現在の状態を取得するには、 Store.getState()
を使用する必要があります。
getState()
の詳細については、こちらをご覧ください。 this 短いビデオ。
あなたは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を使うことです。この場合は、前述のようにプロバイダを使用しますが、コンポーネントをストアに接続するには connect を使用します。
強力なデバッグを実行したい場合は、状態の変化ごとにサブスクライブして、アプリを一時停止して次のように詳細を確認することができます。
store.subscribe( () => {
console.log('state\n', store.getState());
debugger;
});
ファイルのcreateStore
を実行する場所に配置してください。
state
オブジェクトをコンソールからクリップボードにコピーするには、次の手順に従います。
Chromeのコンソールでオブジェクトを右クリックして、コンテキストメニューから[グローバル変数として保存]を選択します。変数名としてtemp1のようなものを返します。
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/