在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問(wèn)答/HTML/ redux在工具類(lèi)的js里調(diào)用store.dispatch改變狀態(tài)后組件無(wú)法自動(dòng)

redux在工具類(lèi)的js里調(diào)用store.dispatch改變狀態(tài)后組件無(wú)法自動(dòng)更新

1.問(wèn)題如下:隨便在一個(gè)js工具類(lèi)里面獲取store之后,再store.dispatch(actions),改變了狀態(tài)后頁(yè)面無(wú)法自動(dòng)更新?只能在用頁(yè)面組件connect自動(dòng)注入到props里面的dispatch改變的狀態(tài)才能自動(dòng)更新頁(yè)面?

2.代碼如下

Home 頁(yè)面組件:

class Home extends Component{
    constructor(props){
        super(props);
        this.goUser = this.goUser.bind(this)
    }
    goUser() {
        let {dispatch} = this.props;
        // 通過(guò)注入的dispatch對(duì)象調(diào)用就正常,能觸發(fā)頁(yè)面自動(dòng)更新
         **dispatch(setDialogState({showDialog: true}));**
         // 通過(guò)工具類(lèi)就不

> 引用文字

行,狀態(tài)改變后無(wú)法觸發(fā)頁(yè)面更新
          **utils.setDialogState({showDialog: true});**
        this.props.history.push('/user')
    }
    render() {
        return (
          <div>
            <h3>home</h3> 
            <button onClick={this.goUser}>去用戶中心頁(yè)面</button>
          </div>
        )
    }
}
export default connect()(Home);

utils.js文件如下:

import storeConfigure from '../store';
import  {setDialogState} from '../actions';
const appStore = storeConfigure()
export default {
  setDialogState: function(data){
    appStore.dispatch(setDialogState(data))
  }
}

user.js頁(yè)面組件

import React,{Component} from 'react';
import Dialog from './Dialog';
import { connect } from 'react-redux'
class User extends Component{
    constructor(props){
        super(props);
    }
    componentWillMount() {
        alert('componentWillMount user')
    }
    componentWillReceiveProps(nextProps){
      alert('componentWillReceiveProps user')
    }
    render() {
        return (
          <div>
            <h3>user</h3>
            <Dialog show={this.props.showDialog}/>
          </div>
        )
    }

}
const mapStateToProps = function(state) {
    return {
      showDialog:  state.app.showDialog
    }
}
export default connect(mapStateToProps)(User);

reducers文件夾下的app分塊的js內(nèi)容如下

import * as types from '../actions/actionType'
let initialState = {
    showDialog: false
}
export function app(state=initialState,action){
    switch(action.type){
        case types.SET_DIALOG_STATE:
          return Object.assign({},initialState,action.data);
          break;
        default :
          return Object.assign({},initialState,action.data);
          break;
    }
}

store.js如下:

import {createStore} from 'redux';
import reducers from '../reducers';

export default function configureStore(initialState) {
  let store = createStore(reducers, initialState,
    // 觸發(fā) redux-devtools
    window.devToolsExtension ? window.devToolsExtension() : undefined
  );
  return store;
}
回答
編輯回答
伐木累

connect是鏈接redux和react的橋梁,你的store.dispatch這里應(yīng)該是這是在于redux相關(guān)操作

2018年5月7日 11:46
編輯回答
柒槿年
import {createStore} from 'redux';
import reducers from '../reducers';

export default function configureStore(initialState) {
  let store = createStore(reducers, initialState,
    // 觸發(fā) redux-devtools
    window.devToolsExtension ? window.devToolsExtension() : undefined
  );
  return store;
}


這里寫(xiě)的有問(wèn)題
你這里在App.js根組件里面引用的時(shí)候
是createStore(),創(chuàng)建了一個(gè)新的store對(duì)象,在utils里面又createStore()創(chuàng)建了一個(gè)新的對(duì)象,
這樣違反了單一store原則。

解決方法是在store.js里面應(yīng)該怎么寫(xiě):
const store = createStore()
expoert default store 


然后其他地方直接import store from './store'后調(diào)用 store.dispatch 跟你connect的store保持一致。
2018年5月14日 15:00