我有两个reduer,一个负责用户登陆的相关state :loginReducer.js
另一个负责登录后的socket聊天:chatReducer.js,
登陆成功后可以看到loginReducer里面的userLogin已经发生了变化,此时页面进入了聊天页面,但是问题来了,只要发出任意一个chatReducer的action,loginReducer里面的信息就会丢失,变成初始状态的initState,
如下图:
-
loginReducer.js
const initState={ islogining:false, loginUser:{ name:'', messagesUnRead:[], }, loginSuccess:false, isRegisterNewUser:false } function loginReducer(state=initState, action={}) { switch (action.type) { case 'REGISTERING_NEWUSER': return Object.assign({},state,{isRegisterNewUser:true}) case 'REGISTERING_NEWUSER_SUCCESS': return Object.assign({},state,{isRegisterNewUser:true}) case 'REGISTERING_NEWUSER_FAILURE': return Object.assign({},state,{isRegisterNewUser:true}) case 'FETCHING_PEOPLE': return Object.assign({},state,{islogining:true}) case 'FETCHING_PEOPLE_SUCCESS': console.log(action.data) return Object.assign({},state,{loginUser:action.data,islogining:false,loginSuccess:true}) case 'FETCHING_PEOPLE_FAILURE': return Object.assign({},state,{islogining:false}) default: return initState } } export default loginReducer;
-
chatReducer.js
users:[//用户列表 { name:'admin',isOnline:false,profilePhoto:logo,lastMessage:'你说啥??'}, { name:'张三',isOnline:true,profilePhoto:logo,lastMessage:'好的,我知道了'}, { name:'李四',isOnline:false,profilePhoto:logo,lastMessage:'好的,我知道了'}, { name:'王五',isOnline:false,profilePhoto:logo,lastMessage:'小伙子,不错啊'}], loadMessageType:'current',//是否当前聊天或者历史记录 messageType:'current',//当前对话框 messages:{ current:[ {sender:'admin',msg:'第一条测试消息第一条测试消息第一条测试消息第一条测试消息第一条测试消息第一条测试消息第一条测试消息第一条测试消息第一条测试消息第一条测试消息第一条测试消息第一条测试消息第一条测试消息第一条测试消息第一条测试消息',sendTime:'2018-3-15',receiver:[],receiveTime:''}, {sender:'李四',msg:'测试测试测试',sendTime:'2018-3-16',receiver:[],receiveTime:''} ], history:[] }, newMessage:'',//正在输入的新消息, tabListNoTitle : [{ key: 'current', tab: '当前信息', }, { key: 'history', tab: '历史记录', }, ], currentUser:{}, } function chatReducer(state=initState, action={}) { switch (action.type) { case 'LOADING_HISTORY_MESSAGE': return Object.assign({},state,{loadMessageType:'history'}) case 'LOADING_HISTORY_MESSAGE_SUCCESS': let messages=Object.assign({},state.messages) let newMessage=Object.assign({},messages,{history:action.messages}) return Object.assign({},state,{messages:newMessage}) case 'LOAD_CURRENT_MESSAGE': return Object.assign({},state,{loadMessageType:'current'}) case 'NEW_MESSAGE_CHANGE': return Object.assign({},state,{newMessage:action.msg}) case 'GET_NEW_MESSAGE': messages=Object.assign({},state.messages) messages.current.push(action.msg) newMessage=Object.assign({},messages) return Object.assign({},state,{messages:newMessage}) case 'SET_CURRENT_USER': return Object.assign({},state,{currentUser:action.user}) default: return initState } } export default chatReducer; ```
reducer.js
import {combineReducers} from 'redux';
import loginReducer from './reducers/loginReducer'
import chatReducer from './reducers/chatReducer'
export default combineReducers({
loginReducer,chatReducer
})
store.js
import { createStore, applyMiddleware } from 'redux';
import reducer from './reducer';
import logger from 'redux-logger';
import middlePromise from 'redux-promise';
import thunkMiddleware from 'redux-thunk';
const store = createStore(reducer,applyMiddleware(thunkMiddleware,middlePromise,logger));
export default store;
请问各位有遇到相同的情况吗?怎么解决的,求教。。。
看现象可能是你 loginReducer 写的有问题,你贴一下两个 reducer 的代码吧。