Как правильно собирать данные формы React из дочернего компонента в родительский без redux?

405
11 февраля 2018, 01:45

Была бы кнопка сабмита, я бы повесил на неё и передал все данные, но так выходить передавать только 1 пару ключ:значение, то есть State заменяется. И да, я знаю, что в потомке стейт не комильфо, однако, как иначе вообще не понимаю. Мне говорили прокинуть пропсы, но те куски кода, что показали, вообще не подходят или не понимаю как сделать.

App.js, родитель

class App extends Component {
  constructor(props) {
    super(props);
    this.handlePropChange = this.handlePropChange.bind(this);
    this.state = {
      filterSet: {}
    }
  }
  handlePropChange(props) {
    this.setState({ filterSet: props })
  }
  render() {
    return (
      <div className="App">
        <header className="App-header">
          <img src={logo} className="App-logo" alt="logo" />
          <h1 className="App-title">Welcome to CardC</h1>
        </header>
        <Filter onPropChange={this.handlePropChange} />
        {/* <CardList filterSet={this.state.filter} /> */}
      </div>
    );
  }
}

Код дочернего, Filter.js, из его параметров хочу собрать в App.js, Обработать и передать в CardList

class Filter extends Component {
    constructor(props) {
        super(props);
        this.handleCheck = this.handleCheck.bind(this);
        this.handleChange = this.handleChange.bind(this);
        this.state = {
        }
    }
    handleChange(e) {
        this.setState({
            [e.target.name]: e.target.checked ? 1 : 0
        });
    }
    handleCheck(e) {
        this.setState({
            [e.target.name]: e.target.value
        });
    }
    render() {
        return (
            <div className="filter">
                <div><label>Кешбек&nbsp;<input type="checkbox" name="cashback" onChange={this.handleCheck} /></label></div>
                <div><label>Бесплатное обслуживание&nbsp;<input type="checkbox" name="free_price" onChange={this.handleCheck}/></label></div>
                <div><label>Цена&nbsp;<input type="text" name="price" onChange={this.handleChange} /></label></div>
            </div>
        )
    }
}
Answer 1

Ты можешь создать кнопку и к этой кнопке привязать функцию которая через пропс передала бы state твоего дочернего компонента. В state ты можешь добавить конкретные значения. Я сделал пример, но не тестировал его. Тебе скорее всего нужно будет немного изменить то как твой state будет выглядеть. Главное что State это объект, так что с ним по идеи можно делать все (если не все, то многое) что с обычным объектом. Надеюсь это хоть как-то поможет.

class Filter extends Component {
constructor(props) {
  super(props);
  this.state = {
    name1: '';, 
    name2: ''; 
  }
    this.handleCheck = this.handleCheck.bind(this);
    this.handleChange = this.handleChange.bind(this);
    this.handleSubmit = this.handleSubmit.bind(this);
}
handleChange(e) {
    this.setState({
        this.state.name1: e.target.checked ? 1 : 0
    });
}
handleCheck(e) {
    this.setState({
        this.state.name2: e.target.value
    });
}
handleSubmit(event) {
  this.props.onPropChange(this.state.name1, this.state.name2);  
}
render() {
    return (
        <div className="filter">
            <div><label>Кешбек&nbsp;<input type="checkbox" name="cashback" onChange={this.handleCheck} /></label></div>
            <div><label>Бесплатное обслуживание&nbsp;<input type="checkbox" name="free_price" onChange={this.handleCheck}/></label></div>
            <div><label>Цена&nbsp;<input type="text" name="price" onChange={this.handleChange} /></label></div>
        </div>
    )
}

}

READ ALSO
Анимация изменения Value в React

Анимация изменения Value в React

Учусь писать на React, Существует ли способ, средствами React анимировать смену положения input type="range"

238
Как передать файл в контроллер через ajax?

Как передать файл в контроллер через ajax?

В представлении есть много полей с данными, также есть прикрепленное количество файловВсе данные собираю в объект и передаю в формате JSON в контроллер

227
Работа с JSON Vue.js

Работа с JSON Vue.js

Не получается вывести данные JSON с Google api booksВот так выглядит пример что возвращает JSON https://www

324
Не работает setInterval node.js

Не работает setInterval node.js

Не работает самая простая функцияПри запуске кода, срабатывает один раз

272