iT邦幫忙

0

17.結合Vue+axios

  • 分享至 

  • xImage
  •  

在vue實例方法當中可以透過this訪問data裡面的數據,但獲取網路數據後,vue實例裡面的this不在是同樣的那個因此無法訪問data中的數據,所以我們應該要將this保存起來

<body>
        <div id="app">
            <input type="button" value="點我獲取" @click="getJoke">
            <p> {{ joke }}</p>
        </div>
        <script src="https://unpkg.com/axios/dist/axios.min.js"></script>
        <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
        <script>
            var app=new Vue({
                el:"#app",
                data:{
                    joke:"想聽笑話嗎"
                },
                methods:{
                    getJoke(){
                        axios.get('https://autumnfish.cn/api/joke')
                        .then(function(response){
                            console.log(response)
                        },function(err){
                            console.log(err)
                        })
                    }
                }
            })
        </script>

我們可以先看到點擊Vue應用中的"點我獲取"按鈕時,這個應用將使用Axios發送一個HTTP GET請求到"https://autumnfish.cn/api/joke" 這個地址(由黑馬程序員提供),以獲取一條笑話。
https://ithelp.ithome.com.tw/upload/images/20231008/20163468DuhT7aMTLm.png
但如果要訪問笑話的數據是放在data裡面的,所以我們可以改成response.data
https://ithelp.ithome.com.tw/upload/images/20231008/201634686VKntkKuFu.png
接著我們要將笑話呈現出來
但要注意的是,若我們是這樣寫,this會改變我們就不能就無法拿到數據

methods: {
    getJoke: function() {
        console.log(this.joke); // 此處的 this 是 Vue 實例      axios.get("https://autumnfish.cn/api/joke").then(function(response) {
            console.log(response.data);
            console.log(this.joke); // 此處的 this 已經不是 Vue 實例了
        }, function(err) { });
    }
}

在Vue的方法中,this會自動綁定到Vue實例本身,使我們可以在方法中訪問Vue實例的數據和方法。但在JavaScript的函數中,this的上下文可能會因為函數的調用方式而改變。所以在axios.get的then函數內部使用了一個匿名函數。而這個匿名函數中的this已經不再指向Vue實例,而是指向了匿名函數本身。因此,this.joke不再指向Vue實例的joke數據,而是未定義。
所以我們應該修改為

methods: {
    getJoke: function() {
        var that = this; // 將外層的 this 保存在變量中
        console.log(this.joke);
        axios.get("https://autumnfish.cn/api/joke").then(function(response) {
            console.log(response.data);
            that.joke = response.data; //儲存joke
            console.log(that.joke); // 使用保存的 that 來訪問 Vue 實例的數據
        }, function(err) { });
    }
}

所以我們要存起來var that = this,通過這種方式,就可以在訪問到Vue實例的數據。
另一個方法是使用箭頭函數,因為箭頭函數的this與外層上下文相同,不會隨著函數的調用而改變:

methods: {
    getJoke: function() {
        console.log(this.joke);
        axios.get("https://autumnfish.cn/api/joke").then(response => {
            console.log(response.data);
            console.log(this.joke); // 此處的 this 仍然指向 Vue 實例
this.joke=response.data;//更新笑話
        }, err => { });
    }

https://ithelp.ithome.com.tw/upload/images/20231008/20163468GV1ymi5SS0.png
這樣就可以獲取笑話了。
參考資料:
https://www.bilibili.com/video/BV1HE411e7vY/?p=26&share_source=copy_web&vd_source=85a8c5bb37dc77d30860d2b3537de967


圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言