【发布时间】:2019-01-30 04:11:06
【问题描述】:
以下是相关文件。 在reducer中,当它运行时...
return {
loggedIn: action.loggedIn
};
我期待它用该信息替换状态。 当我在 LoginForm 中运行这段代码时,我得到了旧的状态输出。
this.props.onLogin();
console.log(this.props.loggedIn);
我希望我在这里忽略了一些简单的事情。其他一切似乎都按照我的预期工作。我可以直接在 切换使用...
state.loggedIn = action.loggedIn;
它按预期工作。谁能阐明我做错了什么?
动作
import { LOGGED_IN } from './actionTypes';
export const loggedIn = () => {
return {
type: LOGGED_IN,
loggedIn: true,
};
};
减速器
import {
LOGGED_IN
} from "../actions/actionTypes";
const initialState = {
loggedIn: false,
};
const reducer = (state = initialState, action) => {
switch (action.type) {
case LOGGED_IN:
return {
loggedIn: action.loggedIn
};
default:
return state;
}
};
export default reducer;
import React, { Component } from 'react';
import { Text } from 'react-native';
import { Button, Card, CardSection, Input, Spinner } from './common';
import { Actions } from 'react-native-router-flux';
import firebase from '../Fire';
import { connect } from "react-redux";
import {
loggedIn
} from "../store/actions";
登录表单 类 LoginForm 扩展组件 {
onButtonPress() {
this.onLoginSuccess();
}
onLoginSuccess() {
this.props.onLogin();
console.log(this.props.loggedIn);
Actions.main({});
}
renderButton() {
return (
<Button onPress={this.onButtonPress.bind(this)}>
Log in
</Button>
);
}
render() {
return (
<Card>
<CardSection>
<Input
placeholder="user@gmail.com"
label="Email"
</CardSection>
<CardSection>
<Input
secureTextEntry
placeholder="password"
label="Password"
/>
</CardSection>
<CardSection>
{this.renderButton()}
</CardSection>
</Card>
);
}
}
const styles = {
errorTextStyle: {
fontSize: 20,
alignSelf: 'center',
color: 'red'
}
};
const mapStateToProps = state => {
return {
loggedIn: state.loggedIn
};
};
const mapDispatchToProps = dispatch => {
return {
onLogin: () => dispatch(loggedIn()),
};
};
export default connect(mapStateToProps, mapDispatchToProps)(LoginForm);
配置存储
import { createStore, combineReducers } from 'redux';
import prolinkReducer from './reducers/prolink';
const rootReducer = combineReducers({
loggedIn: prolinkReducer
});
const configureStore = () => {
return createStore(rootReducer);
};
export default configureStore;
【问题讨论】:
-
我不是 react/redux 专家,但我想知道 dispatch 函数是否是异步的,所以你调用 onLogin 并在 reducer 更新之前立即打印当前状态。尝试将 console.log(this.props.loggedIn) 包装在一个延迟 100 毫秒的 setTimeout 中,看看它是否打印出您期望的正确值,因为这表明调度是一个异步调用
-
好主意,我会试试看的。
-
没有运气尝试这个。
-
你在使用多个reducer吗?我的意思是 combineReducers?
-
我们使用 1 个 reducer 和 combineReducers。
标签: react-native redux react-redux