Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 连接的组件不';更改redux存储后,请不要重新渲染。_Javascript_Reactjs_Redux_React Redux - Fatal编程技术网

Javascript 连接的组件不';更改redux存储后,请不要重新渲染。

Javascript 连接的组件不';更改redux存储后,请不要重新渲染。,javascript,reactjs,redux,react-redux,Javascript,Reactjs,Redux,React Redux,更改redux存储后,我连接的组件不会重新渲染 商店结构: { user: { profile: { email: null } } } 我正在发送更新操作创建者: dispatch(profile.actions.update({email:'blah@blah.com'})); 它会更新存储状态,但不会重新呈现连接的ProfilePage组件 - /ProfilePage.js(连接的组件) /profileReducer.js(其中拦截更新操作)

更改redux存储后,我连接的组件不会重新渲染

商店结构:

{
  user: {
    profile:  {
      email: null
    }
  } 
}
我正在发送更新操作创建者:

dispatch(profile.actions.update({email:'blah@blah.com'}));

它会更新存储状态,但不会重新呈现连接的ProfilePage组件

-

/ProfilePage.js(连接的组件)

/profileReducer.js(其中拦截更新操作)

/userReducer.js

import { combineReducers } from 'redux';
import session from './session';
import profile from './profile';

export default combineReducers({
  profile: profile.reducer
});
/rootReducer.js

import {combineReducers} from 'redux'; 
import {routerReducer as router} from 'react-router-redux';
import { reducer as form } from 'redux-form';
import user from './modules/user';

const rootReducer = combineReducers({  
  form,
  user: user.reducer, 
   router
})

export default rootReducer; 
import reducer from './rootReducer';
import thunk from 'redux-thunk'
import logger from 'redux-logger'

import { createStore, compose, applyMiddleware } from 'redux';
import { routerMiddleware as router } from 'react-router-redux';

export default function(history) {
  return createStore(
    reducer, 
    compose(
      applyMiddleware(
        router(history),
    thunk,
    logger
      )
    )
  )
}
/store.js

import {combineReducers} from 'redux'; 
import {routerReducer as router} from 'react-router-redux';
import { reducer as form } from 'redux-form';
import user from './modules/user';

const rootReducer = combineReducers({  
  form,
  user: user.reducer, 
   router
})

export default rootReducer; 
import reducer from './rootReducer';
import thunk from 'redux-thunk'
import logger from 'redux-logger'

import { createStore, compose, applyMiddleware } from 'redux';
import { routerMiddleware as router } from 'react-router-redux';

export default function(history) {
  return createStore(
    reducer, 
    compose(
      applyMiddleware(
        router(history),
    thunk,
    logger
      )
    )
  )
}

我的猜测是,用户对象与更新之前是同一个对象,因此redux假设没有任何更改。在用户界面中使用轮廓减速器和组合减速器似乎是不必要的,可能会产生意想不到的后果。您应该直接在user reducer中添加一个profile字段,并返回一个新的user对象。更好的方法是将email字段放在用户对象中,并将其放在一起

我似乎意外地初始化了两个单独的存储实例。调度(在安装应用程序组件时调用)使用的是不同的存储。这就是为什么它没有重新招标

    class App extends Component {
      componentDidMount(props) {
        const jwt = localStorage.getItem('jwt');
        if(!!jwt) {
**        store(history).dispatch(user.actions.fetchUserData(jwt))    // the offending code
        }
      }

      render() {
        return (
          <Provider store={ store(history) }>    // And here a different store instance 
            <ConnectedRouter history={ history }>
              <AppWrapper>
            <MainNav />
            <Main>
              <Switch>
            <Route path="/login" 
               component={ LoginPage } />
        <Route path="/register" 
               component={ RegisterPage } />
          </Switch>
             </Main>
          </AppWrapper>
        </ConnectedRouter>
          </Provider>
        );
      }
    }
    export default App;
类应用程序扩展组件{
组件安装(道具){
const jwt=localStorage.getItem('jwt');
如果(!!jwt){
**store(history).dispatch(user.actions.fetchUserData(jwt))//有问题的代码
}
}
render(){
返回(
//这里有一个不同的商店实例
);
}
}
导出默认应用程序;

我猜用户对象与以前的对象是相同的。根据我的理解,connect函数会比较您传入的对象/值。因此在我的例子中:
函数mapstatetops(state){return{initialFormValues:state.user.profile}
最初的值为
{email:null}
,然后更新为
{email:'blahblah@blah.com“}
。因为这是一个不同的对象,所以连接的组件应该在订阅存储时重新呈现。还是我误解了什么?