我有一个React应用。我正在使用react
和react-router
。 Here's the sandbox link。
我有一个App.js
文件,如下所示:
import React, { Component } from 'react';
import { BrowserRouter, Route } from 'react-router-dom';
import Items from './Items';
class App extends Component {
constructor(props) {
super(props);
this.state = {
items: []
}
}
componentDidMount() {
this.setState({ items: ['a', 'b', 'c'] });
}
render() {
const { items } = this.state;
return (
<BrowserRouter>
<div>
<Route exact path="/" render={(props) => <Items {...props} items={items} />} />
</div>
</BrowserRouter>
)
}
}
export default App;
在此文件的componentDidMount
中,我从API获取数据,然后将其传递给Items
组件。当然,在初始页面加载时,items
将是一个空数组,然后最终将具有内容。
在我的Items.js
文件中,我有:
import React, { Component } from 'react';
class Items extends Component {
constructor(props) {
super(props);
this.items = this.props.items;
}
render() {
return (
<div>
{this.items.length}
</div>
)
}
}
export default Items;
如您所见,this.items
是从道具中获取的。同样,在初始页面加载时,这是一个空数组。但是,在componentDidMount
中触发App.js
之后,Items.js
中的构造函数不会被触发,因此this.items
永远不会重新填充项。
我该如何在Items.js
中触发构造函数?我知道这是一个简单的示例,因此可以从技术上通过在props
方法中访问render
来解决,但是我确实需要触发构造函数,因为在我的实际应用中,我有更多那里有复杂的逻辑。
答案 0 :(得分:0)
您可以直接在this.props
的呈现方法中使用Items
来提取所需的数据。
class Items extends Component {
constructor(props) {
super(props);
}
render() {
const { items } = this.props;
return (
<div>
{items.length}
</div>
)
}
}
答案 1 :(得分:0)
由于只调用一次组件的构造函数,因此我将依赖于props的逻辑移到父组件。