首頁 web前端 js教程 vue-infinite-loading2.0使用說明

vue-infinite-loading2.0使用說明

May 02, 2018 am 09:41 AM
使用說明

這次帶給大家vue-infinite-loading2.0使用說明,vue-infinite-loading2.0使用的注意事項有哪些,下面就是實戰案例,一起來看一下。

簡介

這是一個使用在Vue.js中的無限滾動插件,它可以幫助你快速建立一個無限滾動列表。

特點

  1. 行動端支援友善

  2. 相容於任何一個可以捲動的元素

  3. 有不同的旋轉器可以作為載入動畫

  4. 支援載入後顯示結果

  5. 支援兩個方向的無限載入

<p id="installation">安裝</p>

<strong>注意:vue-infinite-loading2.0只能在Vue.js2.0中使用。如果你想在Vue.js1.0中使用,請安裝vue-infinite-loading1.3版本</strong>

npm install vue-infinite-loading --save
登入後複製

#導入方式

#es6模組導入方式

import InfiniteLoading from 'vue-infinite-loading';
export default {
 components: {
  InfiniteLoading,
 },
};
登入後複製

CommonJS 模組導入方式

const InfiniteLoading = require('vue-infinite-loading');
export default {
 components: {
   InfiniteLoading,
 },
};
登入後複製

其他方式

&lt;script src=&quot;/path/to/vue-infinite-loading/dist/vue-infinite-loading.js&quot;&gt;&lt;/script&gt;
登入後複製

vue-infinite-loading.js會註冊一個全域變數VueInfiniteLoading,使用時需要這樣:

 ...
 components: {
   VueInfiniteLoading:VueInfiniteLoading.default,
 }
...
登入後複製

開始

##基礎使用##在本例中,我們將創建一個基本的無限列表,有以下三個步驟:

    在你的模板中,用v-for創建一個列表
  1. 將InfiniteLoading元件放在清單的底部;
  2. 將InfiniteLoading元件的ref屬性設為infiniteLoading,因為要用它來觸發事件。
  3. 為InfiniteLoading元件建立並綁定一個載入
  4. 回呼函數

Template

&lt;template&gt;
 &lt;p&gt;
  &lt;p v-for=&quot;item in list&quot;&gt;
  Line:
  &lt;span v-text=&quot;item&quot;&gt;&lt;/span&gt;
  &lt;/p&gt;
  &lt;infinite-loading :on-infinite=&quot;onInfinite&quot; ref=&quot;infiniteLoading&quot;&gt;  &lt;/infinite-loading&gt;
 &lt;/p&gt;
&lt;/template&gt;
登入後複製

Script

import InfiniteLoading from 'vue-infinite-loading';
export default {
 data() {
  return {
   list: []
  };
 },
 methods: {
  onInfinite() {
   setTimeout(() =&gt; {
    const temp = [];
    for (let i = this.list.length + 1; i &lt;= this.list.length + 20; i++) {
     temp.push(i);
    }
    this.list = this.list.concat(temp);
    this.$refs.infiniteLoading.$emit('$InfiniteLoading:loaded');
   }, 1000);
  }
 },
 components: {
  InfiniteLoading
 }
};
登入後複製
在<strong>onInfinite</strong>函數中,每次我們都push 20 個數字到list數組。我們使用<strong>setTimeout</strong>來模擬非同步請求。最後,不要忘了觸發一個<strong>$InfiniteLoading:loaded</strong>事件,它將告訴<strong>InfiniteLoading</strong>元件,資料已經下載成功。

現在,我們可以根據上面的程式碼,來顯示效果。

<p id="hacker">範例:駭客新聞清單頁面</p>

在這個範例中,我們將模仿一個駭客新聞列表頁面,但會用<strong>InfiniteLoading</strong>代替<strong>分頁</strong>

在開始這個例子之前,我們需要準備以下內容:

    取得新聞清單的API,在本例中我們使用HN Search API
  1. #匯入axios外掛程式來請求資料
Template

&lt;p class=&quot;hacker-news-list&quot;&gt;
 &lt;p class=&quot;hacker-news-header&quot;&gt;
  &lt;a target=&quot;_blank&quot; href=&quot;http://www.ycombinator.com/&quot; rel=&quot;external nofollow&quot; rel=&quot;external nofollow&quot; &gt;
   ![](https://news.ycombinator.com/y18.gif)
  &lt;/a&gt;
  &lt;span&gt;Hacker News&lt;/span&gt;
&lt;/p&gt;
&lt;p class=&quot;hacker-news-item&quot; v-for=&quot;(item, key) in list&quot;&gt;
 &lt;span class=&quot;num&quot; v-text=&quot;key + 1&quot;&gt;&lt;/span&gt;
 &lt;p&gt;
  &lt;a target=&quot;_blank&quot; :href=&quot;item.url&quot; rel=&quot;external nofollow&quot; rel=&quot;external nofollow&quot; v-text=&quot;item.title&quot;&gt;&lt;/a&gt;
 &lt;/p&gt;
 &lt;p&gt;
  &lt;small&gt;
   &lt;span v-text=&quot;item.points&quot;&gt;&lt;/span&gt;
   points by
   &lt;a target=&quot;_blank&quot; :href=&quot;&#39;https://news.ycombinator.com/user?id=&#39; + item.author&quot; rel=&quot;external nofollow&quot; rel=&quot;external nofollow&quot; 
    v-text=&quot;item.author&quot;&gt;&lt;/a&gt;
    |
   &lt;a target=&quot;_blank&quot; :href=&quot;&#39;https://news.ycombinator.com/item?id=&#39; + item.objectID&quot; rel=&quot;external nofollow&quot; rel=&quot;external nofollow&quot; 
    v-text=&quot;item.num_comments + &#39; comments&#39;&quot;&gt;&lt;/a&gt;
  &lt;/small&gt;
 &lt;/p&gt;
&lt;/p&gt;
 &lt;infinite-loading :on-infinite=&quot;onInfinite&quot; ref=&quot;infiniteLoading&quot;&gt;
 &lt;span slot=&quot;no-more&quot;&gt;
  There is no more Hacker News :(
 &lt;/span&gt;
 &lt;/infinite-loading&gt;
&lt;/p&gt;
登入後複製
在範本中,我們為駭客新聞清單建立了一個header 和一個list 。在這個例子中的<strong>InfiniteLoading</strong>組件,與上個例子中使用方式有些不同。我們基於<strong>slot</strong>自訂了沒有更多資料時的提示內容。

Script

import InfiniteLoading from 'vue-infinite-loading';
import axios from 'axios';
const api = 'http://hn.algolia.com/api/v1/search_by_date?tags=story';
export default {
 data() {
  return {
   list: []
  };
 },
 methods: {
  onInfinite() {
   axios.get(api, {
    params: {
     page: this.list.length / 20 + 1
    }
   }).then((res) =&gt; {
    if (res.data.hits.length) {
     this.list = this.list.concat(res.data.hits);
     this.$refs.infiniteLoading.$emit('$InfiniteLoading:loaded');
     if (this.list.length / 20 === 3) {
      this.$refs.infiniteLoading.$emit('$InfiniteLoading:complete');
     }
    } else {
     this.$refs.infiniteLoading.$emit('$InfiniteLoading:complete');
    }
   });
  }
 },
 components: {
  InfiniteLoading
 }
};
登入後複製
在<strong>onInfinite</strong>函數中,我們請求了一頁的新聞,並且每次將它們推入到list數組中。如果我們請求了3頁新聞,將觸發 <strong>$InfiniteLoading:complete</strong>事件去告訴<strong>InfiniteLoading</strong>元件,現在已經沒有更多資料可以載入了。它將顯示我們自訂在模板中的,表示沒有更多資料的提示內容。

Style

.hacker-news-list .hacker-news-item {
  margin: 10px 0;
  padding: 0 10px 0 32px;
  line-height: 16px;
  font-size: 14px;
}
.hacker-news-list .hacker-news-item .num {
 margin-top: 1px;
 margin-left: -32px;
 float: left;
 width: 32px;
 color: #888;
 text-align: right;
}
.hacker-news-list .hacker-news-item p {
 padding-left: 8px;
 margin: 0;
}
.hacker-news-list .hacker-news-item .num:after {
 content: ".";
}
.hacker-news-list .hacker-news-item p&gt;a {
 color: #333;
 padding-right: 5px;
}
.hacker-news-list .hacker-news-item p a {
 text-decoration: none;
}
.hacker-news-list .hacker-news-item p small, .hacker-news-list .hacker-news-item p small a {
 color: #888;
}
登入後複製

<p id="use">與過濾器一塊使用</p>

#

在上个例子的基础上,我们将在头部创建一个下拉选择作为过滤器,当我们改变过滤器,列表将会重新加载。

Template

&lt;p class=&quot;hacker-news-list&quot;&gt;
&lt;p class=&quot;hacker-news-header&quot;&gt;
 &lt;a target=&quot;_blank&quot; href=&quot;http://www.ycombinator.com/&quot; rel=&quot;external nofollow&quot; rel=&quot;external nofollow&quot; &gt;
  ![](https://news.ycombinator.com/y18.gif)
 &lt;/a&gt;
 &lt;span&gt;Hacker News&lt;/span&gt;
 &lt;select v-model=&quot;tag&quot; @change=&quot;changeFilter()&quot;&gt;
  &lt;option value=&quot;story&quot;&gt;Story&lt;/option&gt;
  &lt;option value=&quot;poll&quot;&gt;Poll&lt;/option&gt;
  &lt;option value=&quot;show_hn&quot;&gt;Show hn&lt;/option&gt;
  &lt;option value=&quot;ask_hn&quot;&gt;Ask hn&lt;/option&gt;
  &lt;option value=&quot;front_page&quot;&gt;Front page&lt;/option&gt;
 &lt;/select&gt;
&lt;/p&gt;
&lt;p class=&quot;hacker-news-item&quot; v-for=&quot;(item, key) in list&quot;&gt;
 &lt;span class=&quot;num&quot; v-text=&quot;key + 1&quot;&gt;&lt;/span&gt;
 &lt;p&gt;
  &lt;a target=&quot;_blank&quot; :href=&quot;item.url&quot; rel=&quot;external nofollow&quot; rel=&quot;external nofollow&quot; v-text=&quot;item.title&quot;&gt;&lt;/a&gt;
 &lt;/p&gt;
 &lt;p&gt;
  &lt;small&gt;
   &lt;span v-text=&quot;item.points&quot;&gt;&lt;/span&gt;
   points by
   &lt;a target=&quot;_blank&quot; :href=&quot;&#39;https://news.ycombinator.com/user?id=&#39; + item.author&quot; rel=&quot;external nofollow&quot; rel=&quot;external nofollow&quot; 
     v-text=&quot;item.author&quot;&gt;&lt;/a&gt;
   |
   &lt;a target=&quot;_blank&quot; :href=&quot;&#39;https://news.ycombinator.com/item?id=&#39; + item.objectID&quot; rel=&quot;external nofollow&quot; rel=&quot;external nofollow&quot; 
     v-text=&quot;item.num_comments + &#39; comments&#39;&quot;&gt;&lt;/a&gt;
  &lt;/small&gt;
 &lt;/p&gt;
&lt;/p&gt;
&lt;infinite-loading :on-infinite=&quot;onInfinite&quot; ref=&quot;infiniteLoading&quot;&gt;
 &lt;span slot=&quot;no-more&quot;&gt;
  There is no more Hacker News :(
 &lt;/span&gt;
&lt;/infinite-loading&gt;
&lt;/p&gt;
登入後複製

Script

import InfiniteLoading from 'vue-infinite-loading';
import axios from 'axios';
const api = 'http://hn.algolia.com/api/v1/search_by_date';
export default {
 data() {
  return {
   list: [],
   tag: 'story'
  };
 },
 methods: {
  onInfinite() {
   axios.get(api, {
    params: {
     tags: this.tag,
     page: this.list.length / 20 + 1
    }
   }).then((res) =&gt; {
    if (res.data.hits.length) {
     this.list = this.list.concat(res.data.hits);
     this.$refs.infiniteLoading.$emit('$InfiniteLoading:loaded');
     if (this.list.length / 20 === 10) {
      this.$refs.infiniteLoading.$emit('$InfiniteLoading:complete');
     }
    } else {
     this.$refs.infiniteLoading.$emit('$InfiniteLoading:complete');
    }
   });
  },
  changeFilter() {
   this.list = [];
   this.$nextTick(() =&gt; {
    this.$refs.infiniteLoading.$emit('$InfiniteLoading:reset');
   });
  }
 },
 components: {
  InfiniteLoading
 }
};
登入後複製

在<strong>changeFilter</strong>函数中,我们清楚了列表并等待DOM更新,然后我们触发一个<strong>$InfiniteLoading:reset</strong>事件,目的是让<strong> InfiniteLoading </strong>组件回到最初状态,它将立刻请求新的数据。

Style

在上个例子基础上增加样式

.demo-inner {
 margin-left: 20px;
 width: 261px;
 height: 455px;
 border: 1px solid #ccc;
 overflow: auto;
}
.hacker-news-list .hacker-news-header {
  padding: 2px;
  line-height: 14px;
  background-color: #f60;
}
.hacker-news-list {
 min-height: 455px;
 background-color: #f6f6ef;
}
.hacker-news-list .hacker-news-header select {
  float: right;
  color: #fff;
  background-color: transparent;
  border: 1px solid #fff;
  outline: none;
}
登入後複製

<p id="server">服务端渲染</p>

服务端渲染(SSR)是<strong>Vue.js2.0</strong>的新特性,当你在你的SSR应用中使用这个组件,会得到类似这样的错误:

Error: window is not defined
ReferenceError: window is not defined
  at ...
  at ...
  at e.exports (...)
  at Object. (...)
  at p (...)
  at Object.e.exports.render.e (...)
  at p (...)
  at Object. (...)
  at p (...)
  at e.esModule.default (...)
登入後複製

因为<strong>style-loader</strong>不支持在这个时候本地导出,详情点这里,所以我们需要下面的变通方案,为了你的SSR应用:

import InfiniteLoading from 'vue-infinite-loading/src/components/Infiniteloading.vue';
登入後複製

代替

 import InfiniteLoading from 'vue-infinite-loading';
登入後複製

<strong>npm install less less-loader --save-dev</strong> 如果你还没有安装它们。

然后你的SSR应用应该运行良好。如果不是,你可以加入这个issue去讨论。

<p id="properties">属性<p>

on-infinite

这是一个回调函数,当滚动到距离滚动父元素底部特定距离的时候,会被调用。

通常,在数据加载完成后,你应该在这个函数中发送<strong>$InfiniteLoading:loaded</strong>事件。

- type      Function
- reuqired    true
登入後複製

distance

这是滚动的临界值。如果到滚动父元素的底部距离小于这个值,那么<strong>on-infinite</strong>回调函数就会被调用。

- type     Number
- required   false
- default   100
- unit     pixel
登入後複製

spinner

通过这个属性,你可以选择一个你最喜爱旋转器作为加载动画。点击这里可以看到所有可用的旋转器。

- type     String
- required   false
- default   'default'
登入後複製

ref

正如你所知,这个属性是一个Vue.js的官方指令,用来获取子组件的实例。我们需要用它来得到<strong> InfiniteLoading </strong>组件的实例来发送事件。你可以用这种方式来得到实例:<strong>this.$refs[the value of ref attribute].</strong>

- type   String
- required   true
登入後複製

direction

如果你设置这个属性为top,那么这个组件将在你滚到顶部的时候,调用on-infinite函数。

<strong>警告:你必须在数据加载后,手动地将滚动父元素的scrollTop设置为正确的值,否则,该组件会一次又一次调用on-infinite函数。</strong>

- type     String
- default   'bottom'
登入後複製

<p id="event">事件</p>

<strong>InfiniteLoading </strong>组件将处理一下事件。如果你需要通过组件的实例来<strong>$emit</strong>,则可以通过<strong>ref</strong>属性来得到组件实例。

$InfiniteLoading:loaded

通常,你需要在数据加载后发送这个事件,<strong> InfiniteLoading</strong>组件将隐藏加载动画,并且准备下一次触发。

$InfiniteLoading:complete

如果<strong>InfiniteLoading</strong>组件就不会接收<strong>$InfiniteLoading:loaded</strong>,当你发送这个事件后,它将为用户显示一个没有结果的提示。如果<strong>InfiniteLoading</strong>组件接收过<strong>$InfiniteLoading:loaded</strong>,当你发送这个事件的时候,它会为用户显示一个没有更多内容的提示。你可以利用slot来自定义需要显示的内容。

你的<strong>onInfinite</strong>函数可能像这个样子:

onInfinite() {
  this.$http.get(url, (res) =&gt; {
  if (res.data) {
   this.list = this.list.concat(res.data);
   this.$refs[your ref attirbute's value].$emit('$InfiniteLoading:loaded');
  } else {
   this.$refs[your ref attirbute's value].$emit('$InfiniteLoading:complete');
  }
 });
}
登入後複製

$InfiniteLoading:reset

<strong>InfiniteLoading</strong>组件将会回到最初的状态,并且<strong>on-infinite</strong>函数将会立刻被调用。大部分情况下,如果你把这个组件同过滤器或制表符一起使用,这个事件还是有用的。

<p id="slots">插槽</p>

你可以利用<strong>slot</strong>自定义提示的内容,当然,如果你喜欢的话,也可以使用默认内容:

 &lt;span slot=&quot;{{ slot name }}&quot;&gt;
  {{ Your content }}
 &lt;/span&gt;
登入後複製

no-results

当<strong>InfiniteLoading</strong>组件接收到<strong>$InfiniteLoading:complete </strong>事件并且它没有接收过<strong>$InfiniteLoading:loaded</strong>事件时,这个内容会显示出来。

- type    String
- default   No results :(
登入後複製

no-more

当<strong>InfiniteLoading</strong>组件接收到<strong>$InfiniteLoading:complete </strong>事件并且它已经接收过<strong>$InfiniteLoading:loaded</strong>事件时,这个内容会出现。

spinner

如果,你不喜欢当前旋转器,你可以自定义自己的旋转器作为加载时的动画。

- type     HTML
- default   default spinner
登入後複製

<p id="spinners">旋转器</p>

你可以用<strong>spinner</strong>属性,选择你最喜爱的旋转器作为加载动画:

&lt;infinite-loading spinner=&quot;{{ spinner name }}&quot;&gt;&lt;/infinite-loading&gt;
登入後複製

点击这里可以查看几个可用的旋转器。

相信看了本文案例你已经掌握了方法,更多精彩请关注php中文网其它相关文章!

推荐阅读:

vue组件与复用使用详解

Vue无限加载vue-infinite-loading使用详解

以上是vue-infinite-loading2.0使用說明的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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

熱門文章

倉庫:如何復興隊友
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒險:如何獲得巨型種子
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
1 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱門文章

倉庫:如何復興隊友
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒險:如何獲得巨型種子
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
1 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱門文章標籤

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

UniApp實現支付功能的存取與使用說明 UniApp實現支付功能的存取與使用說明 Jul 04, 2023 am 10:27 AM

UniApp實現支付功能的存取與使用說明

一加budsPro怎麼使用_一加budsPro使用說明 一加budsPro怎麼使用_一加budsPro使用說明 Mar 23, 2024 am 10:11 AM

一加budsPro怎麼使用_一加budsPro使用說明

如何使用Hyperf框架進行多語言處理 如何使用Hyperf框架進行多語言處理 Oct 20, 2023 am 11:10 AM

如何使用Hyperf框架進行多語言處理

uniapp中如何使用錄影功能 uniapp中如何使用錄影功能 Jul 06, 2023 pm 06:51 PM

uniapp中如何使用錄影功能

利用進階篩選選項進行資料篩選 利用進階篩選選項進行資料篩選 Feb 18, 2024 pm 02:11 PM

利用進階篩選選項進行資料篩選

Cookies的詳細使用說明 Cookies的詳細使用說明 Feb 22, 2024 pm 12:21 PM

Cookies的詳細使用說明

win7activation啟動工具使用方法 win7activation啟動工具使用方法 Jul 17, 2023 pm 08:37 PM

win7activation啟動工具使用方法

理解JavaScript引用型別的使用 理解JavaScript引用型別的使用 Jun 15, 2023 pm 01:44 PM

理解JavaScript引用型別的使用

See all articles