没有调用MapStateToProps

时间:2018-05-31 19:51:49

标签: redux react-redux

我理解这样的问题之前曾被多次提出过;但我已经耗尽了所有的资源和选择,无法弄清楚为什么这不起作用。当我创建动作" AUTHENTICATION_LOGOUT" 时,我可以将其追溯到动作减速器,并且可以从动作减速器中看到返回新状态,但是它不会被拾取在connect组件中,因此mapStateToProps不会运行。我为状态返回一个新对象,所以检查应该将其标记为状态变化而不是状态变异,对吧? 它可能是一个错误或版本不匹配?感谢。

在auth_actions中

export const appLogout = () => async dispatch => {
    await AsyncStorage.removeItem(USER);
    dispatch({ type: "AUTHENTICATION_LOGOUT" });
};
<\ n>在auth_reducer.js中

export default function (state = {}, action) {
        switch (action.type) {
            case "AUTHENTICATION_SUCCESS":
                return { user: action.payload };
            case "AUTHENTICATION_LOGOUT":
                return {user: null };
            default:
                return state;
        }
    }

在reducers文件夹中的index.js中:

export default combineReducers({
    search, auth
});
AuthComponent.js中的

import React, { Component } from 'react';
import { Text, TouchableOpacity, View } from 'react-native';
import { connect } from 'react-redux';
class AuthScreen extends Component {
 ...
}

function mapStateToProps(state) {
    let { auth } = state;
    return { user: auth.user };
}

export default connect(mapStateToProps, actions)(AuthScreen);

和商店:

const store = createStore(
    reducers,
    {},
    compose(
        applyMiddleware(thunk)
    )
);

export default store;

在App.js中

import store from './store';
import { Provider } from 'react-redux';
export default class App extends React.Component {
  render() {
    return (
      <Provider store={store}>
        <MainNavigation />
      </Provider>
    );
  }
}

的package.json:

"dependencies": {
    "axios": "^0.18.0",
    "expo": "^27.0.0",
    "react": "16.3.1",
    "react-native": "https://github.com/expo/react-native/archive/sdk-27.0.0.tar.gz",
    "react-redux": "^5.0.7",
    "redux": "^3.7.2",
    "redux-thunk": "^2.2.0"
  }

更新 经过大量的挖掘,我发现了问题所在。这里的问题,当然我没有看到,是因为这个组件已卸载,因此根本没有收到任何状态更新。我使用 componentWillUnmount 生命周期钩子检查了它。它与状态变异没有任何关系。关于状态变异的所有谈话和帖子让我可怕地被抛弃了。感谢大家的宝贵帮助和时间。

2 个答案:

答案 0 :(得分:0)

永远不要使用本机反应,所以也许我想念一个东西,但我相信redux期望dispatch参数中的动作是一个返回实际动作对象的函数。此函数也应该从另一个文件导入。

检查AUTHENTICATION_LOGOUT值是否为字符串

使用es6你的mapStateToProps会更好:

({auth: {user}) => ({user})

答案 1 :(得分:0)

您可能忘记使用react-redux Provider

另一个提示,您可以像这样改进mapStateToProps功能:

const mapStateToProps = ({auth}) => auth;

或者如果您使用的是ramda:

const mapStateToProps = prop('auth');

您不需要在mapStateToProps函数中创建新对象,因为reducer已经在执行此操作。请注意,auth是一个具有单个属性的对象:user,因此您可以从状态中获取auth,这就是它(垃圾收集器的工作量稍微少一点: - ))。