Javascript React路由器、Redux和异步API调用
当用户点击链接时,React路由器将显示一个组件。这个组件将显示的数据来自一个端点,所以我想知道什么是最佳实践 我创建了一个名为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(
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)