首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Redux状态在组件中返回未定义的状态,即使在redux-logger报告使用有效负载中正确值的成功调度之后也是如此。

Redux状态在组件中返回未定义的状态,即使在redux-logger报告使用有效负载中正确值的成功调度之后也是如此。
EN

Stack Overflow用户
提问于 2020-05-20 23:35:18
回答 1查看 420关注 0票数 0

新手到这里来。在从后端服务获取值之后,我很难从组件道具中访问值。问题是,正确的值出现在有效载荷下的redux记录器中,我看到了一个成功的分派。

这是我的反应组件:

代码语言:javascript
复制
import React from 'react'
import Form from 'react-bootstrap/Form'
import Button from 'react-bootstrap/Button'
import { connect } from 'react-redux'
import { signIn } from '../../redux'

class SignIn extends React.Component{
    constructor(){
        super()
        this.state = {
            emailField: '',
            passwordField: ''
        }
    }

    onEmailChange = (event) => {
        this.setState({
            emailField: event.target.value
        })
    }

    onPasswordChange = (event) => {
        this.setState({
            passwordField: event.target.value
        })
    }

    render(){
        return(
            <div>
                <h1>Sign In</h1>
                <Form>
                    <Form.Group controlId="formBasicEmail" onChange={this.onEmailChange}>
                        <Form.Label>Email address</Form.Label>
                        <Form.Control type="email" placeholder="Enter email" />
                        <Form.Text className="text-muted"></Form.Text>
                    </Form.Group>

                    <Form.Group controlId="formBasicPassword" onChange={this.onPasswordChange}>
                        <Form.Label>Password</Form.Label>
                        <Form.Control type="password" placeholder="Password" />
                    </Form.Group>

                    <Form.Group controlId="formBasicCheckbox">
                        <Form.Check type="checkbox" label="Check me out" />
                    </Form.Group>

                    <Button variant="primary" onClick={() => {
                            this.props.signIn(this.state.emailField, this.state.passwordField)
                            console.log(this.props.userInfo)                        
                        }
                    }>

                        Submit
                    </Button>

                    <Button variant="primary" onClick={() => this.props.signIn(this.state.signIn(this.emailField, this.passwordField))}>
                        Register
                    </Button>
                </Form>
            </div>
        )
    }
}

const mapStateToProps = (state) => {
    return{
        userInfo: state.userInfo
    }
}

const mapDispatchToProps = (dispatch) => {
    return{
        signIn: (emailField, passwordField) => {
            dispatch(signIn(emailField, passwordField))
        }
    }
}

export default connect(mapStateToProps, mapDispatchToProps)(SignIn)

以下是我的行动:

代码语言:javascript
复制
import { SIGN_IN_REQUEST, SIGN_IN_SUCCESS, SIGN_IN_FAILURE } from './signInTypes'
import axios from 'axios'

export const signInRequest = () => {
    return {
        type: SIGN_IN_REQUEST
    }
}

export const signInSuccess = (userInfo) => {
    return {
        type: SIGN_IN_SUCCESS,
        payload: userInfo
    }
}

export const signInFailure = (error) => {
    return {
        type: SIGN_IN_FAILURE,
        payload: error
    }
}

export const signIn = (emailTextField, passwordTextField) => {
    return (dispatch) => {
        dispatch(signInRequest())
        fetch('https://testserver.com/signin', {
            method: 'post',
            headers: {
                'Content-Type': 'application/json'
            },
            body: JSON.stringify({
                email: emailTextField,
                password: passwordTextField
            })
        }).then(response => {
            return response.json()
        }).then(user => {
            if(user.user_id){
                dispatch(signInSuccess(user))
            }
        }).catch(error => {
            dispatch(signInFailure(error.message))
        })
    }
}

这是我的减速机:

代码语言:javascript
复制
import { SIGN_IN_REQUEST, SIGN_IN_SUCCESS, SIGN_IN_FAILURE } from './signInTypes'

const initialState = {
    loading: false,
    userInfo: {},
    error: ''
}

const signInReducer = (state = initialState, action) => {
    switch(action.type){
        case SIGN_IN_REQUEST:
            return{
                ...state,
                loading: true
            }
        case SIGN_IN_SUCCESS:
            return{
                loading: false,
                userInfo: action.payload,
                error: ''
            }
        case SIGN_IN_FAILURE:
            return {
                loading: false,
                userInfo: {},
                error: action.payload
            }
        default:
            return state
    }
}

export default signInReducer

我的期望是,this.props.userInfo应该包含有效负载包含的值,但不幸的是,它会返回未定义的值。

谢谢你们提供的任何帮助!

编辑:这是我的rootReducer:

代码语言:javascript
复制
import { combineReducers } from 'redux'
import signInReducer from './signIn/signInReducer'

const rootReducer = combineReducers({
    signIn: signInReducer
})

export default rootReducer
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-05-20 23:45:49

因为你的根减速器是:

代码语言:javascript
复制
const rootReducer = combineReducers({
    signIn: signInReducer
})

那么userInfo实际上在state.signIn中,因此mapStateToProps需要如下所示:

代码语言:javascript
复制
const mapStateToProps = (state) => {
    return{
        userInfo: state.signIn.userInfo
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61924689

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档