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

我的状态由一个默认为空的站点数组描述.稍后,reducer将有LOAD_SITES个操作来加载一组不同的站点,只要用户分页到不同的页面,但现在它什么也不做.React首先渲染PublishedSitesPage,然后渲染PublishedSitesBox,然后在数据上循环并渲染各个站点.

我想做的是,让它用默认的空数组呈现所有内容,同时启动"从服务器加载站点"promise ,一旦解决,发送LOAD_SITES个操作.打这个电话最好的方式是什么?我在考虑PublishedSitesBoxcomponentDidMount的构造函数.但不确定这是否有效——我担心的是,我会以这种方式创建一个无休止的循环,从而继续重新渲染.我想我可以通过使用"haveRequestedInitialData"这一行的其他状态参数,以某种方式防止这种无休止的循环.我的另一个 idea 是在做了ReactDOM.render()件事后立即做出这个promise .最好、最干净的方法是什么?

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
});

推荐答案

这种数据加载逻辑根本没有理由触碰您的React组件.在这里,您想要的是返回promise ,向您的还原器发送操作,还原器对存储进行适当的更改,然后使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组件是store 的消费者,但没有规定它们必须是store 的唯一消费者.

Reactjs相关问答推荐

避风港访问端口以包含Reaction应用程序

两条react 路由的行为不同.有没有人能解释一下,我已经找了好几天了

使用Overpass API Endpoint计算 map 上的面积

svg每条路径上的波浪动画

如何动态地改变<; Select >;React和Tailwind元素?

在 React 中是否有任何理由要记住 Redux 操作创建者?

验证 Yup 中的对象项

ReactJS 中的图像加载顺序

React设置上下文并进行导航

Material UI @mui/material/Button vs @material-ui/core/Button,它什么时候改变的,旧版本的文档在哪里

为什么我会收到此错误:无法在我的react 包上读取 null 的属性(读取useState)?

图像路径很奇怪,部署 Next.js 应用程序后我看不到任何图像

在react 中从外部 api 渲染列表

作为单个变量的 React 组件是否比 memoized 组件渲染得更快?

意外的标记.您可能需要一个合适的加载器来处理这种文件类型.书?.img? /*#__PURE__*/React.createElement("img",

我如何在所有组件中使用 Chakra UI toast?

错误:无效挂钩调用.钩子只能在函数组件的主体内部调用.使用 next/router 时

使用 React 中的功能组件更改另一个组件的状态

单击当前子div时如何更改p标签的图像和样式?react

运行开发服务器时如何为 Vite 指定运行时目录