当api通过reducer来自状态时如何使用axios获取?

Posted

技术标签:

【中文标题】当api通过reducer来自状态时如何使用axios获取?【英文标题】:How to fetch using axios when the api comes from a state via reducer? 【发布时间】:2017-08-06 08:59:18 【问题描述】:

我想从减速器返回的状态中获取一个 api。 这是我的容器:PokeDetailApi.js

import React, Component from "react";
import connect from "react-redux";
import axios from "axios";

class PokeDetailApi extends Component
    constructor()
        super();
        this.state = 
            pokedetails:""
        
    

    componentDidMount()
        axios.get(this.props.pokemon.url).then( (obj) => 
            this.setState(
                pokedetails: obj.data.results
            );
        );
    

    render()
        if(!this.props.pokemon)
            return (
                <div>
                    <h1>Please select a pokemon.</h1>
                </div>
            )
        

        // const url = this.props.pokemon.url;
        const urlapi = this.state.pokedetails;

        console.log(url);
        console.log(urlapi);

        return(
            <div>
                <p>this.props.pokemon.name</p>
            </div>
        )
    


function mapStateToProps(state)
    return 
        pokemon: state.selected_pokemon
    


export default connect(mapStateToProps)(PokeDetailApi);

this.props.pokemon.url 返回特定 pokemon 的 url。我想使用此处找到的该 url 显示该 pokemon 的所有详细信息:https://pokeapi.co/

这是reducer返回的对象:


    name:"bulbasaur"
    url:"http://pokeapi.co/api/v2/pokemon/1/"

使用 axios 从 reducer 从 api 访问对象的正确方法是什么?

【问题讨论】:

【参考方案1】:

您说的是减速器,但直接在您的组件中调用 fetch.. 您应该调用一个执行获取的操作。

除此之外,您还可以在您的 .then 中执行另一个提取,而不是在您的渲染中使用第一次提取的结果(pokedetails):

axios.get(this.props.pokemon.url)
  .then(res => res.data.results)
  .then(axios.get) // fetch on pokedetails
  .then(console.log) // console.log result, here you could setState results

【讨论】:

我会试试的。在组件中进行 api 调用是不好的做法吗?我会注意的。 redux 的想法是移除那些对操作的“副作用”,因此您通常会将一个操作传递给组件并在 componentDidMount 中调用它——更多详细信息请参见github.com/gaearon/redux-thunk跨度> 然而,直接在你的组件中调用 fetch 并不是一件可怕的事情或任何事情,实际上是完成任务的最有效和最快的方法。这增加了另一个抽象级别,这是程序员喜欢的,但不是必需的,除非您想非常“纯粹”并从组件中删除此类逻辑 您是否需要对操作返回承诺?或者只是做类似 axios.get(pokemon.url);在函数内部? 是的,如果您使用的是 redux-thunk,它希望您返回一个承诺(只是一个函数)。这个想法是你可以在那里调度多个动作,例如开始、成功和失败的动作 - 这样你就可以加载微调器并在失败时显示错误消息

以上是关于当api通过reducer来自状态时如何使用axios获取?的主要内容,如果未能解决你的问题,请参考以下文章

从另一个 reducer 中访问一个 reducer 状态

React Apollo 和 Redux:将自定义 reducer 与 Apollo 状态相结合

redux reducer 不更新 store 中的状态

如何在reducer中专门使用redux来获取react-native中的API?

当reducer在我的功能组件reactjs中出错时,我想清除或初始状态

如何通过代码接入手机在网状态 API