四时宝库

程序员的知识宝库

vue2组件系列第六节:List列表(vuetify列表)

list列表经常会用在循环数据输出时,这绝对是一个出境率很高的组件。这个组件封装了load事件等常用的功能。学会list列表组件,对我们的项目开发起到事半功倍的效果。

准备工作:

  1. 创建一个页面: List.vue
  2. 在router.js里配置Cell页面的路由
{
 path: '/list',
 name: 'list',
 component: () => import('./views/List.vue')
 }
  1. 在index.vue里添加一项
<a href="javascript:void(0)" @click="$router.push('/list')">
 <van-col span="6" class="marb20">
 <van-icon name="records" />
 <div>List列表</div>
 </van-col>
</a>

至今为止呢,我们的首页显示的样式子是这样滴?不知道不觉间我们已经学完了4个组件了!

代码演示List列表:

我们项目开发中不可避免地要进行列表地循环输出。这节课我们将结合上节课利用mock.js创建出来的JSON数据进行list列表地输出。这个列表每页显示20条数据,拉到底部时再加载20条数据,直至加载完毕。

1.List列表标签上的属性和EVENT:

在DOM里是如下的显示方式的

<van-list style="text-align: left" 
 v-model="loading"
 :finished="finished"
 @load="onLoad"
>
 <van-cell 
 v-for="item in articles" 
 :key="item.title"
 :title="item.title" 
 :value="item.date"
 />
 
</van-list>

loading: 是否处于加载状态的变量,其值是布尔值。当鼠标滑到底部时,会触发load事件,并将loading设置为true;

finished:是否加载完毕;

load:滚动条与底部距离小于offset时会触发;

slot: 自定义加载提示的样式。

说明:

1.是否触发load事件,取决于两个变量: 当loading="true" && finished="false"时才会加载。起决定性作用的是finished, finished="true"时则结束加载事件的调用。

2.改变默认的“加载提示”样式,要将v-model="loading"去掉,再加上<slot name="loading">加载耶</slot>。这样才可以将原有的样式剔除,只留下自定义的加载提示样式。

2.定义data里的数据变量:

data() {
 return {
 articles: [],
 loading: false,
 finished: false,
 curPage: 1
 }
},

articles:加载的数据列表。为了有那种加载分页的效果,我们先存入20条数据,再存入20条数据...直到数据完全加载完毕。

curPage:当前的页数。这是我们自己设置的,模拟一下分页效果。如果在真实项目中,当前页数是从后台调出来的数据。

3.构造函数分析:

为了有那种加载分页的效果,利用setTimeout异步更新数据。

首先们来看下需要哪些数据:

allData:总数据的条数;

perContent:每页显示的条数;

allPage:总共有多少页,我们这里使用总条数/每页显示的条数;(真实项目中可以从后台调出)

curContent:每次调用load时,当前页的数据。当前页显示的数据分两种情况:

1.当前页是否为最后一页,如果非最后一页,则我们得到的当前数据为:

curContent = res.data.articles.slice(this.articles.length, this.curPage*perContent)

2.如果当前页是最后一页,则我们得到的当前数据为:

curContent = res.data.articles.slice(this.articles.length)

请求的数据是上节课利用mock.js创建出来的数据,利用ajax请求

this.$axios.post('/news/api')

利用slice()来截取请求的数据,并将当页截取的数据推送到加载的数组articles中。

4.构造函数完整的代码为:

onLoad() {
 setTimeout(() => { //异步数据更新
 
 let perContent = 20 //每页显示的数据
 this.$axios.post('/news/api') //调用数据接口
 .then((res) => {
 let allData = res.data.articles.length //总数据
 let allPage = Math.ceil(allData / perContent) //总页数
 let curContent = [] //当前页数据,每次调用先清空数据
 
 if(this.curPage === allPage) { //判断当前页是否最后一页,数据赋值有所不同
 curContent = res.data.articles.slice(this.articles.length)
 } else {
 curContent = res.data.articles.slice(this.articles.length, this.curPage*perContent)
 }
 this.articles.push(...curContent)
 console.log(this.articles)
 this.loading = false
 this.curPage ++
 if(this.curPage > allPage) { //判断是否是最后一页,如果是最后一页,将finished设置为true,即例到底部也将不再加载数据。
 this.finished = true
 }
 
 })
 .catch((err) => {
 console.log(err)
 })
 }, 500);
 
 },

我们可以看到浏览器里,当我们滚动条滚动到底时会出现“加载中”中的字样,然后接下来的20条数据加载出来,依此往复直到所有数据加载完毕。

这就是List列表组件的一个展示,希望对大家有用。

今天就到这里了,我们休息,休息一会儿吧!明天继续加油噢!加油

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言
    友情链接