web-dev-qa-db-fra.com

Comment accéder à une API avec Vue.js?

Je suis nouveau sur JavaScript et Vue.js, et j'ai du mal à accéder à une API à l'aide de Vue.js. L'API à laquelle j'essaie d'accéder a un JSON qui ressemble à ceci:

{
    "coord": {
        "lon": -88.99,
        "lat": 40.51
    },
    "weather": [
        {
            "id": 800,
            "main": "Clear",
            "description": "clear sky",
            "icon": "01n"
        }
    ],
    "base": "stations",
    "main": {
        "temp": 2.09,
        "pressure": 1022.3,
        "humidity": 69,
        "temp_min": 2.09,
        "temp_max": 2.09,
        "sea_level": 1052.03,
        "grnd_level": 1022.3
    },
    "wind": {
        "speed": 12.66,
        "deg": 205.502
    },
    "clouds": {
        "all": 0
    },
    "dt": 1482203059,
    "sys": {
        "message": 0.186,
        "country": "US",
        "sunrise": 1482239741,
        "sunset": 1482273134
    },
    "id": 4903780,
    "name": "Normal",
    "cod": 200
}

Le lien API sur ses propres œuvres, mais je ne pense pas y accéder lorsque j'exécute le programme. Même lorsque je n'essaie pas d'analyser le JSON et d'afficher simplement toutes les données collectées à partir de l'API, ma variable est toujours vide. Donc, je dois faire quelque chose de mal pour accéder à l'API. De plus, après avoir accédé à l'API, le analysera comme ceci: par exemple, pour accéder à la balise "temp" => "data.main.temp"

var weather = new Vue({
        el: '#weather',

        data: {
            getTemp: ''
        },

        created: function () {
            this.fetchData();
        },        

        methods: {
            fetchData: function () {
                this.$http.get('api.openweathermap.org/data/2.5/weather?q=Normal&units=imperial&APPID=MYAPPID'),
                    function (data) {
                        this.getTemp = data.main.temp;
                    }
            }
        }

    })
    ;

code HTML:

<!doctype html>
<html>
<head>
    <meta charset="utf-8">
    <script src="https://unpkg.com/vue/dist/vue.js"></script>
    <script src="https://cdn.jsdelivr.net/vue.resource/1.0.3/vue-resource.min.js"></script>
</head>

<body>
<div id="weather">
    {{getTemp}}
</div> <!--end of weather-->
</body>

<script src="app.js"></script>

</html>
7
thefreebird777

Je vois le problème avec la portée de this, la portée de this les changements à l'intérieur de $http.get noir, vous devez apporter les modifications suivantes:

    methods: {
        fetchData: function () { 
            var vm = this
            this.$http.get('api.openweathermap.org/data/2.5/weather?q=Normal&units=imperial&APPID=MYAPPID'),
                function (data) {
                    vm.getTemp = data.main.temp;
                }
        }
    }

Vous pouvez également vérifier ma réponse similaire ici .

7
Saurabh

Je voudrais aller avec des promesses, et quelques autres ajustements ici, dans votre code

var weather = new Vue({
        el: '#weather',

        data: {
            getTemp: []
        },

        created: function () {
            this.fetchData();
        },        

        methods: {
            fetchData: function () {
                this.$http.get('api.openweathermap.org/data/2.5/weather?q=Normal&units=imperial&APPID=MYAPPID')
                          .then(response => {
                             this.getTemp = response.data
                             // or like this this.getTemp = response.json()
                          })
            }
        }

    })
    ;
3
Belmin Bedak