Как обновить состояние в response-redux? - PullRequest
0 голосов
/ 27 мая 2018

Я сделал форму отправки.Я сделал userReducer, где user[] - это массив, а каждый элемент массива имеет firstname, lastname, emailid и т. Д. Когда я нажимаю кнопку отправки, он показывает элемент массива [0], но когда я нажимаю кнопку очистки и сновапопробуйте заполнить форму и попытаться отправить, ни один пользователь не будет добавлен снова, т.е. состояние не обновляется.Как решить эту проблему?

Компонент формы (form.js):

import React, { Component } from 'react';
import { connect } from 'react-redux';
import * as action from '../actions/actions';


import './form.css';

class Form extends Component {
    constructor(props) {
    super(props);
    this.setFirstName = this.setFirstName.bind(this);
    this.setLastName = this.setLastName.bind(this);
    this.setEmailId = this.setEmailId.bind(this);
    this.setIban = this.setIban.bind(this);
    this.setBankName = this.setBankName.bind(this);
    this.showUser = this.showUser.bind(this);
    this.reset = this.reset.bind(this);

     console.log(this.props);

    }

    setFirstName(event) {
    this.props.dispatch(action.setFirstName(event.target.value));
    }

    setLastName(event) {
    this.props.dispatch(action.setLastName(event.target.value));
    }

    setEmailId(event) {
    this.props.dispatch(action.setEmailId(event.target.value));
    }

    setIban(event) {
    this.props.dispatch(action.setIban(event.target.value));
    }

    setBankName(event) {
    this.props.dispatch(action.setBankName(event.target.value));
    }

    showUser(){
        const jsonobj = this.props;
        alert(JSON.stringify(jsonobj));
    }

    reset(){
        this.props.dispatch(action.setFirstName(''));
        this.props.dispatch(action.setLastName(''));
        this.props.dispatch(action.setEmailId(''));
        this.props.dispatch(action.setIban(''));
        this.props.dispatch(action.setBankName(''));
    }


  render(){
    return(
      <div>
          <div id="center">
              <form>
                    <div className="form-group">
                         <label htmlFor="firstname">First Name:</label>
                         <input type="firstname" className="form-control" id="firstname" value={this.props.firstname} onChange={this.setFirstName} required/>
                    </div>

                    <div className="form-group">
                         <label htmlFor="lastname">Last Name:</label>
                         <input type="lastname" className="form-control" id="lastname" value={this.props.lastname} onChange={this.setLastName} required/>
                    </div>

                    <div className="form-group">
                        <label htmlFor="email">Email address:</label>
                        <input type="email" className="form-control" id="email" value={this.props.emailid} onChange={this.setEmailId} required/>
                    </div>

                    <div className="form-group">
                         <label htmlFor="bankacc">IBAN:</label>
                         <div id="deletebank" className="items">
                         <input type="bankacc" className="form-control" id="bankacc" value={this.props.iban} onChange={this.setIban} required/>
                         <button type="button" className="btn btn-default btn-sm">
                            <span className="glyphicon glyphicon-trash"></span> 
                         </button>
                         </div>
                    </div>

                    <div className="form-group">
                         <label htmlFor="bankname">Bank Name:</label>
                         <input type="bankname" className="form-control" id="bankname" value={this.props.bankname} onChange={this.setBankName} required/>
                    </div>

                    <div className="form-group">
                        <div id="buttons" className="items">
                            <button type="button" class="btn btn-warning" onClick={this.reset}>Clear Input</button>
                            <button type="button" className="btn btn-success" onClick={this.showUser}>Submit</button>
                        </div>
                    </div>


              </form>
          </div>
      </div>

    )}


}

const mapStateToProps = store => {
  return {
    firstname: store.user.firstname,
    lastname: store.user.lastname,
    emailid: store.user.emailid,
    iban: store.user.iban,
    bankname: store.user.bankname
  }
}

export default connect(mapStateToProps)(Form);

reducer.js:

const userReducer = (state = {
  user:[{
    firstname:'',
    lastname:'',
    emailid:'',
    bankaccounts:{
      iban:'',
      bankname:''
    }
  }]
  }, action) => {

  switch (action.type) {
    case 'SET_FIRSTNAME':{
      return {
        ...state,
        user:{...state.user, firstname: action.payload}
      }
    }

    case 'SET_LASTNAME':{
      return {
        ...state,
        user:{...state.user, lastname: action.payload}
      }
    }

    case 'SET_EMAILID':{
      return {
        ...state,
        user:{...state.user, emailid: action.payload}
      }
    }

    case 'SET_IBAN':{
      return {
        ...state,
        user:{...state.user, iban: action.payload}
      }
    }

    case 'SET_BANKNAME':{
      return {
        ...state,
        user:{...state.user, bankname: action.payload}
      }
    }
    default: return state;
  }

}

export default userReducer;

Actions.js:

export const SET_FIRSTNAME = 'SET_FIRSTNAME';
export const SET_LASTNAME = 'SET_LASTNAME';
export const SET_EMAILID = 'SET_EMAILID';
export const SET_IBAN = 'SET_IBAN';
export const SET_BANKNAME = 'SET_BANKNAME';


export function setFirstName(firstname){
    return {
        type:SET_FIRSTNAME,
        payload:firstname
    }
}

export function setLastName(lastname){
    return {
        type:SET_LASTNAME,
        payload:lastname
    }
}

export function setEmailId(emailid){
    return {
        type:SET_EMAILID,
        payload:emailid
    }
}

export function setIban(iban){
    return {
        type:SET_IBAN,
        payload:iban
    }
}

export function setBankName(bankname){
    return {
        type:SET_BANKNAME,
        payload:bankname
    }
}

store.js:

import { createStore } from 'redux';

import userReducer from './reducers/reducers';


const store = createStore(userReducer);

store.subscribe(() => {
    console.log('Store changed', store.getState());
})

export default store;

Снимок экрана:

enter image description here

enter image description here

1 Ответ

0 голосов
/ 27 мая 2018

Здесь есть куча вещей для решения, но основная проблема в том, что ваше состояние ожидает, что user будет массивом.Я думаю, что было бы очень разумно переименовать это users, чтобы не запутаться:

(я собираюсь удалить некоторые ключи, чтобы сделать это проще)

const initialState = {
  users: [ // note "users" not "user"
    {
      firstname: '',
      lastname: '',
    },
  ],
};

Ваш редуктороператоры switch не указывают, КАКОГО пользователя он должен обновлять.Если вы хотите просто начать с «добавления» нового пользователя, это может выглядеть примерно так:

const userReducer = (state = initialState, action) => {
  switch (action.type) {
    case "ADD_USER": {
      return {
        ...state,
        users: [...state.users, action.payload],
      };
    }
    default:
      return state;
  }
};

Здесь мы добавляем нового пользователя в массив users в виде action.payload, который долженсодержит все ключи, которые вы хотите от своего пользователя.

Теперь вы можете создать создателя действий, который будет немного более кратким

const addUser = user => ({
  type: 'ADD_USER',
  payload: user,
})

И ваша форма может быть значительно упрощена:

import * as actions from './actions'

class Form extends React.Component {
  state = {
    firstname: '',
    lastname: '',
  }

  render() {
    return (
      <form onSubmit={() => {
        this.props.dispatch(actions.addUser(this.state))
      }}>
        <input 
          value={this.state.firstname} 
          onChange={e => this.setState({ firstname: e.target.value })
        />
        <input 
          value={this.state.lastname} 
          onChange={e => this.setState({ lastname: e.target.value })
        />
      </form>
    )
  }
}

export default connect()(Form)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...