复用的列表组件

在开发过程当中,列表页面会有很多,比如:消息列表、用户列表等。
我们可以为这样的页面封装一个可复用性的列表组件。

这些页面的共性:
1、后端接口非常相似:请求列表数据 需要提交的参数 请求的页数pageIndex 和 每页的个数 pageSize ,返回参数 data 里边基本会有 list数组。
2、分页加载,也就是上拉加载更多,或者点击页面加载更多。

不同之处:
1、每个列表项的UI布局不同。比如:消息列表,每个消息大概内容包括:消息标题,描述,时间等信息。用户列表,每个用户项,大概内容包括:用户的姓名,联系方式等等。
2、每个列表项有自己的业务逻辑,点击事件等等
3、后端接口请求参数,pageIndex和pageSize之外的参数。

封装可复用列表组件涉及到的vue 技术点
1、props 父组件 把 请求api地址和请求参数传递给组件。
2、v-slot 作用域插槽 父组件可以访问子组件 item 数据,解耦UI布局。
3、mint-ui Loadmore 组件 实现上拉加载更多。

我们在封装复用性组件的时候,组件名建议使用多个单词,避免跟现有的以及未来的 HTML 元素相冲突。

v-list 组件

<!-- 列表组件 -->
<template>
    <div class="list">
        <mt-loadmore 
            :bottom-method="loadBottom"
            :bottom-all-loaded="bottomAllLoaded"
            :autoFill="false" 
            ref="loadmore">
            <div v-for="(item,index) in list" :key="index">
                <!-- 这里是关键 slot 插槽 绑定 item 数据,父级可以访问 -->
                <slot v-bind="item"></slot>
            </div>
            <div class="store-no-more" v-if="noMoreShow">
              {{list.length==0?'暂无数据':'没有更多了'}}
            </div>
        </mt-loadmore>
    </div>
</template>
<script>
    import utils from '@/utils' // 公共方法
    export default {
        name:'v-list', 
        data:()=>({
            pageIndex:1, // 请求页
            list:[],//列表数据
            bottomAllLoaded:false,//上拉加载更多
            noMoreShow:false,//没有更多了 提示
        }),
        props:{
            // 请求配置 两个 key 1.url 请求api接口    2.data  请求参数
            requestData:{
                type:Object,
                default:()=>{},
            }
        },
        created(){
            this.getList();
        },
        components:{},
        methods:{
            //获取列表
            getList(){
                // data 请求列表参数 url  api 地址
                let {data,url} = this.requestData;
                // 请求列表数据  request 方法是 axios 请求封装
                utils.request({ 
                    params:{
                        url, // api
                        params:{
                            ...data,  // 混入请求参数
                            pageIndex:this.pageIndex,
                            pageSize:10,
                        }
                    },
                    success:(data)=>{
                        //接口返回list数组 具体的业务逻辑请结合你自己的项目 自己处理。
                        //比如:是不是最后一页,没有数据等等。
                        if( data.list ){
                                // 合并数组
                                this.list = [...this.list,...data.list]; 
                            }
                        // mint ui Loadmore 的一个方法。如果没有用过可以忽略。
                        // 本章学习的要点是 props 和 v-slot
                        this.$refs.loadmore.onBottomLoaded(); 
                    }
                })
            },
            //上啦加载更多
            loadBottom(){
                this.bottomAllLoaded = true;
                this.pageIndex++;
                this.getList();
            },
        }
    }
</script>

使用 v-list

<!-- 父级 -->
<template>
    <div class="view">
                                          <!-- 作用域插槽 -->
        <v-list :request-data="requestData" v-slot="item"> // 
            <div class="item">
                <!--具体的UI布局自行处理,这里我们可以访问数组项数据,
                访问数据可以通过  item.key 访问 ,
                比如:item.name名字  item.phone 手机号-->
            </div>
        </v-list>
    </div>
</template>
<script>
    import vList from '@/components/v-list/v-list'
    export default {
        data:()=>({
            // 我们传入 props 的数据 ,url  是 api 接口 ,
            // data  是我们请求列表数据的参数
            requestData:{ 
                url: 'api',
                data: {
                    // 请求列表参数
                }
            },
        }),
        components:{vList},
    }
</script>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

万水千山走遍TML

您的鼓励,将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值