rooms
のデータをグローバルアプリケーションコンテナに格納しています。 roomDetails
というサブコンテナがあり、これは再選択セレクタを使用して、グローバル状態から部屋をownProps.params.slug
で選択します。これは、mapStateToPropsを使用して行われます。mapStateToPropsを使用して動的ルートパラメータに基づいてコンポーネントをレンダリングし、
rooms/roomid1
rooms/roomid2
私の問題は、私はからのルートのparams(rooms/:roomId
)を変更したときということです。
私はリンクを使用してルートを変更しています:
<Link to={"/room/roomid1"} key={"room-roomid1"}>room 1</Link>
にはどうすればルートが変更されたときのparamsグローバル部屋の状態から部屋を再選択するために、コンポーネントのroom
小道具を得ることができますか?
部屋の小道具は、最初のページの読み込み時と同じように読み込まれます。または、私が動的なルートの外にあるルートに行き、その後戻ってきます。コンポーネントのプロパティ(ルートパラメータ)のみが変更されている同じ動的ルートを切り替えると、これらのコンポーネントは正しく読み込まれません。
RoomDetails/index.js
const mapStateToProps = (state, ownProps) => {
return createStructuredSelector({
room: selectRoom(ownProps.params.roomId),
});
}
...
render() {
let roomContent = null;
if (this.props.room) {
roomContent = (
<div>
{this.props.room.get('name')}
</div>
);
}
return (
<div>
{roomContent}
</div>
);
}
selectors.js
import { createSelector } from 'reselect';
const selectGlobal =() => (state) => state.get('global');
const selectRooms =() => createSelector(
selectGlobal(),
(globalState) => globalState.get('rooms')
);
const selectRoom = (roomId) => createSelector(
selectRooms(),
(roomsState) => roomsState && roomsState.get(roomId)
);
私はそれ(ownProps.params.roomId)_IS_変更に渡しているので、セレクタ "selectRoom"応答する必要はありませんか? –
console.logに変更があることを確認できますか? – corvid
私が "componentWillReceiveProps(nextProps){ console.log( '次の部屋:'、nextProps.params.roomId); }"と入力すると、部屋を変更するリンクをクリックするたびに正しい部屋IDが印刷されます –