【发布时间】:2018-10-06 15:35:14
【问题描述】:
我正在尝试构建一个简单的股票行情应用程序。输入 AAPL、TSLA、GOOG 等符号并显示所有 3 个的当前价格。
问题是,在输入第一批库存后,我无法让组件自动更新。它仅按时间间隔更新(通过 setInterval 为 15 秒)。
如何让我的组件在表单提交时更新?在StockList 中,我的道具包含从我的主要App 组件传递下来的符号名称。我再次通过道具将它们传递给StockInfo,在那里我运行getStock() 进行API 调用以获取价格。这在第一次通过时效果很好,但只要我输入更多股票,除非setInterval 运行,否则组件不会更新。我在StockInfo 中运行this.setState,但这似乎并不重要。
我错过了什么?
class StockList extends React.Component {
constructor(props) {
super(props);
}
render() {
return (
<div>
<StockInfo stocks={this.props.symbols} />
</div>
);
}
}
//
class StockInfo extends React.Component {
constructor(props) {
super(props);
this.state = {
symbols: [],
text: '',
stock: [],
time: new Date().toLocaleString()
};
}
static getDerivedStateFromProps(props, state) {
return {
symbols: props.stocks,
};
}
componentDidMount() {
this.intervalID = setInterval(
//interval
() => {this.getStocks()},
10 * 1000
);
this.getStocks();
console.log("mounting StockInfo")
}
componentWillUnmount() {
clearInterval(this.intervalID);
}
tick() {
this.setState({
time: new Date().toLocaleString()
});
}
getStocks() {
this.tick();
var symbol_str = "";
var stock_list = [];
if (this.state.symbols.length > 0) {
for (let i = 0; i < this.state.symbols.length; i++) {
stock_list.push(this.state.symbols[i].text);
}
}
this.setState({symbols: stock_list});
symbol_str = stock_list.join();
//stock api call here
}
render() {
return (
<div>
<b>The time is {this.state.time}.</b>
<ul>
{
this.state.stock.map((obj, index) =>
// Only do this if symbols have no stable IDs
<li key={index}>
<span className="stock_name">{obj.quote.symbol}</span> - <span className="stock_latest_price">{obj.quote.latestPrice}</span>
</li>
)
}
</ul>
</div>
);
}
}
【问题讨论】:
标签: javascript reactjs