对于如何使用React路由器的历史记录,我有点不知所措。使用
。Redux
推送('/route')
换句话说,如果您使用Redux的mapDispatchToProps
连接一个组件,那么如何放置历史记录。推送(“/route”)
应该在调度特定操作后触发的按钮?
为了澄清这个问题,这里是我的一个实验片段。。。
class PostContainer extends React.Component {
handleSubmit(data) {
return this.props.addPost(data);
}
render() {
return (<Post onSubmit={data=> this.handleSubmit(data)}/>);
}
}
const mapDispatchToProps = (dispatch) => {
return {
addPost: (data) => {
dispatch(addPost(data)).data.then((result) => {
dispatch(addPostFulfilled(result.data));
//How do you call the following function?
this.props.history.push('/posts')
}).catch((error) => {
dispatch(addPostRejected());
});
},
}
}
export default connect(null, mapDispatchToProps)(PostContainer);
如您所见,一旦通过addpostmemplied
将帖子添加到Redux的状态,页面就需要通过历史记录移动到/posts
。推
根据Redux的文档,容器用于更新状态(以及获取数据)。因此,哑组件不应该放置任何类似历史的东西。按
。
有什么方法比上面的代码更好?
如有任何建议,将不胜感激。
恕我直言,您甚至可以从您的哑组件中执行history.push
,即
const mapDispatchToProps = (dispatch) => {
return {
addPost: (data) => {
dispatch(addPost(data)).data.then((result) => {
dispatch(addPostFulfilled(result.data));
<!-- removed from here -->
}).catch((error) => {
dispatch(addPostRejected());
});
},
}
}
完成addPostCompleted
数据后,您可以选择执行此操作。历史在组件本身中推送('/route')
。您可以使用props
更新时调用的任何lifefcycle方法来执行此操作。也许,将其添加到组件将接收道具
。
class PostContainer extends React.Component {
componentWillReceiveProps(nextProps){
/*Added here*/
if(nextProps.someFlag){ this.props.history.push('/someRoute');
}}
请注意,上述方法仅在以下情况下有效:
您可以不通过存储
跟踪位置更改。(阅读更多内容)
如果上面听起来像一大堆胡言乱语,你可以随时使用
react-router-redux
的ush
API,它可以在浏览器历史记录中推送新条目。你可以在你选择的任何地方导入它,然后推送一条新路线。
详细信息可以在react router redux github页面和引用文档中看到
推送和替换都接收位置描述符,它可以是描述URL的对象或纯字符串URL。这些操作创建者也可以在一个对象中作为routerActions使用,当使用Redux的bindActionCreator()时,可以方便地使用这些操作创建者。
因此,请使用
历史记录。在mapDispatchToProps中直接推送()
,或者将其作为道具传递给PostContainer
react组件。
更干净的方法可能是使用React路由器的
class PostContainer extends React.Component {
render() {
if (userJustAddedAPostRightNow === true) {
return <Redirect to='/posts' />
}
return (
<div>
<Post onSubmit={addPost}/>
</div>
);
}
}
export default connect(null, { addPost })(PostContainer);
addPost
如果成功,将触发状态更改。它应该将userJustAddedAPostRightNow
更改为true,这样您就可以重定向到帖子页面。
为了避免所有这些嵌套回调,您可以遵循Nir Kaufman的方法并在中间件中处理逻辑:
//src/middlewares/post.js
export const newPost = ({dispatch}) => next => action => {
next(action);
if (action.type === ADD_POST) {
dispatch(apiRequest('POST', action.URL, null, ADD_POST_SUCCESS, ADD_POST_ERROR));
dispatch(showSpinner());
}
};
然后,在成功时,
ADD_POST_success
操作将通过您的reducer更改userJustAddedAPostRightNow
的值。
您可以选择用户react-router-redux(需要初始设置),并从操作创建者那里分发您的操作
import { push } from 'react-router-redux'
class PostContainer extends React.Component {
handleSubmit(data) {
return this.props.addPost(data);
}
render() {
return (
<div>
<Post onSubmit={data=> this.handleSubmit(data)}/>
</div>
);
}
}
const mapDispatchToProps = (dispatch) => {
return {
addPost: (data) => {
dispatch(addPost(data)).data.then((result) => {
dispatch(addPostFulfilled(result.data));
//How do you call the following function?
dispatch(push('/posts'));
}).catch((error) => {
dispatch(addPostRejected());
});
},
}
}
export default connect(null, mapDispatchToProps)(PostContainer);
或者只是将推送作为“完成回调”传递。
class PostContainer extends React.Component {
handleSubmit(data, done) {
return this.props.addPost(data, done);
}
render() {
const { push } = this.props.history;
return (
<div>
<Post onSubmit={data=> this.handleSubmit(data, push)}/>
</div>
);
}
}
const mapDispatchToProps = (dispatch) => {
return {
addPost: (data, done) => {
dispatch(addPost(data)).data.then((result) => {
dispatch(addPostFulfilled(result.data));
//How do you call the following function?
done('/posts')
}).catch((error) => {
dispatch(addPostRejected());
});
},
}
}
export default connect(null, mapDispatchToProps)(PostContainer);
本文向大家介绍Redux怎样设置初始状态?相关面试题,主要包含被问及Redux怎样设置初始状态?时的应答技巧和注意事项,需要的朋友参考一下 它必须是createStore的第二个参数: const rootReducer = combineReducers({ todos: todos, visibilityFilter: visibilityFilter }); const initialSta
本文向大家介绍Redux怎样重置状态?相关面试题,主要包含被问及Redux怎样重置状态?时的应答技巧和注意事项,需要的朋友参考一下 const appReducer = combineReducers({ /* your app’s top-level reducers */ }) const rootReducer = (state, action) => { if (action.type =
本文向大家介绍Context api可以取代Redux吗?为什么?相关面试题,主要包含被问及Context api可以取代Redux吗?为什么?时的应答技巧和注意事项,需要的朋友参考一下 暂时不会,原因是利大于弊。关于利,createContext 从能力上只比 组件context 多一个能力,就是当父组件实现了shouldComponentUpdate return false时,子组件也可以更
本文向大家介绍redux-saga和redux-thunk有什么本质的区别?相关面试题,主要包含被问及redux-saga和redux-thunk有什么本质的区别?时的应答技巧和注意事项,需要的朋友参考一下 saga 自己基本上完全弄了一套 asyc 的事件监听机制。虽然好的一方面是将来可以扩展成 worker 相关的模块,甚至可以做到 multiple threads 同时执行,但代码量大大增加
本文向大家介绍你有使用过redux-saga中间件吗?它是干什么的?相关面试题,主要包含被问及你有使用过redux-saga中间件吗?它是干什么的?时的应答技巧和注意事项,需要的朋友参考一下 redux-saga 就是用来处理副作用(例如:AJAX请求)的一个中间件,使用Generator 函数
本文向大家介绍Redux的中间件是什么?你有用过哪些Redux的中间件?相关面试题,主要包含被问及Redux的中间件是什么?你有用过哪些Redux的中间件?时的应答技巧和注意事项,需要的朋友参考一下 view在redux中会派发一个action,action通过store的dispatch方法派发给store,store接收到action连同之前老的state一起传给reducer,reducer
本文向大家介绍Redux和vuex有什么区别?相关面试题,主要包含被问及Redux和vuex有什么区别?时的应答技巧和注意事项,需要的朋友参考一下 1:vuex的异步数据不需要使用到中件间,redux需要 2:vuex可以直接commit,action不是必须的,redux是必须的
本文向大家介绍说说Redux的实现流程相关面试题,主要包含被问及说说Redux的实现流程时的应答技巧和注意事项,需要的朋友参考一下 组件视图 通过 事件 发送 dispatch action store 接收到 action , 把action和 oldState 当做参数发送给 reducers reducers 接收 action和 oldState 通过计算返回新的 newState 给 s