【发布时间】:2015-12-23 03:08:43
【问题描述】:
我使用Redux 作为Flux 替代方案,React 用于视图层。我的应用程序的 React 和 Redux 与 react-redux connect() 方法绑定。
在运行应用程序时,它会在组件挂载并且 redux 返回正确状态时调度操作。但是,redux-logger 在控制台中记录了商店已使用新状态更新,在组件中检查this.props.session 时仍显示旧状态。我猜我没有正确使用connect 方法,但是我也无法定义它的问题。有人知道发生了什么吗?
容器/应用程序
'use strict';
import React from 'react';
import {connect} from 'react-redux';
import {fetchUserSession} from 'actions/SessionActions';
class App extends React.Component {
constructor(props) {
super(props);
}
componentWillMount() {
const {dispatch, session} = this.props;
dispatch(fetchUserSession());
console.log(session);
// logs:
// Object {currentUserId: null, errorMessage: null, isSessionValid: null}
// store is bound to window, and the initial state is ImmutabeJS object
console.log(window.store.getState().session.toJS());
// logs:
// Object {currentUserId: null, errorMessage: null, isSessionValid: false}
// as you might noticed the isSessionValid is changed to false
}
render() {
// html here
}
}
function mapStateToProps(state){
return {
session: state.session.toJS()
};
}
export default connect(mapStateToProps)(App);
actions/Actions.js
'use strict';
import fetch from 'isomorphic-fetch';
export const SESSION_REQUEST = 'SESSION_REQUEST';
export const SESSION_SUCCESS = 'SESSION_SUCCESS';
export function requestSession() {
return {
type: SESSION_REQUEST
};
}
export function receiveSession(user) {
return {
type: SESSION_REQUEST,
user
};
}
export function fetchUserSession() {
return dispatch => {
dispatch(requestSession());
return fetch(`http://localhost:5000/session`)
.then((response) => {
if (response.status === 404) {
dispatch(raiseSessionFailure(response));
}
return response.json();
})
.then(userData => dispatch(receiveSession(userData)));
};
}
reducers/SessionReducer.js
'use strict';
import {fromJS} from 'immutable';
// UPDATE!!!
// here is the initial state
const initialState = fromJS({
currentUserId: null,
errorMessage: null,
isSessionValid: null
});
function sessionReducer(state = initialState, action) {
switch (action.type) {
case 'SESSION_REQUEST':
return state.update('isSessionValid', () => false);
case 'SESSION_SUCCESS':
console.log('Reducer: SESSION_SUCCESS');
return state;
case 'SESSION_FAILURE':
console.log('Reducer: SESSION_FAILURE');
return state;
default:
return state;
}
}
export default sessionReducer;
reducers/RootReducer
'use strict';
import {combineReducers} from 'redux';
import sessionReducer from 'reducers/SessionReducer';
const rootReducer = combineReducers({
session: sessionReducer
});
export default rootReducer;
【问题讨论】:
-
你能展示你的状态吗?我认为因为你没有组合减速器,它看起来就像
initialState你也可以包括这个吗? -
嗨@Clarkie我更新了reducer并很好地说明了我如何组合reducer
-
您是否尝试过在不使用 immutableJS 库的情况下让它工作?我只用过 react 的 immutability helpers redux
-
您运行的是哪个版本的
redux和react-redux? 1.0 之前的版本可能存在问题。 -
我不确定这是否与您遇到的问题直接相关,但您在
componentWillMount中登录到控制台的方式保证会为session道具和商店中的session。对dispatch的调用将同步更新存储,但在componentWillMount完成之前,您不会看到新的session属性。您可以通过在setTimeout中记录this.props.session而不是在调用dispatch之后立即验证这一点吗?
标签: javascript reactjs redux