Невозможно получить доступ к состоянию редуктора в контейнере - PullRequest
0 голосов
/ 08 сентября 2018

Мой логин:

import React, { Component } from 'react'
import {
  View,
  Text,
  StyleSheet,
  TextInput,
  TouchableOpacity
} from 'react-native'

export class Login extends Component {
  onChangeText = (key, value) => {
    this.props.setUserDetails({
     ...this.props.user,
     [key]: value
    })
 }

  render() {
    const { user, onSubmitForm } = this.props
    console.log(this.props.user) //  user undefined here
    return (
      <View style={styles.container}>
        <Text style={styles.heading}>Login</Text>
        <TextInput
          placeholder='Email'
          onChangeText={val => this.onChangeText('email', val)}
          style={styles.input}
          value={user.email}
        />
        <TextInput
          placeholder='Password'
          onChangeText={val => this.onChangeText('password', val)}
          style={styles.input}
          value={user.password}
        />
        <TouchableOpacity onPress={() => onSubmitForm(user)}>
          <View style={styles.button}>
            <Text style={styles.buttonText}>Submit</Text>
          </View>
        </TouchableOpacity>
      </View>
    )
  }
}

Мой логин контейнер:

import React, { Component } from 'react'
import { setUserDetails } from '../actions/loginActions'
import { connect } from 'react-redux'
import loginReducer from '../reducers/loginReducer'
import { Login } from '../components/login'

export class LoginContainer extends Component {

  onSubmitForm = () => {
    // Checking Validations 
    const { name, email } = this.props;
    if (!name || !email) {
      alert('Please fill the form')
      console.log(this.props.user) // It says undefined
      return;
    }
  }

  render () {
    return (
      <Login
        user={this.props.user}
        setUserDetails={this.props.setUserDetails}
        onSubmitForm={this.onSubmitForm}
      />
    )
  }
}

const mapStateToProps = (state) => ({
  user: state.loginReducer.user,
})

const mapDispatchToProps = dispatch => ({
  setUserDetails: payload => dispatch(setUserDetails(payload)),
})

export default connect(mapStateToProps, mapDispatchToProps)(Login)

Мой логин Редуктор:

const initialState = {
  user: {
    email: '',
    password: '',
  }
}

const loginReducer = (state = initialState, action) => {
  switch(action.type) {
    case SET_USER_DETAILS:
      return Object.assign({}, state, {
        user: action.user
      })
    default:
      return state
  }
  return state
}

export default loginReducer

Мой корень Редуктор:

import { combineReducers } from 'redux';
import loginReducer from './loginReducer'
const rootReducer = combineReducers({
  loginReducer
})

export default rootReducer

МОЯ конфигурация магазина:

import { createStore } from 'redux'
import { persistStore, persistReducer } from 'redux-persist'
import storage from 'redux-persist/lib/storage'
import rootReducer from './reducers'

const persistConfig = {
  key: 'mykey',
  storage,
}

const persistedReducer = persistReducer(persistConfig, rootReducer)
const store = createStore(persistedReducer)
const persistedStore = persistStore(store)

export default store
Я изучаю родной React и пытаюсь реализовать некоторые функции. Проблема в том, что я просто не могу получить доступ к своему this.props.user в контейнере Login, когда вызывается submit. Чего мне не хватает в этом сценарии? Любая помощь приветствуется.

Ответы [ 2 ]

0 голосов
/ 08 сентября 2018

Я заметил странную вещь. Ваш экспорт по умолчанию LoginContainer.js связан с Login компонентом. Я думаю, что вы действительно имели в виду вместо этого:

// ...imports

export class LoginContainer extends Component { 
  // ...
}

//...

export default connect(mapStateToProps, mapDispatchToProps)(Login)

чтобы использовать это:

// ...imports

// no need to 'export class ...' here.
class LoginContainer extends Component { 
  // ...
}

// ...

export default connect(mapStateToProps, mapDispatchToProps)(LoginContainer)
0 голосов
/ 08 сентября 2018

В контейнере вы использовали:

const mapStateToProps = (state) => ({
    user: state.loginReducer.user,
})

Но в вашем начальном состоянии нет loginReducer. Maibe это работает:

const mapStateToProps = (state) => ({
    user: state.user
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...