在 React Redux 应用程序中,我在哪里从服务器获取初始数据?

IT技术 javascript reactjs redux react-redux
2021-05-01 01:09:30

我已经开始学习 React / Redux 并偶然发现了一些可能是非常基本的问题。下面是我的应用程序的片段,为了简单起见,删除了一些代码。

我的状态由默认情况下为空的站点数组描述。以后LOAD_SITES,每当用户分页到不同的页面时,reducer 都会执行加载一组不同的站点的操作,但现在它什么都不做。React 从渲染开始PublishedSitesPage,然后渲染PublishedSitesBox,然后循环遍历数据并渲染各个站点。

我想要做的是让它使用默认的空数组呈现所有内容,同时启动“从服务器加载站点”的Promise,一旦解决,就调度LOAD_SITES操作。拨打此电话的最佳方式是什么?我在想的任何构造PublishedSitesBox或者可能componentDidMount但不确定这是否可行 - 我担心的是我会以这种方式创建一个无限循环,以继续重新渲染。我想我可以通过在“haveRequestedInitialData”的行中使用其他一些状态参数来以某种方式防止这种无限循环。我的另一个想法是在做完之后立即做出这个PromiseReactDOM.render()什么是最好和最干净的方法来做到这一点?

export default function sites(state = [], action) {
  switch (action.type) {
    default:
      return state;
  }
}
...

const publishedSitesPageReducer = combineReducers({
  sites
});

ReactDOM.render(
  <Provider store={createStore(publishedSitesPageReducer)}>
    <PublishedSitesPage />
  </Provider>,
  this.$view.find('.js-published-sites-result-target')[0]
);

...

export default function PublishedSitesPage() {
  return (
    <PublishedSitesBox/>
  );
}

...

function mapStateToProps(state) {
  return { sites: state.sites };
}

const PublishedSitesBox = connect(mapStateToProps)(({sites}) => {
  // render sites
});
2个回答

这个数据加载逻辑根本没有理由接触你的 React 组件。您在这里想要的是返回将 action 分派给您的 reducer 的Promise,这对 store 进行适当的更改,然后导致 React 组件根据需要重新渲染。

(无论您是在调用 ReactDOM.render 之前还是之后启动异步调用都没有关系;无论哪种方式,promise 都会起作用)

像这样的东西:

var store = createStore(publishedSitesPageReducer);

someAsyncCall().then(function(response) {
  store.dispatch(someActionCreator(response));
});

ReactDOM.render(
  <Provider store={store}>
    <PublishedSitesPage />
  </Provider>,
  this.$view.find('.js-published-sites-result-target')[0]
);

你的 React 组件是你商店的消费者,但没有规定它们必须是你商店的唯一消费者。

这里有一个明确的例子说明如何做到这一点:Facebook 教程

至于无限循环,一旦你的数组不再为空,清除间隔。这应该可以防止循环。