Как получить данные в API погоды на Redux с параметрами?

Мой вопрос прост: как я могу получить город и страну при выборке axios с несколькими параметрами по URL-адресу с помощью Redux?

в ROOT_URL параметры город и страна изменение

const URL = `http://api.openweathermap.org/data/2.5/weather?q=${city},${country}&appid=${API_KEY}&units=metric`;

мой действия

import axios from 'axios';
const API_KEY = "a3de5cffde10c377d199699b3da6fc6f";

export function getWeather (city, country) { 
    const URL = `http://api.openweathermap.org/data/2.5/weather?q=${city},${country}&appid=${API_KEY}&units=metric`;

    return(dispatch)=>{
        return axios.get(URL)
        .then(res => {
            dispatch(changeWeather(res));
        }).catch(err =>{
            console.info('error', err);
        });

    }
}
const changeWeather = weather => ({
    type: 'CHANGE_WEATHER',
    weather
});

редукторы

const weatherDefaultState = {
    city:undefined, 
    country:undefined, 

};
export default (state=weatherDefaultState,action)=>{
    switch(action.type) { 
        case 'CHANGE_WEATHER':
        return {...state, weather: action.weather}
        default: return state;
    }
};

а компонент с сокращение запускается, но кнопка не выполняет никаких действий, в чем ошибка?

   import React from 'react';
import {connect} from 'react-redux';
import { getWeather } from '../actions/weather';
class Weather extends React.Component {

    loadWeather = () => { 
        const API_KEY = 'a3de5cffde10c377d199699b3da6fc6f';
        const URL = `http://api.openweathermap.org/data/2.5/weather?q=Merida,mx&appid=${API_KEY}&units=metric`;

        return(dispatch)=>{
            return axios.get(URL)
            .then(res => {
                dispatch(getWeather(res));
            }).catch(err =>{
                console.info('error', err);
            });

        }
    }
    render() {
        return(<div>
            <WeatherForm
                 weather = {this.props.weather}
                 handleClick = {this.loadWeather}
            />
            </div>
        )
    }
}

class WeatherForm extends React.Component {
    render() {
        return(<div>
            <button
            className='boton-color'
            style = {{backgroundColor:'darkcyan'}}
            onClick = {()=>{this.props.handleClick() }} 
            type = "button" >
            <p 
            className = "card-text-correo"> 
            clima </p></button>
            </div>)
    }
}
const mapStateToProps = (state) => {
    return state
};
export default connect(mapStateToProps)(Weather);

Прежде всего я заметил, что у вас есть loadWeather в компоненте, который выполняет то же самое, что и getWeather в функции, но пытается отправить неизвестное действие obtieneClima. Весь смысл ваших действий состоит в том, чтобы делегировать им эту функциональность и удалить ее из компонента.

kimobrian254 04.05.2018 10:25
Как сделать HTTP-запрос в Javascript?
Как сделать HTTP-запрос в Javascript?
В JavaScript вы можете сделать HTTP-запрос, используя объект XMLHttpRequest или более новый API fetch. Вот пример для обоих методов:
Создание ресурсов API Laravel: Советы по производительности и масштабируемости
Создание ресурсов API Laravel: Советы по производительности и масштабируемости
Создание API-ресурса Laravel может быть непростой задачей. Она требует глубокого понимания возможностей Laravel и лучших практик, чтобы обеспечить...
Как создать простое погодное приложение на Python с API OpenWeatherMap
Как создать простое погодное приложение на Python с API OpenWeatherMap
Этот учебник проведет вас через процесс создания простого погодного приложения с помощью Python и OpenWeatherMap API.
Пакеты Java
Пакеты Java
Пакет java - это группа классов, интерфейсов и подпакетов схожего типа. Думайте об этом как о папке в каталоге файлов. Мы используем пакеты, чтобы...
Как использовать API парсинга квитанций с помощью JavaScript за 5 минут?
Как использовать API парсинга квитанций с помощью JavaScript за 5 минут?
В этом руководстве вы узнаете, как использовать API парсинга квитанций за 5 минут с помощью JavaScript. Eden AI предоставляет простой и удобный для...
1
1
948
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Согласно вашему коду, вы вообще не делаете HTTP-вызов. Внутри вашей функции loadWeather, которая является просто методом компонента, вы возвращаете функцию, которая принимает dispatch в качестве аргумента, это неверно. У вас есть асинхронное действие, и это здорово (я полагаю, вы правильно установили и подключили редукционный преобразователь.

Итак, вам нужно получить доступ к этому действию внутри вашего компонента. Это нужно сделать с помощью модуля connect, который вы установили и подключили. Но также требуется еще один параметр для подключения действий к реквизитам.

const mapStateToProps = (state) => {
    return state
};

/* This one you should add */
const mapDispatchToProps = dispatch => {
   return {
      getWeatherDispatch: (city, country) => {
          dispatch(getWeather(city, country))
      }
   }
};
export default connect(mapStateToProps, mapDispatchToProps)(Weather);

В результате вы можете вызывать свое действие внутри компонента, используя this.props.getWeatherDispatch(yourCity, yourCountry).

Из документы: «Если вы не хотите подписываться на обновления магазина, передайте null или undefined вместо mapStateToProps».

totymedli 25.12.2018 01:08

Другие вопросы по теме