[英]TypeError: undefined is not an object (evaluating '_this.state.data)
[英]issues updating this.state.data object in state React
我有以下 App.js 文件,我嘗試將 7 個 state 屬性更改為更易於管理數據 object 的屬性。 我正在關注在 React 中使用 setState 更新 object嘗試使用主要答案,但我現在嘗試了 3 種不同的方法來更新 state,包括接受的答案,但沒有任何效果。 我這里有 App.js:
import React from 'react';
import SearchBar from './SearchBar';
import AllDividendsDisplay from './dividend_results_display/AllDividendsDisplay';
import DividendResultsDisplay from './dividend_results_display/DividendResultsDisplay';
import axios from 'axios';
class App extends React.Component {
state = {
loading: false,
current_price: '',
recent_dividend_rate: '',
current_yield: '',
dividend_change_1_year: '',
dividend_change_3_year: '',
dividend_change_5_year: '',
dividend_change_10_year: '',
all_dividends: [],
}
runStockInfoSearch = async (term) => {
// clear old data
this.setState({
loading: true,
current_price: '',
recent_dividend_rate: '',
current_yield: '',
dividend_change_1_year: '',
dividend_change_3_year: '',
dividend_change_5_year: '',
dividend_change_10_year: '',
all_dividends: [],
});
// const host = '67.205.161.47';
const HOST = 'localhost';
const base_url = 'http://' + HOST + ':8000'
const dividends_api_url = base_url + '/dividends/' + term
axios.get(dividends_api_url, {})
.then(response => {
console.log(response.data)
const RESPONSE_KEYS = [
'current_price',
'current_yield',
'recent_dividend_rate'
]
RESPONSE_KEYS.map((key) => {
this.setState({[key]: response.data[key]})
})
this.setState({all_dividends: response.data['all_dividends'].reverse()})
const YEARS_CHANGE = [1, 3, 5, 10];
YEARS_CHANGE.map((year) => {
const key = 'dividend_change_' + year.toString() + '_year';
this.setState({[key]: response.data[key]})
});
this.setState({loading: false})
})
.catch(err => {
console.log(err);
})
}
render() {
if (this.state.loading === true) {
return (
<div className="ui container" style={{marginTop: '10px'}}>
<SearchBar runSearch={this.runStockInfoSearch} />
<div className="ui segment">
<div className="ui active dimmer">
<div className="ui text loader">Loading</div>
</div>
</div>
</div>
)
} else {
return (
<div className="ui container" style={{marginTop: '10px'}}>
<SearchBar runSearch={this.runStockInfoSearch} />
<DividendResultsDisplay
current_price={this.state.current_price}
recent_dividend_rate={this.state.recent_dividend_rate}
current_yield={this.state.current_yield}
dividend_change_1_year={this.state.dividend_change_1_year}
dividend_change_3_year={this.state.dividend_change_3_year}
dividend_change_5_year={this.state.dividend_change_5_year}
dividend_change_10_year={this.state.dividend_change_10_year}
all_dividends={this.state.all_dividends}
/>
</div>
)
}
}
}
export default App;
該項目可以在https://github.com/codyc4321/dividends_ui下載
我仍然收到響應數據,但無法更新此 state 以將任何數據放在屏幕上:
任何幫助表示贊賞,謝謝
這是最好的解決方案,更新 state object 的最簡單方法:
import React from 'react';
import SearchBar from './SearchBar';
import AllDividendsDisplay from './dividend_results_display/AllDividendsDisplay';
import DividendResultsDisplay from './dividend_results_display/DividendResultsDisplay';
import axios from 'axios';
class App extends React.Component {
constructor(props) {
super(props);
this.state = {
loading: false,
dividends_data: {
current_price: '',
recent_dividend_rate: '',
current_yield: '',
dividend_change_1_year: '',
dividend_change_3_year: '',
dividend_change_5_year: '',
dividend_change_10_year: '',
all_dividends: [],
}
}
}
updateStateData = (key, value) => {
const data = this.state.dividends_data;
data[key] = value;
this.setState({data});
}
runStockInfoSearch = async (term) => {
console.log("running search")
// clear old data
this.setState({
loading: true,
current_price: '',
recent_dividend_rate: '',
current_yield: '',
dividend_change_1_year: '',
dividend_change_3_year: '',
dividend_change_5_year: '',
dividend_change_10_year: '',
all_dividends: [],
});
const HOST = 'localhost';
const base_url = 'http://' + HOST + ':8000'
const dividends_api_url = base_url + '/dividends/' + term
axios.get(dividends_api_url, {})
.then(response => {
console.log(response.data)
const RESPONSE_KEYS = [
'current_price',
'current_yield',
'recent_dividend_rate'
]
RESPONSE_KEYS.map((key) => {
this.updateStateData(key, response.data[key]);
})
this.updateStateData('all_dividends', response.data['all_dividends'].reverse());
const YEARS_CHANGE = [1, 3, 5, 10];
YEARS_CHANGE.map((year) => {
const key = 'dividend_change_' + year.toString() + '_year';
this.updateStateData(key, response.data[key]);
});
this.setState({loading: false})
})
.catch(err => {
console.log(err);
})
}
render() {
if (this.state.loading === true) {
return (
<div className="ui container" style={{marginTop: '10px'}}>
<SearchBar runSearch={this.runStockInfoSearch} />
<div className="ui segment">
<div className="ui active dimmer">
<div className="ui text loader">Loading</div>
</div>
</div>
</div>
)
} else {
return (
<div className="ui container" style={{marginTop: '10px'}}>
<SearchBar runSearch={this.runStockInfoSearch} />
<DividendResultsDisplay
data={this.state.dividends_data}
/>
</div>
)
}
}
}
export default App;
您需要調用構造函數 function 來添加 state。 為此,更改這段代碼:
state = {
loading: false,
dividends_data: {
current_price: '',
recent_dividend_rate: '',
current_yield: '',
dividend_change_1_year: '',
dividend_change_3_year: '',
dividend_change_5_year: '',
dividend_change_10_year: '',
all_dividends: [],
}
}
有了這個:
constructor(props) {
super(props);
this.state = {
loading: false,
dividends_data: {
current_price: '',
recent_dividend_rate: '',
current_yield: '',
dividend_change_1_year: '',
dividend_change_3_year: '',
dividend_change_5_year: '',
dividend_change_10_year: '',
all_dividends: [],
}
};
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.