ReactJS - «ReferenceError: сообщение не определено» при передаче параметра

Я пытаюсь передать параметр компоненту, но при этом получаю ошибку Uncaught (in promise) ReferenceError: post is not defined - это критическая строка:

<NewPost onAddPost = {(e) => this.addPost(post, e)}/>

Я тоже эту версию пробовал,

<NewPost onAddPost = {this.addPost(post)}/>

но с тем же сообщением об ошибке (но теперь вся страница не отображается вообще).

class App extends React.Component {
  constructor(props) {
    super(props);

    this.state = {
      posts: [],
      loading: true
    };
  }

    componentDidMount() {
        axios.get('/posts')
            .then(response => {
            this.setState({ posts: response.data, loading: false });
          });
    }

    addPost(post){
        console.info('in "addPost"');

        const oldPosts = this.state.posts;
        this.setState({posts: oldPosts.push(post)})
    }

  render() {
    return (
      <div>
        <NewPost onAddPost = {(e) => this.addPost(post, e)}/>
        <Posts posts = {this.state.posts} loading = {this.state.loading} />
      </div>
    )
  }
}

export default App




class NewPost extends React.Component {
    constructor(props) {
        super(props);
        this.state = { 
            namee: '',  
            description: '' 
        }

        this.handleChangeEventNamee = this.handleChangeEventNamee.bind(this);
        this.handleChangeEventDescr = this.handleChangeEventDescr.bind(this);
        this.handleSubmit = this.handleSubmit.bind(this);   
    }

    handleChangeEventNamee(event) {      
      this.setState({
        namee: event.target.value
      });
    }
    handleChangeEventDescr(event) {      
      this.setState({
        description: event.target.value
      });
    }

    handleSubmit(event) {
      event.preventDefault();

      const form_data = {
      namee: this.state.namee,
      description: this.state.description
    };

    axios.post('/posts/testtt', { form_data })
      .then(res => {
        this.props.onAddPost(res.data);                  
      })
    }

  render () {
    return (
      <div style = {{'marginBottom': '20px'}}>
        <form onSubmit = {this.handleSubmit}>
          <input name='namee' value = {this.state.namee} onChange = {this.handleChangeEventNamee}  />
          <input name='description' value = {this.state.description} onChange = {this.handleChangeEventDescr}  />
          <button onClick = {this.handleItem}>Submit</button>
        </form>
      </div>
    );
  } 
}
export default NewPost

Я пробовал разные варианты передачи туда параметра, разные способы вызова этой функции, но все равно возникает ошибка сообщение не определено. Что мне здесь еще не хватает?

Заранее спасибо.

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
0
784
1

Ответы 1

Сообщение об ошибке очень четкое - сообщение не определено в обработчике события рендеринга.

В настоящее время у вас есть два обработчика событий, одна анонимная функция, определенная в вашем методе рендеринга (onAddPost = {(e) => this.addPost(post, e)} - сообщение здесь не определено, только e!), И еще одна в определении вашего класса - addPost(post) { ... }.

Я думаю, вы хотели сделать что-то вроде этого:

<NewPost onAddPost = {this.addPost} />

И привяжите обработчик событий к компоненту следующим образом:

addPost = (post) => {
    console.info('in "addPost"');

    const oldPosts = this.state.posts;
    this.setState({posts: oldPosts.push(post)})
}

Обновлено: Кроме того, вам следует избегать изменения состояния компонента напрямую, как вы это сделали в этой строке: this.setState({posts: oldPosts.push(post)}). Вместо этого вы должны создать новый экземпляр массива, например: this.setState({ posts: [...oldPosts, push] }). Состояние компонента React всегда следует рассматривать как неизменное - только когда-либо обновляется с помощью setState.

Я предлагал то же самое, но также писал кое-что о настройке состояния. this.setState( prevState => ( { posts: [ ...prevState.posts, post] } ) )

devserkan 10.06.2018 01:05

@devserkan, спасибо. Но этот способ обновления состояния, это будет только текст (содержимое) post в state.posts, он не будет добавлять туда все данные post, такие как post.id, post.created_at и т. д., Это правильно? Кроме того, если возникнет ошибка на стороне бэкенда - по какой-то причине этот post не будет добавлен в базу данных, приведенный выше код все равно добавит post в state.posts (несогласованные данные во внешнем и внутреннем интерфейсе), является что правильно?

user984621 10.06.2018 11:42

Нет, он добавляет пост в целом, а не только текст. Если при добавлении поста в бэкэнд возникнет ошибка, вы обработаете ее в своей функции. Если есть успех, вы установите состояние, если ошибка - нет. Кроме того, ваша функция делает то же самое с этим предложением. Вы устанавливаете состояние, ничего не проверяя.

devserkan 10.06.2018 11:54

Когда я добавляю новый пост в state.posts, я не могу распечатать ни элемент post.id, ни какой-либо другой атрибут свойства.

user984621 10.06.2018 12:11

Мы ничего не можем сказать, если не увидим хорошей информации. Просто следите за своими данными с помощью некоторой отладки, например console.info. Когда вы добавляете сообщение, какие данные вы получаете обратно с сервера? Это нормально или нет. Если да, то каково предыдущее состояние перед добавлением публикации и каково последнее состояние?

devserkan 11.06.2018 04:37

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