vant 中van-list的用法说明


Posted in Javascript onNovember 11, 2020

van-list里面的元素不能有float样式,否则会连续触发 load 事件

原代码

<template>
 <div class="about">
  <van-tabs v-model="active" sticky @change="getTypeDate">
   <van-tab v-for="(tab) in typeList" :title="tab.name" :key="tab.id">
    <div :style="{height: contentHeight}" class="pic-content">
     <van-list
      :finished="finished"
      :finished-text="finishedText"
      v-model="loading"
      :offset="10"
      :immediate-check="false"
      @load="getserviceList"
     >
     <!------------------------------------------------- 修改前代码 --------------------------------------------->
       /*<div
        class="pic-box"
        v-for="(serve) in serviceList"
        :key="serve.id"
        @click="router(serve)"
       >
        <div class="pic-item">
         <img
          v-if="serve.picturePath"
          :src="$BASE_PICTUREPATH_URL + serve.picturePath.split(',')[0]"
         >
        </div>
        <p>{{serve.name}}</p>
        <p class="price-red">¥{{serve.price}}</p>
       </div>*/
       <!------------------------------------------------- 修改前代码 --------------------------------------------->
     </van-list>
    </div>
   </van-tab>
  </van-tabs>
 </div>
</template>
<script>
import { Tab, Tabs, List, Cell, Row, Col } from "vant";
import { FetchServeType, FetchServeList } from "../apis/serve.js";

export default {
 data() {
  return {
   active: 0,
   typeList: [],
   serviceList: [],
   type: "",
   finishedText: "",
   finished: false,
   pageNum: 1,
   pageSize: 10,
   contentHeight: 0,
   loading: false
  };
 },
 mounted() {
  this.getOrderStyle();
  this.contentHeight = document.documentElement.clientHeight - 66 - 40 + "px";
 },
 methods: {
  async getOrderStyle() {
   let res = await FetchServeType();
   if (res.data && res.data.success) {
    this.typeList = res.data.data;
    this.type = res.data.data[0].name;
    this.getTypeDate();
   }
  },
  getTypeDate() {
   this.pageNum = 1;
   this.type = this.typeList[this.active].name;
   this.serviceList = [];
   this.finishedText = "";
   this.finished = false;
   this.getserviceList();
  },
  async getserviceList() {
   let toast = this.$toast.loading({
    mask: true,
    message: "加载中..."
   });
   const { type, pageNum, pageSize } = this;
   let params = {
    type,
    pageNum,
    pageSize
   };
   let res = await FetchServeList(params);
   this.loading = false;
   toast.close();
   if (res.data && res.data.success) {
    let list = (res.data.data && res.data.data.list) || [];
    if (pageNum > 1) {
     this.serviceList = [...this.serviceList, ...list];
    } else {
     this.serviceList = list;
    }
    // 如果当前页数 = 总页数,则已经没有数据
    if (res.data.data.pageNum === res.data.data.pages) {
     this.finished = true;
     this.finishedText = "- 没有更多了-";
    }
    // 如果总页数大于当前页码,页码+1
    if (res.data.data.pages > pageNum) {
     this.pageNum++;
    }
   }
   console.log("FetchServeList: ", this.serviceList);
  }
 }
};
</script>
<style lang="scss" scoped>
.pic-content {
 overflow-y: scroll;
 -webkit-overflow-scrolling: touch;
 .pic-box {
 /****************************修改前代码***************************/
  background-color: #fff;
  overflow: hidden;
  break-inside: avoid;
  box-sizing: border-box;
  margin-bottom: 0.7rem;
  padding: 0.8rem;
  width: 48%;
  height: 16rem;
  ~~float: left;~~ /**************不能有float样式*************/
  margin: 1%;
  border-radius: 4px;
   /****************************修改前代码***************************/
  p:nth-of-type(1) {
   padding: 0.8rem 0;
  }
  p:nth-of-type(2) {
   color: red;
  }
  .pic-item {
   height: 11rem;

   flex-direction: column;
   justify-content: center;
   overflow: hidden;
   img {
    width: 100%;
    height: auto;
    border-radius: 4px;
   }
  }
 }
}
</style>

// 修改后代码(注释部分为修改后代码)

<template>
 <div class="about">
  <van-tabs v-model="active" sticky @change="getTypeDate">
   <van-tab v-for="(tab) in typeList" :title="tab.name" :key="tab.id">
    <div :style="{height: contentHeight}" class="pic-content">
     <van-list
      :finished="finished"
      :finished-text="finishedText"
      v-model="loading"
      :offset="10"
      :immediate-check="false"
      @load="getserviceList"
     >
     <!------------------- 修改后代码 -------------------->
      /*<van-row>
       <van-col
        span="12"
        class="pic-box"
        v-for="(serve) in serviceList"
        :key="serve.id"
        @click="router(serve)"
       >
        <div class="pic-item">
         <img
          v-if="serve.picturePath"
          :src="$BASE_PICTUREPATH_URL + serve.picturePath.split(',')[0]"
         >
        </div>
        <p>{{serve.name}}</p>
        <p class="price-red">¥{{serve.price}}</p>
       </van-col>
      </van-row>*/
      <!------------------- 修改后代码 -------------------->
     </van-list>
    </div>
   </van-tab>
  </van-tabs>
 </div>
</template>
<script>
import { Tab, Tabs, List, Cell, Row, Col } from "vant";
import { FetchServeType, FetchServeList } from "../apis/serve.js";

export default {
 data() {
  return {
   active: 0,
   typeList: [],
   serviceList: [],
   type: "",
   finishedText: "",
   finished: false,
   pageNum: 1,
   pageSize: 10,
   contentHeight: 0,
   loading: false
  };
 },
 mounted() {
  this.getOrderStyle();
  this.contentHeight = document.documentElement.clientHeight - 66 - 40 + "px";
 },
 methods: {
  async getOrderStyle() {
   let res = await FetchServeType();
   if (res.data && res.data.success) {
    this.typeList = res.data.data;
    this.type = res.data.data[0].name;
    this.getTypeDate();
   }
  },
  getTypeDate() {
   this.pageNum = 1;
   this.type = this.typeList[this.active].name;
   this.serviceList = [];
   this.finishedText = "";
   this.finished = false;
   this.getserviceList();
  },
  async getserviceList() {
   let toast = this.$toast.loading({
    mask: true,
    message: "加载中..."
   });
   const { type, pageNum, pageSize } = this;
   let params = {
    type,
    pageNum,
    pageSize
   };
   let res = await FetchServeList(params);
   this.loading = false;
   toast.close();
   if (res.data && res.data.success) {
    let list = (res.data.data && res.data.data.list) || [];
    if (pageNum > 1) {
     this.serviceList = [...this.serviceList, ...list];
    } else {
     this.serviceList = list;
    }
    // 如果当前页数 = 总页数,则已经没有数据
    if (res.data.data.pageNum === res.data.data.pages) {
     this.finished = true;
     this.finishedText = "- 没有更多了-";
    }
    // 如果总页数大于当前页码,页码+1
    if (res.data.data.pages > pageNum) {
     this.pageNum++;
    }
   }
   console.log("FetchServeList: ", this.serviceList);
  }
 }
};
</script>
<style lang="scss" scoped>
.pic-content {
 overflow-y: scroll;
 -webkit-overflow-scrolling: touch;
 .pic-box {
 /************************ 修改后代码**************************/
  background-color: #fff;
  overflow: hidden;
  box-sizing: border-box;
  margin-bottom: 0.7rem;
  padding: 0.8rem;
  height: 16rem;
  border-radius: 4px;
  /************************ 修改后代码************************ **/
  p:nth-of-type(1) {
   padding: 0.8rem 0;
  }
  p:nth-of-type(2) {
   color: red;
  }
  .pic-item {
   height: 11rem;

   flex-direction: column;
   justify-content: center;
   overflow: hidden;
   img {
    width: 100%;
    height: auto;
    border-radius: 4px;
   }
  }
 }
}
</style>

补充知识:vant里 List 组件可以与 PullRefresh 组件结合使用的一个小提示与小坑坑

小提示

List 组件可以与 PullRefresh 组件结合使用,可以实现列表下拉刷新的效果,但是当下拉刷新后更新的数据展示在页面上不能撑满 List 列表中的内容的时候,他并不会主动触发列表刷新,以至于来填满列表。

可以给list组件添加ref属性,然后在下拉刷新后,在下拉刷新的事件里手动调用this.$refs.listRef(你的list的ref名称).check()来触发列表加载后续的数据

// list组件
<van-list
  v-model="loading"
  ref="listRef" // 1. 绑定ref
  :finished="finished"
  finished-text="没有更多了"
  :error.sync="error"
  error-text="请求失败,点击重新加载"
  @load="onLoad"
>
// 下拉刷新的事件
onRefresh() {
 ...刷新成功后
 // 2.手动去让下拉刷新后,去执行list列表的load事件
 this.$refs.listRef.check()
}

小坑坑

如果你把List 组件可以与 PullRefresh 组件结合使用封装成一个组件,然后在父组件中使用的时候,需要给封装的这个组件传list组件的v-model的值来控制list是否处于加载状态。

然后在父组件传 v-moel=“loading” 或者 :is-loading.sync=“loading” 传给子组件让他来控制子组件的list的v-model的控制load加载状态,按理说v-model 默认是 value 属性和 input 事件的组合,但是list组件的文件默认修改了,把传过去的value用 model: { prop: ‘loading' }修改了,所以我们在子组件接收的时候不能用value 要用loading

此图为vant的源码

vant 中van-list的用法说明

// 父组件 给子组件传list的v-model的值
:is-loading.sync="loading"
// 或写成
v-model="loading"

// 子组件 list组件
// 子组件不能用value接收 
// :value="isLoading"
// 应该写成loading
:loading="isLoading"

以上这篇vant 中van-list的用法说明就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
jquery 入门教程 [翻译] 推荐
Aug 17 Javascript
从零开始学习jQuery (二) 万能的选择器
Oct 01 Javascript
js返回上一页并刷新代码整理
Dec 21 Javascript
JS网页在线获取鼠标坐标值的方法
Feb 28 Javascript
javascript实现回到顶部特效
May 06 Javascript
localResizeIMG先压缩后使用ajax无刷新上传(移动端)
Aug 11 Javascript
Jquery和angularjs获取check框选中的值的方法汇总
Jan 17 Javascript
Node.js的项目构建工具Grunt的安装与配置教程
May 12 Javascript
Vue插件打包与发布的方法示例
Aug 20 Javascript
angular中子控制器向父控制器传值的实例
Oct 08 Javascript
vue实现表单录入小案例
Sep 27 Javascript
Element Tooltip 文字提示的使用示例
Jul 26 Javascript
让Vue响应Map或Set的变化操作
Nov 11 #Javascript
vue项目中使用rem,在入口文件添加内容操作
Nov 11 #Javascript
VUE前端从后台请求过来的数据进行转换数据结构操作
Nov 11 #Javascript
Vue 防止短时间内连续点击后多次触发请求的操作
Nov 11 #Javascript
Vue 401配合Vuex防止多次弹框的案例
Nov 11 #Javascript
VUE-ElementUI 自定义Loading图操作
Nov 11 #Javascript
在elementui中Notification组件添加点击事件实例
Nov 11 #Javascript
You might like
全国FM电台频率大全 - 15 山东省
2020/03/11 无线电
php float不四舍五入截取浮点型字符串方法总结
2013/10/28 PHP
php strnatcmp()函数的用法总结
2013/11/27 PHP
大家在抢红包,程序员在研究红包算法
2015/08/31 PHP
键盘控制事件应用教程大全
2006/11/24 Javascript
JS中简单的实现像C#中using功能(有源码下载)
2007/01/09 Javascript
Javascript拓展String方法小结
2013/07/08 Javascript
jQuery表格排序组件-tablesorter使用示例
2014/05/26 Javascript
深入理解jQuery之防止冒泡事件
2016/05/24 Javascript
AngularJS实现使用路由切换视图的方法
2017/01/24 Javascript
jQuery插件HighCharts实现2D柱状图、折线图的组合多轴图效果示例【附demo源码下载】
2017/03/09 Javascript
windows下vue-cli导入bootstrap样式
2017/04/25 Javascript
React中使用collections时key的重要性详解
2017/08/07 Javascript
vue2.0项目中使用Ueditor富文本编辑器示例代码
2017/08/14 Javascript
jQuery中过滤器的基本用法示例
2017/10/11 jQuery
vue-cli中vue本地实现跨域调试接口
2019/01/16 Javascript
聊聊Vue 中 title 的动态修改问题
2019/06/11 Javascript
[56:13]DOTA2-DPC中国联赛定级赛 LBZS vs Phoenix BO3第一场 1月10日
2021/03/11 DOTA
[08:53]DOTA2-DPC中国联赛 正赛 PSG.LGD vs LBZS 选手采访
2021/03/11 DOTA
Linux下使用python自动修改本机网关代码分享
2015/05/21 Python
使用Python神器对付12306变态验证码
2016/01/05 Python
Python爬取APP下载链接的实现方法
2016/09/30 Python
python 实现对文件夹内的文件排序编号
2018/04/12 Python
python 利用栈和队列模拟递归的过程
2018/05/29 Python
Python静态类型检查新工具之pyright 使用指南
2019/04/26 Python
Django中create和save方法的不同
2019/08/13 Python
python下载库的步骤方法
2019/10/12 Python
Python 字符串池化的前提
2020/07/03 Python
Bally美国官网:经典瑞士鞋履、手袋及配饰奢侈品牌
2018/05/18 全球购物
澳大利亚电商Catch新西兰站:Catch.co.nz
2020/05/30 全球购物
艺术爱好者的自我评价分享
2013/10/08 职场文书
优秀教师工作感言
2014/02/16 职场文书
3.15国际消费者权益日主题活动活动总结
2014/03/16 职场文书
“四风”问题的主要表现和危害思想汇报
2014/09/19 职场文书
解决Django transaction进行事务管理踩过的坑
2021/04/24 Python
MySQL安装后默认自带数据库的作用详解
2021/04/27 MySQL