Javascript React路由器、Redux和异步API调用

Javascript React路由器、Redux和异步API调用,javascript,reactjs,redux,react-router,react-redux,Javascript,Reactjs,Redux,React Router,React Redux,当用户点击链接时,React路由器将显示一个组件。这个组件将显示的数据来自一个端点,所以我想知道什么是最佳实践 我创建了一个名为fetchData的函数,它使用fetch在端点中执行GET,然后返回一个承诺。一旦这个承诺得到解决,我想发送一个Redux操作来更新状态 我用redux-thunk实现了这一点,但我希望在不添加更多库的情况下实现这一点 我试图遵循“容器/表示”的思想,并在React中使用无状态功能组件 总而言之,这就是我正在做的: index.js ReactDOM.render(

当用户点击链接时,React路由器将显示一个组件。这个组件将显示的数据来自一个端点,所以我想知道什么是最佳实践

我创建了一个名为
fetchData
的函数,它使用
fetch
在端点中执行GET,然后返回一个承诺。一旦这个承诺得到解决,我想发送一个Redux操作来更新状态

我用
redux-thunk
实现了这一点,但我希望在不添加更多库的情况下实现这一点

我试图遵循“容器/表示”的思想,并在React中使用无状态功能组件

总而言之,这就是我正在做的:

index.js

ReactDOM.render(
  <Provider store={store}>
    <App />
  </Provider>,
  document.getElementById('root')
)
const App = () => (
    <div>
      <BrowserRouter>
        <div>
          <Header />
          <Switch>
            <Route exact path="/" component={Main} />
            <Route exact path="/data-list" component={DataListContainer} />
          </Switch>
        </div>
      </BrowserRouter>
    </div>
)
const mapStateToProps = (state) => {
  return { data: state.data }
}

const mapDispatchToProps = (dispatch) => {
  return { }
}

const DataListContainer = connect(
  mapStateToProps,
  mapDispatchToProps
)(DataList)
const DataList = (props) => {
  const rows = props.data.map(data => {
    return <Data data={data} />
  })
  return (
    <div>
      {rows}
    </div>
  )
}
dataListContainer.js

ReactDOM.render(
  <Provider store={store}>
    <App />
  </Provider>,
  document.getElementById('root')
)
const App = () => (
    <div>
      <BrowserRouter>
        <div>
          <Header />
          <Switch>
            <Route exact path="/" component={Main} />
            <Route exact path="/data-list" component={DataListContainer} />
          </Switch>
        </div>
      </BrowserRouter>
    </div>
)
const mapStateToProps = (state) => {
  return { data: state.data }
}

const mapDispatchToProps = (dispatch) => {
  return { }
}

const DataListContainer = connect(
  mapStateToProps,
  mapDispatchToProps
)(DataList)
const DataList = (props) => {
  const rows = props.data.map(data => {
    return <Data data={data} />
  })
  return (
    <div>
      {rows}
    </div>
  )
}
dataList.js

ReactDOM.render(
  <Provider store={store}>
    <App />
  </Provider>,
  document.getElementById('root')
)
const App = () => (
    <div>
      <BrowserRouter>
        <div>
          <Header />
          <Switch>
            <Route exact path="/" component={Main} />
            <Route exact path="/data-list" component={DataListContainer} />
          </Switch>
        </div>
      </BrowserRouter>
    </div>
)
const mapStateToProps = (state) => {
  return { data: state.data }
}

const mapDispatchToProps = (dispatch) => {
  return { }
}

const DataListContainer = connect(
  mapStateToProps,
  mapDispatchToProps
)(DataList)
const DataList = (props) => {
  const rows = props.data.map(data => {
    return <Data data={data} />
  })
  return (
    <div>
      {rows}
    </div>
  )
}
const数据列表=(道具)=>{
const rows=props.data.map(数据=>{
回来
})
返回(
{rows}
)
}
Data
组件只显示数据。我想知道应该在哪里向函数
fetchData
添加调用,以及应该在哪里解决返回的承诺。我想我需要在承诺得到解决后采取行动,但不确定在哪里最好


另一个问题是:我只想获取数据一次,我的意思是,仅当用户单击
/data list
链接时。如果它返回主页,然后再次转到
数据列表
,我不想再次调用端点。React路由实现中是否隐藏了一次调用功能?

我认为在路由和视图中不可能实现这一点。使用React Router切换页面时,组件将卸载。组件的所有数据也将被清除。(相信我,这是您想要的。否则您可能会遇到严重的内存问题,导致浏览器崩溃)。此外,视图只负责显示内容,不应使用它接收的数据进行操作

请在您的应用商店中查看一些实现。例如,将从API接收的数据存储在store对象中。下次有人调用存储中的
fetchData
函数时,为存储的数据提供服务,而不是发出新的请求。存储从未卸载,因此它可以在内存中保存数据。请记住,只有重新加载整个页面时,用户才会收到新数据。因此,一个“硬刷新”,但可能是有用的


您可以做的另一件事是问自己为什么不想多次调用该端点?数据是否设置为要接收的大数据?在这种情况下,使用分页并将其分块提供。

将dataListContainer.js更改为有状态的React组件,这是可以的,因为它是容器!不要把代码当成是精确的,它只是给出一个想法

import { fetchData, DataList, store } '......'

class DataListContainer extends React.Component {
  componentDidMount() {
    if (!this.props.data) {
      store.dispatch(fetchData())
    }
  }
  render() {
    return (<DataList data={this.props.data}/>);
  }
}

const mapStateToProps = (state) => {
  return { data: state.data }
}

export default connect(
  mapStateToProps
)(DataListContainer)
import{fetchData,DataList,store}'…'
类DataListContainer扩展了React.Component{
componentDidMount(){
如果(!this.props.data){
dispatch(fetchData())
}
}
render(){
返回();
}
}
常量mapStateToProps=(状态)=>{
返回{data:state.data}
}
导出默认连接(
mapStateToProps
)(DataListContainer)