首頁  >  文章  >  web前端  >  Vue下拉至頁面底部立刻載入數據

Vue下拉至頁面底部立刻載入數據

php中世界最好的语言
php中世界最好的语言原創
2018-04-27 13:41:304336瀏覽

這次帶給大家Vue下拉至頁面底部立刻載入數據,Vue下拉至頁面底部立刻載入數據的注意事項有哪些,以下就是實戰案例,一起來看一下。

從這個專案中可以加深對Vue的生命週期的理解, 何時開始axios請求, 如何結合Vue使用原生js來寫scroll事件等等, 我這裡主要是對原文的重點提取和補充

本文技術要點

  1. Vue生命週期

  2. axios簡單用法

  3. moment.js格式化日期

  4. 圖片懶載

  5. #結合原生js來寫scroll事件

  6. 請求節流

建立專案

首先建立一個簡單的vue項目

# vue init webpack-simple infinite-scroll-vuejs

然後安裝專案所需用的一些外掛

# npm install axios moment

#初始化用戶資料

專案搭建完後, 跑起來看看

# npm run dev

開啟http://localhost:8080無誤後, 我們開始修改程式碼, 先看看取得使用者資料這塊,

<script>
import axios from 'axios'
import moment from 'moment'
export default {
 name: 'app',
 // 创建一个存放用户数据的数组
 data() {
  return {
   persons: []
  }
 },
 methods: {
  // axios请求接口获取数据
  getInitialUsers() {
   for (var i = 0; i < 5; i++) {
    axios.get(`https://randomuser.me/api/`).then(response => {
     this.persons.push(response.data.results[0])
    })
   }
  },
  formatDate(date) {
   if (date) {
    return moment(String(date)).format('MM/DD/YYYY')
   }
  },
 beforeMount() {
  // 在页面挂载前就发起请求
  this.getInitialUsers()
 }
}
</script>

這裡原作者也專門提醒, 完全沒有必要也不建議在載入頁面的時候請求5次, 只是這個介面一次只能返回1條資料, 僅用於測試才這樣做的. 當然我這裡也可以透過Mock來模擬資料, 就不詳細說了~

接下來來寫模板結構與樣式, 如下:

<template>
 <p id="app">
  <h1>Random User</h1>
  <p class="person" v-for="(person, index) in persons" :key="index">
   <p class="left">
    <img :src="person.picture.large" alt="">
   </p>
   <p class="right">
    <p>{{ person.name.first}} {{ person.name.last }}</p>
    <ul>
     <li>
      <strong>Birthday:</strong> {{ formatDate(person.dob)}}
     </li>
     <p class="text-capitalize">
      <strong>Location:</strong> {{ person.location.city}}, {{ person.location.state }}
     </p>
    </ul>
   </p>
  </p>
 </p>
</template>
<style lang="scss">
.person {
 background: #ccc;
 border-radius: 2px;
 width: 20%;
 margin: 0 auto 15px auto;
 padding: 15px;
 img {
  width: 100%;
  height: auto;
  border-radius: 2px;
 }
 p:first-child {
  text-transform: capitalize;
  font-size: 2rem;
  font-weight: 900;
 }
 .text-capitalize {
  text-transform: capitalize;
 }
}
</style>

這樣頁面就能顯示5個人的個人資訊了.

處理無限滾動載入邏輯

我們接下來需要在methods裡面加上scroll()來監聽滾動, 而這個事件是應該在mounted()這個生命週期內的. 程式碼如下:

<script>
 // ...
 methods: {
  // ...
  scroll(person) {
   let isLoading = false
   window.onscroll = () => {
    // 距离底部200px时加载一次
    let bottomOfWindow = document.documentElement.offsetHeight - document.documentElement.scrollTop - window.innerHeight <= 200
    if (bottomOfWindow && isLoading == false) {
     isLoading = true
     axios.get(`https://randomuser.me/api/`).then(response => {
      person.push(response.data.results[0])
      isLoading = false
     })
    }
   }
  }
 },
 mounted() {
  this.scroll(this.persons)
 }
}
</script>

這段程式碼原文是有一點拼字錯誤的. 我這裡修正了, 另外增加了距離底部即開始加載數據, 並進行截流.

保存好, 回到瀏覽器, 查看效果, 已經沒有問題了~

總結

滾動到頁面底部無限加載的功能在Vue上實現其實和普通的頁面開發差不多, 每次滾動加載未完成的情況下不會觸發請求下一次, 每次請求push到數組內, 通過數據綁定實現了懶加載(其實0 0我不太認可...), 看完是不是感覺挺簡單的.

相信看了本文案例你已經掌握了方法,更多精彩請關注php中文網其它相關文章!

推薦閱讀:

vue-cli3.0設定詳解

Angular CLI建立Angular專案步驟詳解

#

以上是Vue下拉至頁面底部立刻載入數據的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn