【问题标题】:Can't connect components with mapDispatchToProps无法使用 mapDispatchToProps 连接组件
【发布时间】:2019-10-03 08:42:59
【问题描述】:

我有带有 Redux 的 React Native 项目,我正在尝试将操作连接到组件。 我有App.js 没有index.js 文件的文件。

这就是我实现 Redux 的方式:

App.js:

import React from 'react';
import { Platform, StatusBar, StyleSheet, View } from 'react-native';
import { Provider } from 'react-redux';

import store from './src/store/Store.js';
import AppNavigator from './src/navigation/AppNavigator';

export default function App(props) {
  return (
    <Provider store = { store }>
      <View style={styles.container}>
        {Platform.OS === 'ios' && <StatusBar barStyle="default" />}
        <AppNavigator />
      </View>
    </Provider>
  );
}

AppNavigator.js:

import React from 'react';
import { createAppContainer, createSwitchNavigator } from 'react-navigation';
import MainTabNavigator from './MainTabNavigator';

export default createAppContainer(
  createSwitchNavigator({
    Main: MainTabNavigator
  })
);

MainTabNavigator.js:(仅相关部分)

import React from 'react'
import {connect} from 'react-redux';
import { createStackNavigator, createBottomTabNavigator } from 'react-navigation';
import {HomeScreen} from '../screens/HomeScreen';
import * as CounterActions from '../store/actions/CounterActions';

let HomePage = connect(state => mapStateToProps)(HomeScreen);

const HomeStack = createStackNavigator(
    {
        Home: HomePage,
    },
    config
);

const tabNavigator = createBottomTabNavigator({
  HomeStack,
  SettingsStack,
});

const mapStateToProps = (state) => {
    return {
        count: state.counter.count
    }
};

const mapDispatchToProps = {
    ...CounterActions
};

export default tabNavigator;

CounterActions.js:

export const increment = (number) => {
    return (dispatch) => {
        dispatch({ type: 'INCREMENT', number })
    }
};

export const decrement = (number) => {
    return (dispatch) => {
        dispatch({ type: 'DECREMENT', number })
    }
};

MainTabNavigator.js 中的以下行将状态连接到 HomeScreen 组件的 props: let HomePage = connect(state =&gt; mapStateToProps)(HomeScreen);

HomeScreen.js:

import React from 'react';
import { Platform, StyleSheet, Text, View } from 'react-native';

export const HomeScreen = (props) => {
  alert(JSON.stringify(props));
  return (
    <View style={styles.container}>
      <Text>COUNT FROM STORE: {props.count}</Text>
    </View>
  );
};

HomeScreen 组件正确获取状态并呈现“计数”,但如何连接操作?

我希望 HomeScreen 像这样发送:

props.increment(1);

谢谢!

【问题讨论】:

    标签: react-native redux react-redux react-navigation react-native-navigation


    【解决方案1】:

    mapDispatchToPropsreact-redux.connect 函数的第二个参数

    我也认为您将第一个参数传递给 connect 是错误的。

    试试这个:

    let HomePage = connect(mapStateToProps, mapDispatchToProps)(HomeScreen);
    

    【讨论】:

    • 感谢您的回答!我已经尝试过了,但它不起作用......
    • 问题出在哪里? props.increment 未定义?控制台有错误吗?
    【解决方案2】:

    最后通过以下方式解决了:

    MainTabNavigator.js:

    import React from 'react'
    import {connect} from 'react-redux';
    import { createStackNavigator, createBottomTabNavigator } from 'react-navigation';
    import {HomeScreen} from '../screens/HomeScreen';
    import {increment, decrement} from '../store/actions/CounterActions';
    
    let HomePage = connect(state => mapStateToProps, dispatch => mapDispatchToProps(dispatch))(HomeScreen);
    
    const HomeStack = createStackNavigator(
        {
            Home: HomePage,
        },
        config
    );
    
    const tabNavigator = createBottomTabNavigator({
      HomeStack,
      SettingsStack,
    });
    
    const mapStateToProps = (state) => {
        return {
            count: state.counter.count
        }
    };
    
    const mapDispatchToProps = (dispatch) => {
        return {
            increment: (number) => dispatch(increment(number)),
            decrement: (number) => dispatch(decrement(number))
        }
    };
    
    export default tabNavigator;
    

    【讨论】:

    • 正如我在上面的回答中所说,您正在添加另一个不必要的功能。这已经足够了let HomePage = connect(mapStateToProps, mapDispatchToProps)(HomeScreen);。此外,mapStateToProps 可以接受多个参数,因此当您将来需要它并按照自己的方式进行操作时,您还需要将这些参数添加到您的函数中,这是您实现中connect 的第一个参数。如果它没有按照我建议的方式工作,那么问题出在其他地方,而不是在这里。
    【解决方案3】:

    接下来,我们将对您的文件进行一些修改:

    首先让我们修改您的MainTabNavigator.js,因为您只发布了相关部分,请确保对其余部分也执行此操作。

    import React from 'react'
    import { createStackNavigator, createBottomTabNavigator } from 'react-navigation';
    import {HomeScreen} from '../screens/HomeScreen';
    
    let HomePage = connect(state => mapStateToProps)(HomeScreen); // <===== Remove this
    
    const HomeStack = createStackNavigator(
        {
            Home: HomePage, // <===== Make this HomeScreen instead of HomePage
        },
        config
    );
    
    const tabNavigator = createBottomTabNavigator({
      HomeStack,
      SettingsStack,
    });
    
    const mapStateToProps = (state) => {
        return {
            count: state.counter.count
        }
    };
    
    const mapDispatchToProps = {
        ...CounterActions
    };
    
    export default tabNavigator;
    

    我们想要的是在主屏幕本身(或任何其他屏幕)上映射状态和道具

    现在让我们转到您的HomeScreen.js

    import React from 'react';
    import { connect } from 'react-redux';
    import { Platform, StyleSheet, Text, View } from 'react-native';
    
    import { increment, decrement } from '../store/actions/CounterActions';  // <===== import your actions here, preferably like this
    
    
    /** add the following: */
    
    const mapStateToProps = (state, ownProps) => ({
        // ... computed data from state and optionally ownProps
    });
    
    const mapDispatchToProps = {
        // ... normally is an object full of action creators
        increment,    // <===== Map your dispatch here to props
        decrement     // <===== Mapping the second dispatch
    };
    
    const HomeScreen = (props) => {
      alert(JSON.stringify(props));
      return (
        <View style={styles.container}>
          <Text>COUNT FROM STORE: {props.count}</Text>
        </View>
      );
    };
    
    /** Export your component like this */ 
    
    export default connect(
        mapStateToProps,
        mapDispatchToProps
    )(HomeScreen)
    

    现在,您可以在 HomeScreen.js 的任何地方致电 this.props.increment(yourNumber)this.props.decrement(yourNumber),一切顺利

    希望对您有所帮助!

    【讨论】:

    • 我这样做了,但仍然无法正常工作。我无法使用connect 导出默认HomeScreen。还是非常感谢!!
    • 不客气。但为了澄清起见,一旦您遵循此操作,您就不再需要export default HomeScreen,而是导出连接。查看编辑后的答案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-05
    • 2018-12-03
    • 2021-02-18
    • 1970-01-01
    • 1970-01-01
    • 2021-01-18
    • 2020-07-19
    相关资源
    最近更新 更多