如何使用 redux 从路由参数加载对象
How to load object from route parameter using redux
我正在使用 react-router-redux 并且我有这样的路由
<Route path="/user/:userId" components={{ body: UserMaintenance }} />
在路由中加载与userId参数对应的用户对象的推荐方法是什么?
我的想法(我是 React 和 redux 的新手)是在 UserMaintenance componentWillReceiveProps
方法中使用 userId 参数,并将 FETCH_USER
操作分派到将加载到 state.currentUser
。当 currentUser 参数因操作而更新时,UserMaintenance 组件将随之更新。
首先,您必须决定是否希望 URL 成为 userId 的真实来源(我建议如此)。
那么你就知道只要 URL/route 发生变化,你就会调度 FETCH_USER
。
要从应用内的其他地方更改用户,您只需 browserHistory.push('/user/1234')
并且知道 URL 中的更改将触发对商店的更新。
如果您对此感到满意,请在路由中发送操作:
<Route
path="/user/:userId"
components={{ body: UserMaintenance }}
onEnter={state => {
store.dispatch({
type: ACTIONS.FETCH_USER,
key: state.params.userId,
});
}}
/>
如果您遵循此逻辑,则可能不需要 react-router-redux
。
redux 作者的有趣评论 .
我建议您将该逻辑移至 Container Component
,将 connects
UserMainenance
移至您的 redux store
这将帮助您将数据层与 Presentational Component
分开,后者应该不知道如何获取要呈现的数据。它只需要知道如何呈现该数据。
import React, {Component, PropTypes} from 'react';
import {connect} from 'react-redux';
import {fetchUser} from './actions';
import UserMaintenance from './UserMaintenance';
class UserContainer extends Component {
componentWillMount() {
const {fetchUser, userId} = this.props;
fetchUser(userId);
}
render() {
return (
<UserMaintenance {...this.props} />
);
}
}
const mapStateToProps = (state, ownProps) => ({
userId: ownProps.params.userId
user: state.user,
});
export default connect(
mapStateToProps, {fetchUser}
)(UserContainer);
假设您有fetchUser
个actionCreator。
强烈推荐大家观看Browse the Building React Applications with Idiomatic Redux course by Dan Abramov (creator of Redux) on https://egghead.io。它是免费的,并且很好地涵盖了这个主题。
我正在使用 react-router-redux 并且我有这样的路由
<Route path="/user/:userId" components={{ body: UserMaintenance }} />
在路由中加载与userId参数对应的用户对象的推荐方法是什么?
我的想法(我是 React 和 redux 的新手)是在 UserMaintenance componentWillReceiveProps
方法中使用 userId 参数,并将 FETCH_USER
操作分派到将加载到 state.currentUser
。当 currentUser 参数因操作而更新时,UserMaintenance 组件将随之更新。
首先,您必须决定是否希望 URL 成为 userId 的真实来源(我建议如此)。
那么你就知道只要 URL/route 发生变化,你就会调度 FETCH_USER
。
要从应用内的其他地方更改用户,您只需 browserHistory.push('/user/1234')
并且知道 URL 中的更改将触发对商店的更新。
如果您对此感到满意,请在路由中发送操作:
<Route
path="/user/:userId"
components={{ body: UserMaintenance }}
onEnter={state => {
store.dispatch({
type: ACTIONS.FETCH_USER,
key: state.params.userId,
});
}}
/>
如果您遵循此逻辑,则可能不需要 react-router-redux
。
redux 作者的有趣评论
我建议您将该逻辑移至 Container Component
,将 connects
UserMainenance
移至您的 redux store
这将帮助您将数据层与 Presentational Component
分开,后者应该不知道如何获取要呈现的数据。它只需要知道如何呈现该数据。
import React, {Component, PropTypes} from 'react';
import {connect} from 'react-redux';
import {fetchUser} from './actions';
import UserMaintenance from './UserMaintenance';
class UserContainer extends Component {
componentWillMount() {
const {fetchUser, userId} = this.props;
fetchUser(userId);
}
render() {
return (
<UserMaintenance {...this.props} />
);
}
}
const mapStateToProps = (state, ownProps) => ({
userId: ownProps.params.userId
user: state.user,
});
export default connect(
mapStateToProps, {fetchUser}
)(UserContainer);
假设您有fetchUser
个actionCreator。
强烈推荐大家观看Browse the Building React Applications with Idiomatic Redux course by Dan Abramov (creator of Redux) on https://egghead.io。它是免费的,并且很好地涵盖了这个主题。