【问题标题】:Redux-saga: Best way to handle async call data used in only one componentRedux-saga:处理仅在一个组件中使用的异步调用数据的最佳方式
【发布时间】:2020-05-09 19:46:41
【问题描述】:

我需要有关 redux-saga 和处理异步调用方式的建议。我找不到问题的答案。

我想知道如何正确处理异步 API 调用,该调用返回仅在一个组件中使用的数据(因此无法将其存储在商店中)?

在我的 react 应用程序中,我使用 redux-saga 来处理异步调用。当 saga 正确完成时,我会发送一个成功操作,将结果存储在商店中。

但是,当我只想在一个组件中显示结果时,我发现存储结果毫无用处。相反,我想运行一个 saga 并通过回调数据返回到我的组件,而不将其存储在存储中。可能吗 ?我该怎么做?

谢谢。

【问题讨论】:

  • 为什么要使用redux-saga进行这样的api调用,只是在该组件的componentDidMount中使用fetch,并将需要的数据保存到之后的状态?
  • 是的,我完全同意这种方式。我想知道使用本地状态和 redux 是否是一个好习惯。因此使用 redux-saga 的原因是什么?也许当您想进行异步调用并继续导航到您的应用程序时?还有什么用例?
  • @onedkr - 使用本地状态有很多原因,没有严格的规则强制你只使用 redux 存储。在您的情况下,将数据存储在本地状态是有意义的,因为它不会影响应用程序中的其他组件。所以你不需要使用。关于 redux-saga,你有没有尝试在你的 saga 中返回 yield response.json(); ?这应该可以从componentDidMount()
  • @jank 我从不尝试返回 response.json() 但如何从 saga 或我的 dispatch({ type:MY_ACTION }) 中检索它?

标签: reactjs react-redux redux-saga


【解决方案1】:

这是一个示例代码,该代码在 componentDidMount 生命周期中发出 api 请求,并将数据设置为其状态并在呈现之后。

import React, { Component } from "react";
import { render } from "react-dom";
import axios from 'axios';

class App extends Component {
  constructor() {
    super();
    this.state = {
      data: []
    };
  }

  async componentDidMount() {
    try {
      let response = await axios.get('https://jsonplaceholder.typicode.com/users');

      console.log('response.data: ', response.data);

      this.setState({
        data: response.data
      });
    } catch (error) {
      console.log('error: ', error);
    }
  }

  render() {
    return (
      <ul>
        {this.state.data.map(item => <li>{item.name}</li>)}
      </ul>
    );
  }
}

希望这会有所帮助。

【讨论】:

  • 显然不建议在 componentDidMount 中使用 setState。它会触发重新渲染,这可能会导致性能问题。
  • 无论如何,您必须在获取数据后重新渲染。它不是在这里浪费的重新渲染。
  • @onedkr 实际上我建议你阅读 react 的文档 You should populate data with AJAX calls in the componentDidMount lifecycle method. This is so you can use setState to update your component when the data is retrieved. 它说。 reactjs.org/docs/faq-ajax.html
猜你喜欢
  • 2021-06-18
  • 1970-01-01
  • 2019-08-04
  • 2018-05-09
  • 2021-12-03
  • 2020-07-16
  • 2020-01-27
  • 2017-06-14
  • 2016-12-12
相关资源
最近更新 更多