1. 程式人生 > 程式設計 >vant-ui框架的一個bug(解決切換後onload不觸發)

vant-ui框架的一個bug(解決切換後onload不觸發)

前幾天做的專案裡有用到下拉重新整理。使用了vant-ui裡的

List 列表

瀑布流滾動載入,用於控制長列表的展示

先說使用

1.用npm下載該模組包

npm i vant -S

2.引入元件

官方提供了三種方法。(我使用了第三種,全域性引入方法)

方式一. 使用 babel-plugin-import (推薦)

babel-plugin-import 是一款 babel 外掛,它會在編譯過程中將 import 的寫法自動轉換為按需引入的方式

# 安裝 babel-plugin-import 外掛
npm i babel-plugin-import -D
// .babelrc 中配置
// 注意:webpack 1 無需設定 libraryDirectory
{
 "plugins": [
 ["import",{
  "libraryName": "vant","libraryDirectory": "es","style": true
 }]
 ]
}
 
// 對於使用 babel7 的使用者,可以在 babel.config.js 中配置
module.exports = {
 plugins: [
 ['import',{
  libraryName: 'vant',libraryDirectory: 'es',style: true
 },'vant']
 ]
};

接著你可以在程式碼中直接引入 Vant 元件,外掛會自動將程式碼轉化為方式二中的按需引入形式

import { Button,Cell } from 'vant';

如果你在使用 TypeScript,可以使用 ts-import-plugin 實現按需引入

方式二. 按需引入元件

在不使用外掛的情況下,可以手動引入需要的元件

import Button from 'vant/lib/button';

import 'vant/lib/button/style';

方式三. 匯入所有元件(在main.js中引入)

import Vue from 'vue';
import Vant from 'vant';
import 'vant/lib/index.css'; 
Vue.use(Vant);

注意:配置 babel-plugin-import 外掛後將不允許匯入所有元件

引入成功後使用

  <van-list
   v-model="loading"
   :finished="finished"
   @load="onLoad">
   <v-bookOrder 
    :list="list" 
    :type="type" 
    :idType="idType"
    @reflush = "submitHandler">
   </v-bookOrder>
  </van-list>
  <!-- //空頁面 -->
  <div class="empty" v-if="list.length==0&&!loading">
   <img src="../../assets/[email protected]"/>
   <div>暫無預約~</div>
  </div>

loading為false是載入中,finished為true是已結束狀態,onLoad是執行函式(分頁新增list的值),裡面的v-bookOrder是自己寫的元件。

初始化loading為false,finished為false。

vant-ui框架的一個bug(解決切換後onload不觸發)

一切ok。

但專案裡,載入的list,頁面上有個切換的tab,實現切換不同的型別,載入不同的list的功能。vant-ui的list就有個bug,當切換tab的時候,它的onload沒方法自動觸發。然而在當前標籤頁,如果列表已經載入完畢再去切換,onload就可以實現自動觸發。(很多人給官方提這個問題,但是官方就是不修改)。

vant-ui框架的一個bug(解決切換後onload不觸發)

下面給出解決方案。

在切換tab後執行初始化函式

initialization(){
   this.list = [];
   this.page = 1;
   this.loading = true;//下拉載入中
   this.finished = false;//下拉結束
   if(this.loading){
    this.onLoad();
   }
  },

list清空,page=1表示第一頁,將loading設定為true,一定觸發一次onload,

onLoad() {
   setTimeout(async () => {
    let res = await this.$ajax.get({
     limit:this.pageSize,page:this.page,keyword:this.value1
    },'/order/businesslist/'+this.type,res=>{
     if(res.code==0){
      this.list = this.list.concat(res.data.list)
      this.loading = false;
      if(this.list.length >= res.data.total){
       this.finished = true;
      }
      this.page++;
     }
    else{
     this.$dialog.toast({
      mes: res.msg,timeout: 1500
     });
    }},err=>{
     this.$dialog.toast({
      mes: "出錯了~",timeout: 1500
     });
    })  
   },500);
  },

在第一次onload的過程中將loading設定為false,則觸發第二次loading,當執行到滿足結束條件的時候,finished為true,結束載入。bug就解決啦~

補充知識:vant 框架van-list重複觸發載入函式的問題

在使用van-list元件的時候,為了隱藏ios手機右側的滾動條,我給了元件一個overflow-x:hidden屬性,官方說這個屬性會導致重複觸發van-list的載入,

但是我去掉這個屬性仍然不管用,而且這個屬性又是必須保留的,最後我又給了他一個固定的高度,就不會重複觸發載入了,注意一定要是固定的高度,

設定height:100%仍然是不管用的,記錄一下這個問題。

以上這篇vant-ui框架的一個bug(解決切換後onload不觸發)就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援我們。