我理解这样的问题之前曾被多次提出过;但我已经耗尽了所有的资源和选择,无法弄清楚为什么这不起作用。当我创建动作" AUTHENTICATION_LOGOUT" 时,我可以将其追溯到动作减速器,并且可以从动作减速器中看到返回新状态,但是它不会被拾取在connect
组件中,因此mapStateToProps
不会运行。我为状态返回一个新对象,所以检查应该将其标记为状态变化而不是状态变异,对吧?
它可能是一个错误或版本不匹配?感谢。
:
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 生命周期钩子检查了它。它与状态变异没有任何关系。关于状态变异的所有谈话和帖子让我可怕地被抛弃了。感谢大家的宝贵帮助和时间。
答案 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
,这就是它(垃圾收集器的工作量稍微少一点: - ))。