【问题标题】:How do I make an HTTP request in react-redux?如何在 react-redux 中发出 HTTP 请求?
【发布时间】:2017-02-09 05:32:52
【问题描述】:

我刚刚开始使用 react,我有点迷茫。我正在尝试创建一个登录页面并发出一个 http 发布请求。现在我只是想让任何类型的 HTTP 请求正常工作,所以我正在使用请求 bin,我在 npm 包的文档中找到了这个基本操作 (https://www.npmjs.com/package/redux-react-fetch):

export function updateTicket(ticketId, type, value){
  return {
    type: 'updateArticle',
    url: `http://requestb.in/1l9aqbo1`,
    body: {
      article_id: ticketId,
      title: 'New Title'
    },
    then: 'updateTicketFinished'
  }
}

那么,写完一个动作后,我该怎么办?我如何真正让我的应用程序调用并使用该操作? npm 包的文档提到了一些关于在我的商店中设置状态的内容,这是我需要先设置的吗?

【问题讨论】:

  • 我没有使用过您提到的库,但我建议您观看 Egghead 上有关 Redux 的免费视频。您将从创建者本人那里学到一切所需的知识,包括如何进行 http 调用。你真的不需要另一个抽象来做到这一点egghead.io/courses/getting-started-with-reduxegghead.io/courses/…
  • Here 是您正在尝试做的事情的文档。基本上你需要做两件事。首先,在调用操作时启动 ajax 请求(使用任何你想要的,例如fetch 或 jQuery)。这很可能发生在动作本身中。您需要做的下一件事是在 ajax 调用完成时使用来自 ajax 调用的信息更新存储。为此,您需要访问商店的dispatch 功能。 AsyncActionCreators 部分应该向您展示如何执行此操作。
  • 我也会远离那个图书馆,直到你明白如何用 react-redux 做事。
  • 另外,在尝试使用异步操作之前,您应该绝对清楚同步操作相对于 reducer 和 store 是如何工作的。
  • 我对 axios 的投票。在生产环境中使用它,非常棒。

标签: reactjs redux react-redux jsx


【解决方案1】:

您可以尝试以下任何一种方法。我已经使用了fetchaxios,它们的效果非常好。还没有尝试superagent

  1. 要提出请求,您可以使用 fetch 和 fetch-polyfill 兼容所有浏览器 (link)
  2. Axios 库。 (link)
  3. 具有承诺的超级代理。(link)

如果您使用 fetch,则需要使用 polyfill,因为 IE 和 safari 尚不支持它。但是使用 polyfill 效果很好。您可以查看链接了解如何使用它们。

所以你要做的是在你的动作创建器中你可以使用上述任何方法调用一个 API。

获取

function fetchData(){
    const url = '//you url'
    fetch(url)
    .then((response) => {//next actions})
    .catch((error) => {//throw error})
}

AXIOS

 axios.get('//url')
  .then(function (response) {
    //dispatch action
  })
  .catch(function (error) {
    // throw error
  });

这就是 API 调用,现在进入状态。在 redux 中,有一种状态可以处理您的应用程序。我建议您应该阅读可以找到 here 的 redux 基础知识。因此,一旦您的 api 调用成功,您需要使用数据更新您的状态。

获取数据的操作

 function fetchData(){
    return(dispatch,getState) =>{ //using redux-thunk here... do check it out 
        const url = '//you url'
        fetch(url)
        .then (response ) => {dispatch(receiveData(response.data)} //data being your api response object/array
        .catch( error) => {//throw error}
    }
  }

更新状态的动作

   function receiveData(data) {
      return{
        type: 'RECEIVE_DATA',
        data
     }
   }

减速器

   function app(state = {},action) {
      switch(action.types){
          case 'RECEIVE_DATA':
                 Object.assign({},...state,{
                   action.data 
                     }
                  }) 
          default:
             return state
      }
   }

【讨论】:

  • 精彩总结。谢谢哈基拉特
  • 谢谢。我现在正在尝试使用 axios.post 向 Axios 发出 POST 请求,但它一直在发送 get 请求。我需要为帖子创建一个操作吗?见:stackoverflow.com/questions/39797940/…
  • 我在包大小和性能方面做了大量工作,就添加到包中的模块的整体大小而言,Axios 显然是最小的开销。通常,React 应用程序往往在供应商捆绑包上显得臃肿。 Axios 至少在这方面更好。
猜你喜欢
  • 2019-04-05
  • 2020-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-13
  • 2021-10-26
相关资源
最近更新 更多