Как мне передать состояние в качестве реквизита? (неопределенная ошибка)

#javascript #node.js #reactjs

#javascript #node.js #reactjs

Вопрос:

app.js:

 import './App.css';
import HttpService from '../services/http-service'
import React, { Component } from 'react';
const http = new HttpService()

class App extends Component {

  constructor(props){
    super(props)
    this.state = {accounts: ""}
    this.loadData = this.loadData.bind(this)
  }
  
  loadData = () => {
    http.getAccounts().then(res =>{
      this.setState({accounts: res})
      console.log(this.accounts)
      return res
    }, err => {console.log(err)})
  }
   
  render() {return (
    <div className="container">
      <h1 className="title">Retail API</h1>
        <DisplayAcc accounts = {this.accounts} />
    </div>
  )}
}

export default App;
  

на DisplayAcc у меня есть console.log(this.props.accounts) в конструкторе.
Вывод не определен. Что мне делать?
Я попытался добавить эти строки:

 componentDidMount(){
    this.loadData = this.loadData.bind(this)
  }
  

Все еще не определено. Пожалуйста, укажите на ошибку или, если у вас есть какие-либо предложения / рекомендации, я был бы очень признателен, потому что я очень новичок в этом. Спасибо!

Комментарии:

1. Кстати, на стороне сервера или службы http проблем нет, потому что, когда я console.log(res) после http.getAccount() . затем данные печатаются.

Ответ №1:

Чтобы получить доступ к accounts состоянию, которое будет передано из компонента приложения в ваш компонент DisplayAcc:

 render() {return (
    <div className="container">
      <h1 className="title">Retail API</h1>
        <DisplayAcc accounts = {this.state.accounts} />
    </div>
  )}
  

Комментарии:

1. Вы также захотите изменить свой журнал консоли на console.log({this.state.accounts})

Ответ №2:

Вы должны иметь возможность получить доступ к состоянию, если вы пытаетесь достичь его, this.accounts изменив его тоже:

 this.state.accounts
  

В настоящее время в сообществе более популярно использовать так называемые функциональные компоненты. При таком подходе вам не понадобится конструктор, очень рекомендую прочитать об этом, так как это немного упростит ваш код!

Ответ №3:

  1. Я не вижу, где loadData вызывается, что вызывает у меня подозрения в отношении значения accounts .
  2. Ключевым моментом является согласованность: если accounts является частью состояния компонента, то вы должны получить к нему доступ через this.state.accounts , а не this.accounts .
  3. Пожалуйста, обратите внимание, что вы console.log осмысленно. Следовательно, если вы хотите проверить this.account , нет смысла печатать res , как вы упомянули в своем комментарии.

Комментарии:

1. Да, я виноват, я забыл написать loadData() в вопросе, но у меня есть это в componentDidMount() . Теперь это работает …. и что касается console.log(res), вы видите, что это переменная, присвоенная параметру . затем функция. В любом случае спасибо.

Ответ №4:

Прежде всего, this.loadData = this.loadData.bind(this) не нужно, потому loadData что это функция со стрелкой.

Во-вторых, setState это асинхронная функция, поэтому вы не можете прочитать новое состояние сразу после его вызова. Итак, следующий консольный журнал будет undefined

 this.setState({accounts: res})
console.log(this.accounts) // also this must be this.state.accounts!
  

Более того, вы пытаетесь получить значение состояния неправильным способом, оно должно быть:

 <DisplayAcc accounts={this.state.accounts} />
  

Если вы хотите прочитать реквизит учетных записей в DisplayAcc компоненте, вы должны добавить свой консольный журнал в render componentDidUpate методы или, потому constructor что вызывается только при первом рендеринге, а ваш accounts реквизит в это время пуст. Но те, о которых я упоминал, вызываются каждый раз при изменении реквизита.