#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:
- Я не вижу, где
loadData
вызывается, что вызывает у меня подозрения в отношении значенияaccounts
. - Ключевым моментом является согласованность: если
accounts
является частью состояния компонента, то вы должны получить к нему доступ черезthis.state.accounts
, а неthis.accounts
. - Пожалуйста, обратите внимание, что вы
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
реквизит в это время пуст. Но те, о которых я упоминал, вызываются каждый раз при изменении реквизита.