我使用Redux
作为Flux
替代,React
作为视图图层。我的应用React
和Redux
与react-redux
connect()
方法绑定。
运行应用程序时,它会在组件安装时调度操作,并且redux返回正确的状态。但是,redux-logger
在控制台中记录了商店已使用新状态更新的内容,在检查this.props.session
时,组件仍会显示旧状态。我猜我没有正确使用connect
方法,但我也无法用它来定义问题。有没有人有什么想法?
containers / App
'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.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)));
};
}
减速器/ 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;
减速器/ RootReducer
'use strict';
import {combineReducers} from 'redux';
import sessionReducer from 'reducers/SessionReducer';
const rootReducer = combineReducers({
session: sessionReducer
});
export default rootReducer;
答案 0 :(得分:5)
问题在于从session
和商店记录props
变量的方式。当您将操作分派给更新状态时,它会同步更新存储,这就是您在直接记录存储时看到存储已更新的原因。但是,react-redux无法更新道具,直到对componentWillMount
的调用完成,并且React有机会赶上并重新渲染具有新状态的组件。如果您在componentWillMount
中发送操作并稍后记录session
道具,您会看到它已更改以反映操作。
答案 1 :(得分:0)
看起来你没有在reducer中改变动作处理程序中的状态。只有case
代码不是return state
代码state.update('isSessionValid', () => false)
- 它会返回什么?如果它与之前的状态是同一个对象,那么由于不变性约定,redux不会改变任何东西。