Добавление двух входных значений в одно состояние Reactjs

Я хочу добавить поле trip_start и trip_end в одном состоянии под названием name, чтобы при отправке данных они объединялись в одно поле name.

Вот что происходит, когда я отправляю данные, когда я щелкаю в первый раз, когда состояние для name показывает null, когда я нажимаю второй раз, когда состояние name заполняется данными trip_start и trip_end.

Ниже мой код:

export class DriverPage extends React.Component {

    constructor(props) {
        super(props);

        this.state = {
            name: '',
            trip_start:'',
            trip_end:'',
            nameError:'',
            details:'',
            detailsError:'',
            price: '',
            priceError:'',
            driver_name: localStorage.getItem('username')
        };

        this.handleSubmit = this.handleSubmit.bind(this);
        this.handleChangeEvent = this.handleChangeEvent.bind(this);

    }

    handleSubmit = (event) => {
        event.preventDefault();
        console.info('state ', this.state.name)
        this.setState({name:''+this.state.trip_start+' to ' + this.state.trip_end});

       };

  handleChangeEvent =(evt) => {
        this.setState({ [evt.target.name]: evt.target.value });
    }

Ниже мой компонент, содержащий HTML-код:

export const DriverComponent = ({handleSubmit, handleChangeEvent,obj})=>(

    <div className = {'bg-image'}>
            <Card className = {'landing-card'}>
                <form onSubmit = {handleSubmit}>
                <Row>
                    <Col s = {12} m = {12} l = {12}>
                        <label s = {12} l = {12} className = {'header'}>  Make Ride Request </label>
                    </Col>
                    <Input s = {12} l = {12} type = {'text'} value = {obj.trip_start} label = "Trip Start" name='trip_start'  onChange = {handleChangeEvent}/>

                    <Input s = {12} l = {12} type = {'text'} value = {obj.trip_end} label = "Trip End" name='trip_end'  onChange = {handleChangeEvent}/>

                    <Col s = {12} m = {12} l = {6}>
                        <div className = {'errors'} s = {10}>{obj.nameError}</div>
                    </Col>
                    <div className = "input-field col s12">
                        <textarea id = "details" name='details' onChange = {handleChangeEvent} className = "materialize-textarea"></textarea>
                        <label htmlFor = "details">Trip Details</label>
                    </div>
                    <Col s = {12} m = {12} l = {6}>
                        <div className = {'errors'}>{obj.detailsError}</div>
                    </Col>
                    <Input s = {12} l = {12} type = "text" value = {obj.price} label = "Price" name='price' onChange = {handleChangeEvent} />
                    <Col s = {12} m = {12} l = {6}>
                        <div className = {'errors'}>{obj.priceError}</div>
                    </Col>
                    <Col s = {12} m = {12} l = {12}>
                        <Button waves='light' className = {`purple button-align`} value='submit' type='submit' >Create Ride Request</Button>
                    </Col>
                </Row>
                </form>
            </Card>
    </div>
);

Таким образом, я хочу, чтобы состояния trip_start и trip_end были объединены в состояние name мгновенно, пока я собираюсь отправлять данные.

Например, это простой псевдокод того, чего я хочу достичь:

trip_start = new york
trip_end = toronto

name = trip_start + "to " +trip_end

Output 

name = new york to toronto

Что вы имеете в виду под «самим набором данных после двойного щелчка». Вы имеете в виду отправку формы? Где вы хотите объединить эти поля?

Kort 10.11.2018 17:46

Я думаю, вам лучше держать два значения отдельно, это поможет вам легче управлять формой

Hafeez Hamza 10.11.2018 17:46

@Kort, я редактировал эту строку.

Idris Stack 10.11.2018 17:51

@HafeezHamza, дайте мне подсказку.

Idris Stack 10.11.2018 17:51

Непонятно, о чем вы спрашиваете. У вас есть два значения состояния, которые нужно отслеживать; если вы хотите, чтобы name отслеживал эти изменения, при обновлении любого из входных данных вам следует обновить состояние name.

Dave Newton 10.11.2018 17:53

двойное нажатие кнопки отправки - ваша единственная проблема, затем замените handleSubmitsetState на следующий this.setState({name:''+this.state.trip_start+' to ' + this.state.trip_end}, () => console.info(this.state.name));

Hafeez Hamza 10.11.2018 17:57

@DaveNewton, я включил псевдокод внизу сообщения, я думаю, это могло бы дать больше толкования.

Idris Stack 10.11.2018 18:00

@IdrisStack, пожалуйста, добавьте код для handleChangeEvent()

Kort 10.11.2018 18:09

@Kort, я поделился этим.

Idris Stack 10.11.2018 18:11
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
0
9
2 763
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Есть ли причина, по которой это должно быть конкатенированное представление до? Похоже, вы усложняете себе жизнь, комбинируя две струны асинхронныйсинхронно. Вместо этого просто упростите себе жизнь и объедините отправку формы на.

Объединенный пример отправки формы (лучшее решение): https://codesandbox.io/s/10w18m5z54

контейнеры / Form.js

import React, { Component } from "react";
import Fields from "../components/Fields";

export default class Form extends Component {
  state = {
    tripStart: "",
    tripEnd: ""
  };

  handleChangeEvent = ({ target: { value, name } }) =>
    this.setState({
      [name]: value
    });

  handleSubmit = e => {
    e.preventDefault();
    const { tripEnd, tripStart } = this.state;
    const name = `${tripStart} to ${tripEnd}`;
    alert(name);
  };

  render = () => (
    <Fields
      {...this.state}
      handleSubmit = {this.handleSubmit}
      onHandleChange = {this.handleChangeEvent}
    />
  );
}

Пример конкатенирован на примере изменения ввода (работает, но нет - идеальное решение, поскольку вызывает двойную повторную визуализацию - также, this.state.name никогда не используется в вашем компоненте, поэтому использование state - это ненужный и не рекомендуется!): https://codesandbox.io/s/nk66v4rk9j

контейнеры / Form.js

import React, { Component } from "react";
import Fields from "../components/Fields";

export default class Form extends Component {
  state = {
    tripStart: "",
    tripEnd: ""
  };

  handleChangeEvent = ({ target: { value, name } }) =>
    this.setState(
      {
        [name]: value
      },
      () =>
        this.setState({
          name: `${this.state.tripStart} to ${this.state.tripEnd}`
        })
    );

  handleSubmit = e => {
    e.preventDefault();
    const { name } = this.state;
    alert(name);
  };

  render = () => (
    <Fields
      {...this.state}
      handleSubmit = {this.handleSubmit}
      onHandleChange = {this.handleChangeEvent}
    />
  );
}

Другие вопросы по теме