@lodbrok

Как правильно передать данные между компонентами?

Добрый день. Прохожу сейчас туториал и возник вопрос. Имеется какой-то объект с новостями myNews, у компонента App создано состояние с этими новостями, а компоненту Add передаем функцию в пропс, которая имеет доступ к новостям. Новая новость добавляется в объекст myNews, но она пустая.

Компонент App:
class App extends React.Component {
        state = {
          news: myNews
        };

        handleAddNews(newPost) {      //1
          const nextNews = [newPost, ...this.state.news];
          this.setState({news: nextNews});
        };

        render() {
          return (
            <React.Fragment>
              <Add newsadd={this.handleAddNews.bind(this, arguments)}/>
              <h3>Новости</h3>
              <News newsdata={this.state.news} />
            </React.Fragment>
          )
        }
};

Компонент Add:
class Add extends React.Component {
        state = {
          namestate: '',
          textstate: '',
          checkstate: false
        };

        hundleBtnMessage(e) {       //2
          e.preventDefault();
          const {namestate, textstate} = this.state;
          this.props.newsadd({namestate, textstate});
        };
        handleCheckboxChange(e) {
          return this.setState({checkstate: e.currentTarget.checked});
        };
        handleChange(e) {
          const {id, value} = e.currentTarget;
          return this.setState({[id]: e.currentTarget.value});
        };
        handleChangeText(e) {
          return this.setState({textstate: e.currentTarget.value});
        };
        validate() {
          const { namestate, textstate, checkstate } = this.state;
          if (namestate.trim() && textstate.trim() && checkstate) {
            return true;
          }
          return false;
        }

        render() {
          const { namestate, textstate, checkstate } = this.state;

          return (
            <form className='add'>
              <input
                id='namestate'
                type='text'
                className='add__author'
                placeholder='Ваше имя'
                onChange={this.handleChange.bind(this)}
                value={namestate}
              />

              <textarea
                id='textstate'
                className='add__text'
                placeholder='Текст новости'
                onChange={this.handleChange.bind(this)}
                value={textstate}
              ></textarea>

              <label className='add__checkrule'>
                <input type='checkbox' 
                onChange={this.handleCheckboxChange.bind(this)}/>
                Я согласен с правилами
              </label>

              <button
                className='add__btn'
                onClick={this.hundleBtnMessage.bind(this)}
                disabled={!this.validate.call(this)}>
                Показать alert
              </button>
            </form>
          )
        }
      };
      Add.propTypes = {
        newsadd: PropTypes.func.isRequired, 
     }
};
  • Вопрос задан
  • 191 просмотр
Решения вопроса 1
0xD34F
@0xD34F Куратор тега React
this.handleAddNews.bind(this, arguments)

А не кажется ли вам, что тут есть что-то лишнее?

Ну и вообще, не надо так. Вместо

handleAddNews(newPost) {

пишите

handleAddNews = (newPost) => {

и тогда никакого bind использовать будет не надо:

<Add newsadd={this.handleAddNews} />
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
RomReed
@RomReed
JavaScript, Flutter, ReactNative, Redux, Firebase
https://jsfiddle.net/ybeaz/njLx57u4/
вот простой рабочий пример, надеюсь вы разберетесь
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы