vue+vant实现全选、单选、下拉加载功能

通过 vant 的 Checkbox 来进行列表数据的选择,需求单选、多选、下拉加载、最多选中功能

了解:
  • Checkbox 可搭配 CheckboxGroup 进行选中和非选中状态切换
  • 使用到的参数 max(最大可选)、@change(当绑定值变化时触发)
  • van-list 无限加载功能
  • 未选中按钮置灰,选中按钮可点击触发事件

html

<template>
  <div class="advance">
    <div class="item-box">
      <van-checkbox-group
        v-model="result"
        ref="checkboxGroup"
        @change="thechangCheck"
        :max="10"
      >
        <van-list
          v-model="loadings"
          :finished="finisheds"
          finished-text="没有更多了"
          @load="onLoads"
        >
          <div v-for="(item, index) in this.dataList" :key="index">
            <van-checkbox :name="item">
              <div class="items">
                <div class="items-lf">
                  <div class="lf-text">
                    <div>交易收款</div>
                    <div>{{ item.counterPartiesName }}</div>
                  </div>
                  <div class="lf-time">
                    <div>结算日期:</div>
                    <div>{{ item.settlementDate }}</div>
                  </div>
                </div>
                <div class="items-rg">
                  <div class="rg-num">
                    +<span>{{ item.amount }}</span>
                  </div>
                  <div class="rg-type">{{ item.settleStatusText }}</div>
                </div>
              </div>
            </van-checkbox>
          </div>
        </van-list>
      </van-checkbox-group>
    </div>
    <div class="hintbox">
      <div class="top-text">
        <div class="texts">
          提现金额:<span></span><span>{{ this.priceNum }}</span>
        </div>
        <div class="texts">
          手续费:<span></span><span>{{ this.feeNum }}</span>
        </div>
      </div>
    </div>
    <div class="foot">
      <div>
        <van-checkbox v-model="checkAllFlag" @change="theAllCheck"
          >全选</van-checkbox
        >
      </div>
      <div
        @click="theOpenText"
        class="foot-rg"
        :class="this.result.length === 0 ? 'bg_gray' : ''"
      >
        提前收款
      </div>
    </div>
  </div>
</template>

js

// 按需引用组件
import {
  Checkbox, CheckboxGroup, list,
} from "vant";
export default {
  components: {
    [Checkbox.name]: Checkbox,
    [CheckboxGroup.name]: CheckboxGroup,
    [list.name]: list,
  },
  data() {
    return {
      // check选中数据
      result: [],
      // 第几页
      pageNum: 1,
      // 总页数
      endAllNum: 0,
      // 获取数据
      dataList: [],
      // 最大选择
      splicList: [],
      // 全选
      checkAllFlag: false,
      // list加载
      loadings: false,
      finisheds: false,
      // 手续费
      feeNum: "0.00",
      // 金额
      priceNum: "0.00",
    };
  },
  created() {
    this.getTypePwd();
    this.getAllData();
  },
  methods: {
    // 获取列表数据
    getAllData() {
      // 调用接口数据展示并分页
      this.$store.dispatch("balance/getSettlementList").then((data) => {
        if (data !== undefined) {
        	// 数据分页及全选数据取前十
            this.endAllNum = Math.ceil(data.totalNum / 10);
            this.splicList = this.dataList.slice(0, 10);
        }
      });
    },
    // 单选
    thechangCheck() {
      this.getpriceNum();
      // 当全选的数据有改变全选按钮取消选中
      if (this.result.length !== this.splicList.length) {
        this.checkAllFlag = false;
      }
    },
    // 全选
    theAllCheck(val) {
      if (val) {
      	// map遍历展示选中最大选中数
        this.result = [];
        this.result = this.splicList.map((item) => item);
      } else {
      	// 防止有一条数据取消选中后所有数据全部取消选中
        if (this.result.length === this.splicList.length) {
          this.checkAllFlag = false;
          this.result = [];
        }
      }
      this.getpriceNum();
    },
    // 下拉加载
    onLoads() {
      setTimeout(() => {
        if (this.pageNum >= this.endAllNum) {
          this.finisheds = true;
        } else {
          this.pageNum += 1;
          this.getAllData();
        }
        this.loadings = false;
      }, 1000);
    },
    // 计算价格
    getpriceNum() {
      if (this.result.length === 0) {
        this.feeNum = "0.00";
        this.priceNum = "0.00";
      }
      let zong = 0;
      this.result.forEach((item) => {
        zong += item.amount * 1;
        this.priceNum = zong.toFixed(2);
      });
      let shou = 0;
      this.result.forEach((item) => {
        shou += item.forwardFee * 1;
        this.feeNum = shou.toFixed(2);
      });
    },
  },
};

效果图

在这里插入图片描述
在这里插入图片描述

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
您可以通过使用Vant组件库和Vue 3来实现上拉分页和下拉刷新功能。下面是一个简单的示例代码: 首先,您需要安装Vant组件库。可以通过npm或yarn来安装。 ```bash npm install vant ``` 在Vue文件中,您需要引入Vant组件并注册使用它们。在需要使用上拉分页和下拉刷新的页面中,您可以使用Vant的`PullRefresh`和`List`组件实现。 ```vue <template> <div> <van-pull-refresh v-model="refreshing" @refresh="onRefresh"> <van-list v-model="loading" :finished="finished" @load="onLoad"> <!-- 这里是列表内容 --> <van-list-item v-for="item in list" :key="item.id">{{ item.text }}</van-list-item> </van-list> </van-pull-refresh> </div> </template> <script> import { ref, reactive } from 'vue'; export default { setup() { // 列表数据 const list = reactive([]); // 是否正在刷新 const refreshing = ref(false); // 是否正在加载更多数据 const loading = ref(false); // 是否已加载完所有数据 const finished = ref(false); // 模拟异步获取数据 const fetchData = () => { return new Promise((resolve) => { setTimeout(() => { resolve([ { id: 1, text: 'item 1' }, { id: 2, text: 'item 2' }, { id: 3, text: 'item 3' }, ]); }, 1000); }); }; // 下拉刷新事件 const onRefresh = () => { refreshing.value = true; // 模拟异步获取最新数据 fetchData().then((data) => { list.splice(0, list.length, ...data); refreshing.value = false; finished.value = false; }); }; // 上拉加载更多事件 const onLoad = () => { loading.value = true; // 模拟异步加载更多数据 fetchData().then((data) => { if (data.length > 0) { list.push(...data); } else { finished.value = true; } loading.value = false; }); }; return { list, refreshing, loading, finished, onRefresh, onLoad, }; }, }; </script> ``` 在上述代码中,我们通过`van-pull-refresh`组件实现下拉刷新功能,并通过`van-list`组件实现分页加载功能。当页面触发下拉刷新事件时,我们可以通过异步获取最新数据并更新列表。当页面触发上拉加载更多事件时,我们可以通过异步加载更多数据并追加到列表末尾。 这样,您就可以使用VantVue 3来实现上拉分页和下拉刷新功能了。希望对您有帮助!
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值