我有一个组件,它从两个或三个API接收新闻列表。 组件首次呈现时,将调用 API,并以 componentDidMount
格式呈现数据 像这样:
componentDidMount() {
this.state.platforms.forEach((platform, i) => {
let objToSend = {
phrase: this.props.searchParams.phrase,
// this is the main place when input data changes
...this.props.searchParams.general_params,
...this.props.searchParams.platforms[i].api_params,
stringPath: platform,
apiPath: this.props.searchParams.platforms[i].apiPath,
}
this.props.loadData(objToSend)
// this is the api call using redux which sends data as props to this component
}
new当短语更改时,我希望此组件重新渲染并重新运行组件DidMount,但它不起作用,因为组件DidMount将运行一次。所以我使用了componentDidUpdate,但由于有很多调用,所以api正在继续更新。
如何使组件重新渲染并重新运行组件每次更改短语时都DidMount
您可以使用componentDidUpdate
参数(previousProps
,previousState
)来检查是否发生了一些新的更改。
例
componentDidUpdate(previousProps, previousState) {
if (previousProps.phrase !== this.props.phrase) {
//Do whatever needs to happen!
}
}
我以这种方式停止了无限循环。
重新渲染时执行something()
的一种方法。
import React, { Component } from 'react';
import { render } from 'react-dom';
const fakeFetch = (n) => {
console.log(`Doing fake fetch: ${n}`)
return n
}
class App extends Component {
state = {
value: false,
number: 0,
}
componentDidMount() {
const number = fakeFetch(this.state.number + 1);
this.setState({ number })
}
componentDidUpdate(prevProps, prevState) {
if (prevState.value !== this.state.value) {
const number = fakeFetch(this.state.number + 1);
this.setState({ number })
}
}
toggle = () => {
this.setState(({ value }) => ({ value: !value }))
}
render() {
return (
<React.Fragment>
<h1>Number: {this.state.number}</h1>
<button onClick={this.toggle}>re-render</button>
</React.Fragment>
);
}
}
render(<App />, document.getElementById('root'));
活生生的例子在这里。