Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/409.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 调用一个操作会触发多个减缩器?_Javascript_React Native_Redux_React Redux_Redux Thunk - Fatal编程技术网

Javascript 调用一个操作会触发多个减缩器?

Javascript 调用一个操作会触发多个减缩器?,javascript,react-native,redux,react-redux,redux-thunk,Javascript,React Native,Redux,React Redux,Redux Thunk,我只在LoginAction中发送了一个操作,但它会触发三个减缩器。我不知道为什么 版本: “react”:“16.9.0”, “反应本机”:“0.61.2”, “react redux”:“^7.1.1”, “redux”:“^4.0.4”, “redux持久化”:“^6.0.0”, “redux thunk”:“^2.3.0”, 这是我的背景 App.js: import React from 'react'; import ReduxThunk from 'redux-thunk'; i

我只在
LoginAction
中发送了一个操作,但它会触发三个减缩器。我不知道为什么

版本:

“react”:“16.9.0”,
“反应本机”:“0.61.2”,
“react redux”:“^7.1.1”,
“redux”:“^4.0.4”,
“redux持久化”:“^6.0.0”,
“redux thunk”:“^2.3.0”,
这是我的背景

App.js:

import React from 'react';
import ReduxThunk from 'redux-thunk';
import { Provider } from 'react-redux';
import { compose, createStore, applyMiddleware } from 'redux';
// import { persistStore } from 'redux-persist';
// import { PersistGate } from 'redux-persist/integration/react';
import reducers from './src/reducers';
import AppContainer from './src/navigator' // It is my react-navigation route

const composeEnhancers = window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ || compose;

const App: () => React$Node = () => {
  if (!__DEV__) {
    console.log = () => {};
  }

  const store = createStore(reducers, {}, composeEnhancers(applyMiddleware(ReduxThunk)));

  return (
    <Provider store={store}>
      <AppContainer />   
    </Provider>     
  );
};

export default App;
我的减速器设置: reducers/index.js

import { combineReducers } from 'redux';
import LoginReducer from './LoginReducer';
import StoreReducer from './StoreReducer';
import ReservationReducer from './ReservationReducer';

export default combineReducers({
  LoginRedux: LoginReducer,
  StoreRedux: StoreReducer,
  ReservationRedux: ReservationReducer
});
My LoginReducer.js:(StoreReducer和ReservationReducer与LoginReducer相同)

调用操作组件LoginScreen.js:

import React, { Component } from 'react';
import { 
  // some view
} from 'react-native';
import { connect } from 'react-redux';
import { login, closeLoadingCheckModal, testAction } from '../actions';

class LoginScreen extends Component {
  constructor(props) {
    super(props);

    this.state = { 
      // some states
    };
  }

  render() {
    return (
      <View>
        <TouchableOpacity onPress={() => { this.props.testAction() }>
          <Text>Press Test Action</Text>
        </TouchableOpacity>
      </View>
    );
  }
const mapStateToProps = (state) => {
  const { ...some store value  } = state.LoginRedux;

  return { ...some store value  };
};

}

export default connect(mapStateToProps, { login, closeLoadingCheckModal, testAction })(LoginScreen);
import React,{Component}来自'React';
导入{
//一些看法
}从“反应本机”;
从'react redux'导入{connect};
从“../actions”导入{login,closeLoadingCheckModal,testAction};
类LoginScreen扩展组件{
建造师(道具){
超级(道具);
this.state={
//一些州
};
}
render(){
返回(
{this.props.testAction()}>
试压动作
);
}
常量mapStateToProps=(状态)=>{
const{…some store value}=state.LoginRedux;
返回{…某些存储值};
};
}
导出默认连接(MapStateTrops,{login,closeLoadingCheckModal,testAction})(LoginScreen);
当我触发动作时,所有减速器都将被触发

它应该只支持控制台日志
Login reducer=>

有人知道我有什么问题吗


如果多个还原程序实现相同的操作类型,则一个操作确实可以结束更新多个还原程序。在您的情况下,所有三个减速机都会侦听类型为
TEST\u ACTION
的操作。如果你不希望出现这种行为,你应该确保动作类型在整个应用程序中是唯一的,例如,通过基于reducer的前缀动作

export const testAction = () => {
  return (dispatch) => {
    dispatch( { type: 'LOGIN_TEST_ACTION' });
  }
}

如果您使用的是
组合减速机
,则所有切片减速机将针对每个已调度的操作运行。这是一个给定减速器是否实际计算新状态的问题


有关更多详细信息,请参阅。

这是预期的行为。所有减速器“看到”每个动作。他们根据action.type决定是否响应。如果您不想让一个函数响应某个特定的类型,就不要在该减速机中实现该类型。
import React, { Component } from 'react';
import { 
  // some view
} from 'react-native';
import { connect } from 'react-redux';
import { login, closeLoadingCheckModal, testAction } from '../actions';

class LoginScreen extends Component {
  constructor(props) {
    super(props);

    this.state = { 
      // some states
    };
  }

  render() {
    return (
      <View>
        <TouchableOpacity onPress={() => { this.props.testAction() }>
          <Text>Press Test Action</Text>
        </TouchableOpacity>
      </View>
    );
  }
const mapStateToProps = (state) => {
  const { ...some store value  } = state.LoginRedux;

  return { ...some store value  };
};

}

export default connect(mapStateToProps, { login, closeLoadingCheckModal, testAction })(LoginScreen);
export const testAction = () => {
  return (dispatch) => {
    dispatch( { type: 'LOGIN_TEST_ACTION' });
  }
}