使用异步数据初始化组件
Initialize component with Async data
我正在尝试弄清楚如何以及在何处为我的select盒子加载数据(即调用我的动作)在反应+ redux +砰。我不确定它是否应该放在我的 App 容器的构造函数中,或者我应该将它加载到我的组件中(在我的示例中:"MyDropdown")
我的主要应用程序:
import MyDropdown from '../components/mydropdown';
// Should i import my action here and then...
// import { loadData } from '../actions';
class App extends Component {
render() {
return (
<div className="page-content">
<div className="option-bar">
// SEND it as a PROP inside MyDropdown...
<MyDropdown />
</div>
</div>
);
}
}
export default App;
我的组件
// OR.. Should i load it in my MyDropdown component here?
import { loadData } from '../actions';
class MyDropdown extends Component {
// If i load it here on load, how do i do it?
render() {
return(
<select>
{renderOptions()}
</select>
);
}
}
我已经尝试在我的应用程序中使用 componentDidMount() class,但它似乎没有用。将初始化数据和对操作的调用放在那里似乎是有意义的,因为它们将全部集中,而不是在我的子组件中调用操作。此外,我将有多个 select 框需要在启动时加载,所以我的应用程序 class 可能会增长很多,这是正确的方法吗?我不确定最佳实践是什么,因为我才刚刚开始学习 React。
您应该将数据组件与表示组件分开(参见 post here)。
所以在你的小例子中,MyDropdown
应该传递渲染组件所需的所有数据。这意味着在 App 中获取数据(或实际呈现视图的组件的某些父组件。
由于您使用的是 React 和 Redux,react-redux 库提供了一个辅助函数来生成容器,以获取您的演示组件所需的数据。
为此,将 App
更改为:
import { connect } from 'react-redux'
import MyDropdown from '../components/mydropdown';
import { loadData } from '../actions';
// This class is not exported
class App extends Component {
componentDidMount() {
this.props.loadData()
}
render() {
return (
<div className="page-content">
<div className="option-bar">
<MyDropdown data={this.props.data}/>
</div>
</div>
);
}
}
function mapStateToProps(state) {
const { data } = state
return {
data
}
}
function mapDispatchToProps(dispatch) {
return {
loadData(){
dispatch(loadData())
}
}
}
// Export a container that wraps App
export default connect(mapStateToProps, mapDispatchToProps)(App);
或者,您可以保持 App
不变并将 MyDropdown
更改为:
import { connect } from 'react-redux'
import { loadData } from '../actions';
// Exporting this allows using only the presentational component
export class MyDropdown extends Component {
componentDidMount() {
this.props.loadData()
}
render() {
return(
<select>
{renderOptions(this.props.data)}
</select>
);
}
}
function mapStateToProps(state) {
const { data } = state
return {
data
}
}
function mapDispatchToProps(dispatch) {
return {
loadData(){
dispatch(loadData())
}
}
}
// By default, export the container that wraps the presentational component
export default connect(mapStateToProps, mapDispatchToProps)(MyDropdown);
在这两种情况下,请查看最后实际导出为默认值的内容。它不是组件;这是 connect
的 return。该函数包装了您的展示组件,return 是一个容器,负责为展示组件获取数据和调用操作。
这为您提供了所需的分离,并允许您灵活地使用演示组件。在任一示例中,如果您已经拥有需要渲染的数据 MyDropdown
,您可以只使用演示组件并跳过数据获取!
您可以在 Redux 文档中看到完整的示例 here。
我正在尝试弄清楚如何以及在何处为我的select盒子加载数据(即调用我的动作)在反应+ redux +砰。我不确定它是否应该放在我的 App 容器的构造函数中,或者我应该将它加载到我的组件中(在我的示例中:"MyDropdown")
我的主要应用程序:
import MyDropdown from '../components/mydropdown';
// Should i import my action here and then...
// import { loadData } from '../actions';
class App extends Component {
render() {
return (
<div className="page-content">
<div className="option-bar">
// SEND it as a PROP inside MyDropdown...
<MyDropdown />
</div>
</div>
);
}
}
export default App;
我的组件
// OR.. Should i load it in my MyDropdown component here?
import { loadData } from '../actions';
class MyDropdown extends Component {
// If i load it here on load, how do i do it?
render() {
return(
<select>
{renderOptions()}
</select>
);
}
}
我已经尝试在我的应用程序中使用 componentDidMount() class,但它似乎没有用。将初始化数据和对操作的调用放在那里似乎是有意义的,因为它们将全部集中,而不是在我的子组件中调用操作。此外,我将有多个 select 框需要在启动时加载,所以我的应用程序 class 可能会增长很多,这是正确的方法吗?我不确定最佳实践是什么,因为我才刚刚开始学习 React。
您应该将数据组件与表示组件分开(参见 post here)。
所以在你的小例子中,MyDropdown
应该传递渲染组件所需的所有数据。这意味着在 App 中获取数据(或实际呈现视图的组件的某些父组件。
由于您使用的是 React 和 Redux,react-redux 库提供了一个辅助函数来生成容器,以获取您的演示组件所需的数据。
为此,将 App
更改为:
import { connect } from 'react-redux'
import MyDropdown from '../components/mydropdown';
import { loadData } from '../actions';
// This class is not exported
class App extends Component {
componentDidMount() {
this.props.loadData()
}
render() {
return (
<div className="page-content">
<div className="option-bar">
<MyDropdown data={this.props.data}/>
</div>
</div>
);
}
}
function mapStateToProps(state) {
const { data } = state
return {
data
}
}
function mapDispatchToProps(dispatch) {
return {
loadData(){
dispatch(loadData())
}
}
}
// Export a container that wraps App
export default connect(mapStateToProps, mapDispatchToProps)(App);
或者,您可以保持 App
不变并将 MyDropdown
更改为:
import { connect } from 'react-redux'
import { loadData } from '../actions';
// Exporting this allows using only the presentational component
export class MyDropdown extends Component {
componentDidMount() {
this.props.loadData()
}
render() {
return(
<select>
{renderOptions(this.props.data)}
</select>
);
}
}
function mapStateToProps(state) {
const { data } = state
return {
data
}
}
function mapDispatchToProps(dispatch) {
return {
loadData(){
dispatch(loadData())
}
}
}
// By default, export the container that wraps the presentational component
export default connect(mapStateToProps, mapDispatchToProps)(MyDropdown);
在这两种情况下,请查看最后实际导出为默认值的内容。它不是组件;这是 connect
的 return。该函数包装了您的展示组件,return 是一个容器,负责为展示组件获取数据和调用操作。
这为您提供了所需的分离,并允许您灵活地使用演示组件。在任一示例中,如果您已经拥有需要渲染的数据 MyDropdown
,您可以只使用演示组件并跳过数据获取!
您可以在 Redux 文档中看到完整的示例 here。