在 React (Flux) 中重用具有不同状态的 Fetch

IT技术 javascript reactjs react-native fetch-api
2021-05-02 04:20:51

我有这个函数,它位于我想重用的顶级组件中,但位于不同的状态。在下面的代码示例中,我在 userData 上使用它,但我希望能够在名为 repoData 的状态中重用它,无论是在它的子组件内还是在它的外部。只是不知道如何去做,因为,如果我做一些事情,比如将状态作为参数传递给它,设置状态会抛出一个错误,因为它看起来像: this.setState({this.state.userData: data}) .

    fetchUserData(params) {
        fetch('https://api.github.com/users/' + params)
        .then(response => {
          if (!response.ok) {
            throw Error("Network failure")
          }
        return response;
        })
      .then(data => data.json())
      .then(data => {
        this.setState({
          userData: data
        })
      }, () => {
        this.setState({
            requestFailed: true
        })
      })
  }
2个回答

我相信你的问题更多是关于重构你的代码。在这里,您可以将其视为移出异步获取用户数据的逻辑。您的组件不需要知道 who( fetch, axios) 正在为它获取数据。此外,组件不需要知道从 where( https://api.github.com/users/' + params) 获取这些数据。
一种可能的方法是将您的 fetch 调用移动到一个单独的函数中,该函数将在异步获取数据后将数据返回给您的组件。然后组件有责任以它想要的方式处理数据。
因此,正如您所看到的,这里的关键点是识别和分离每段代码的职责。这样做的优点是代码结构清晰、行数更少、代码可维护,最重要的是代码易于测试。
我希望这能解决你的问题。如果您有兴趣了解更多此类技术,您可以阅读DRY 原理重构技术

编辑 1:
我创建了此代码示例供您参考
编辑 j2nj1r76k3

什么是 JavaScript Promises:https : //developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise
一些获取示例:https :
//davidwalsh.name/fetch 我个人建议使用 axios。你可以在这里看到 fetch 和 axios 的比较:https ://medium.com/@thejasonfile/fetch-vs-axios-js-for-making-http-requests-2b261cdd3af5

如果我正确理解你

  • 你应该把函数移到一个文件中 x.js
  • 它应该接受另一个参数,它是新(部分)状态的名称
  • 它还应该接受this.setState调用它的组件的参数
  • 导入并componentDidMount正常使用

``

export const fetchUserData(params,setState , stateParam) {
     fetch('https://api.github.com/users/' + params)
        .then(response => {
          if (!response.ok) {
            throw Error("Network failure")
          }
        return response;
        })
      .then(data => data.json())
      .then(data => {
        setState({
          [stateParam]: data
        })
      }, () => {
        setState({
            requestFailed: true
        })
      })
  }

你可以这样称呼它

import { fetchUserDate } from "./path/to/x"

fetchUserDate("param" , this.setState, "xOnState")