React Native Redux: реквизиты не определены - PullRequest
0 голосов
/ 03 октября 2019

Как вызвать функцию обратного вызова? Или как установить состояние после получения данных mapStateToProps?


RegistrationContainers:


function mapStateToProps(state, props) {
  return {
     isRegistered: state.user.registered  // isRegistered: 1
  };


function mapDispatchToProps(dispatch, props) {
  return {
     registration:(data) => dispatch(registration(data))
  };

RegistrationComponents:


onRegister(){
 let email = this.state.email;
 let password = this.state.password;
 let registerData = {email:email,password:password};

 registerData = JSON.stringify(registerData);

 this.props.registration(registerData)
 this.setState({isRegistered: this.props.isRegistered}) // isRegistered: undefined, but second run after is correct

действия по регистрации:


export function OnRegistration(registered) {
/* ... */
return registered  }

export function registration(regData) {
return (dispatch) => {

    sendDataToApi(regData, "registration",(isRegistered)=>{
        dispatch({
            type: ON_REGISTRATION,
            registered: isRegistered
        })

    })
  }
}

редуктор регистрации:


const initialState = {};
export function loginReducer(state = initialState, action) {
switch(action.type){
    case REGISTRATION:

        return Object.assign({},state,{
            registered: action.registered
        })
}

return state; }

Контейнеры получают текущее состояние, но реквизиты контейнеров не могут получить доступ от компонентов.

1 Ответ

0 голосов
/ 03 октября 2019

измените ваши методы, добавив функции обратного вызова (). т.е.

function mapDispatchToProps(dispatch, props) {
  return {
     registration:(data, cb = null) => dispatch(registration(data, cb))
  };

и изменить метод registration(data) на:

registration(data, cb) {
 /* your code here */
 /* on successful registration, set user.registered to true in redux and 
  then call cb function */
 cb && cb();
}

изменить метод onRegister() на:

onRegister(){
 let email = this.state.email;
 let password = this.state.password;
 let registerData = {email:email,password:password};

 registerData = JSON.stringify(registerData);

 this.props.registration(registerData, () => {
     this.setState({isRegistered: this.props.isRegistered}) 
   }
 })
...