Vant2组件库的基础应用

news2024/12/22 15:30:34

目录

一、Picker 选择器

1.1、数组对象处理

1.2、每个选项颜色设置

二、滚动分页加载列表

三、Calendar 日历(可选范围限制)

四、input值过滤

官网:Vant 2 - Mobile UI Components built on Vue

一、Picker 选择器

官网示例数据:

columns: ['杭州', '宁波', '温州', '绍兴', '湖州', '嘉兴', '金华', '衢州'],

1.1、数组对象处理

  一般接口返回格式是数组对象,在项目中van-picker的数组如果含有对象,则需要包含 text 属性用于显示的文本、value 属性作为选择器的值,如果接口返回的结果中属性名和我们期望的不一样,就自己map设置一下。

<template>
      <van-field
        v-model="segmentSign.text"
        clearable
        label="所属列表"
        placeholder="点击选择所属列表"
      >
        <template #right-icon>
          <van-icon name="arrow" @click="showPicker = true" />
        </template>
      </van-field>
    <!-- 复杂数组的选择器 -->
    <van-popup v-model="showPicker" position="bottom" :lazy-render="false">
      <van-picker
        show-toolbar
        :columns="segmentList"
        @confirm="onConfirm"
        @cancel="showPicker = false"
      >
      </van-picker>
    </van-popup>
</template>
<script>
  data() {
      showPicker: false,
      segmentList: [],
      segmentSign: {},
    };
  },
  methods: {
    onConfirm(val) {
      this.segmentSign = val;
      this.showPicker = false;
    },
    async getDepartList() {
      let res = await findDepartList();
      if (res.data.code == 200) {
        let data = res.data.result || [];
        if (data.length > 0) {
          let result = data.map((item) => {
            let res = {};
            res.text = item.deptName;
            res.value = item.deptId;
            res.teacherId = item.teacherId;
            return res;
          });
          this.segmentList = result;
          if (this.segmentList && this.segmentList.length > 0) {
            this.segmentSign = this.segmentList[0];
          }
        }
      } else {
        Toast(res.data.message);
      }
    },
}
</script>

1.2、每个选项颜色设置

#option="option"里面放个div,是为了让每一行的样式可以自己设置,也可以加更多内容!

<template>
        <van-picker
          :columns="columns"
          ref="van_picker"
          :default-index="StatusVal.status"
          @change="PickerChange"
        >
          <template #option="option">
            <div
              style="display: flex; flex-direction: column; align-items: center"
            >
              <div :style="'color:' + colorType(option.id)">
                {{ option.value }}
              </div>
            </div>
          </template>
        </van-picker>
</template>
<script>
  data() {
      columns: [
        { id: 0, value: "出勤" },
        { id: 1, value: "迟到" },
        { id: 2, value: "旷课" },
        { id: 3, value: "早退" },
        { id: 4, value: "请假" },
      ],
      StatusVal: {},
      selectId: "",
    };
  },
  methods: {
    // picker选项改变
    PickerChange(val, index) {
      this.selectId = index.id;
    },
    colorType(index) {
      const colors = ["#6BC25E", "#F0A55C", "#E77575", "#F0A55C", "#6FBFF1"];
      return colors[index] || "";
    },
}
</script>

列表默认值属性 :default-index结合setIndexes才能将默认值修改自己想要的结果

      this.$nextTick(() => {
        this.$refs.van_picker.setIndexes([this.StatusVal.status]); // 注意这里是数组[索引值]
      });

二、滚动分页加载列表

  页面初始化时加载初始列表方法,随着页面向下滚动和刷新,页面递增,此时发送请求,获取下一页数据,这个适用于vue2,只需要换成自己的接口和循环组件即可!

<template>
          <!-- 下拉刷新 -->
          <van-pull-refresh v-model="isLoading" @refresh="onRefresh">
            <!-- 列表 -->
            <van-list
              v-if="valueLists.length > 0"
              v-model="loading"
              :finished="finished"
              finished-text="没有更多了"
              :immediate-check="false"
              offset="50"
              @load="onLoad"
            >
              <group-items
                v-for="(item, index) in valueLists"
                :key="index"
                :infoItems="item"
              ></group-items>
            </van-list>
            <van-empty
              image-size="150"
              v-else
              :image="
                require('../../../../static/images/courseSelection/wu.png')
              "
              description="暂无数据"
              class="empty"
            />
            <!-- end -->
          </van-pull-refresh>
</template>
<script>
  data() {
    return {
      finished: false,
      loading: false,
      isLoading: false,
      valueLists: [],
      pageNum: 1,
      pageSize: 10,
      pages: 0,
    };
  },
  created() {
    this.findRecordPageFun();
  },
  methods: {
    // 下拉刷新
    onRefresh() {
      // 重置页码
      this.pageNum = 1;
      // 重置刷新状态
      this.finished = false;
      this.loading = false;
      // 请求列表
      this.findRecordPageFun();
    },
    // 加载更多
    onLoad() {
      this.findRecordPageMore();
    },
    // 获取初始列表
    findRecordPageFun() {
      let params = {
        pageNo: this.pageNum,
        pageSize: this.pageSize,
      };
      this.invokeApi(findRecordPage, params).then((res) => {
        if (res.data.code == 200) {
          this.valueLists = res && res.data.result.records;
          this.pages = res && res.data.result.pages;
          if (this.isLoading) return (this.isLoading = false);
        } else {
          Toast(res.data.message);
          this.valueLists = [];
          this.pages = 0;
          this.pageNum = 1;
          this.finished = false;
          this.loading = false;
        }
      });
    },
    async findRecordPageMore() {
      // 请求页码+1
      let finePage = this.pageNum + 1;
      // 判断页码极限
      if (finePage > this.pages) return (this.finished = true);
      let params = {
        pageNo: this.pageNum,
        pageSize: this.pageSize,
      };
      this.invokeApi(findRecordPage, params).then((res) => {
        if (res.data.code == 200) {
          this.pages = res.data.result.pages;
          this.valueLists.push(...res.data.result.records);
          this.pageNum = finePage;
          this.loading = false;
        } else {
          Toast(res.data.message);
          this.valueLists = [];
          this.pages = 0;
          this.pageNum = 1;
          this.finished = false;
          this.loading = false;
        }
      });
    },
}
</script>

三、Calendar 日历(可选范围限制)

<template>
      <van-field
        v-model="times"
        readonly
        clearable
        placeholder="点击选择日期"
        class="custom-field"
      >
        <template #right-icon>
          <van-icon name="arrow" @click="showDate = true" />
        </template>
      </van-field>
      <!-- 日历 -->
      <van-calendar
        v-model="showDate"
        @confirm="dateConfirm"
        color="#1989fa"
        :min-date="minDate"
        :max-date="maxDate"
      />
</template>
<script>
  data() {
    return {
      times:'',
      showDate: false,
      minDate: this.getStartOfWeek(new Date()),
      maxDate: this.getEndOfWeek(new Date()),
    };
  },
  methods: {
    getStartOfWeek(date) {
      const day = date.getDay();
      const diff = date.getDate() - day + (day === 0 ? -6 : 1);
      return new Date(date.setDate(diff));
    },
    getEndOfWeek(date) {
      const startOfWeek = this.getStartOfWeek(date);
      const endOfWeek = new Date(startOfWeek);
      endOfWeek.setDate(endOfWeek.getDate() + 6);
      return endOfWeek;
    },
    dateConfirm(time) {
      const date = new Date(time);
      const year = date.getFullYear();
      const month = (date.getMonth() + 1).toString().padStart(2, "0");
      const day = date.getDate().toString().padStart(2, "0");
      this.times = `${year}-${month}-${day}`;
      this.showDate = false;
    },
}
</script>

场景介绍:

点击field栏,选择本周时间,选中后将值回显(minDate和maxDate在方法里限制了范围,在确定事件里整理格式,然后赋值给field栏绑定的值)

四、input值过滤

为啥不用  v-model.trim="xx",因为它只能过滤头部和尾部的空格,而不能过滤中间的,所以自己再写了个方法。

          <van-search
            v-model="searchValue"
            placeholder="请输入姓名"
            show-action
            @input="trimLR"
          >
            <template #action>
              <div @click="getCheckList">搜索</div>
            </template>
          </van-search>
    // 过滤空格
    trimLR() {
      this.searchValue = this.searchValue.replace(/\s+/g, "");
    },

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1843463.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

有趣的 Oracle JDBC 驱动包命名问题 - ojdbc6 和 ojdbc14 哪个新?!

有趣的 Oracle JDBC 驱动包命名问题 - ojdbc6 和 ojdbc14 哪个新?! 1 背景概述 最近协助一个小兄弟排查了某作业使用 sqoop 采集 oracle 数据的失败问题&#xff0c;问题现象&#xff0c;问题原因和解决方法都挺直观&#xff0c;但在此过程中发现了一个有趣的 Oracle JDBC 驱…

JAVA每日作业day6.20

ok了家人们&#xff0c;今天学习了面向对象的继承&#xff0c;话不多说让我们看看怎么个事。 我们先把昨天学 面向对象-封装 的温习一下&#xff0c;来个例子 1&#xff0c;综合案例 做一个关于学生的随机点名器 定义了两个变量&#xff0c;name和age&#xff0c;给他们封装一…

java封装模块为jar包- FUSE 智能BPM低代码平台-企业级

第一种方法 将打好的项目模块jar放入lib文件夹内 操作后 项目便有了此jar包的依赖 第二种方法 使用 maven引入 可以参考我之前发的博客 IDEA导入jar包_idea导入jar包方法-CSDN博客

简单分享github

一、官网 GitHub: Let’s build from here GitHub 二、注册 通过简单的注册步骤&#xff0c;你就可以拥有一个属于自己的GitHub账号。再简单注册完成之后会需要验证你所输入的邮箱才能正常使用你的GitHub。 三、设置自己的库 在注册完成之后&#xff0c;完成一些简单的设置之…

PS给logo加白色描边

步骤1&#xff1a;打开你的Logo文件 步骤2&#xff1a;选择Logo层 在“图层”面板中找到你的Logo所在的图层。如果你的Logo是在背景图层上&#xff0c;可以将它转换为普通图层&#xff08;右键点击背景图层&#xff0c;选择“从背景图层转换”&#xff09;&#xff08;此处也…

【转载】TIOBE 编程指数 6 月排行榜公布,vb.net排第九

原文地址&#xff1a;https://baijiahao.baidu.com/s?id1801368030428902126&wfrspider&forpc IT之家 6 月 9 日消息&#xff0c;TIOBE 编程社区指数是一个衡量编程语言受欢迎程度的指标&#xff0c;评判的依据来自世界范围内的工程师、课程、供应商及搜索引擎&#…

【服务器02】之阿里云平台

百度一下阿里云官网 点击注册直接使用支付宝注册可以跳过认证 成功登录后&#xff0c;点击产品 点击免费试用 点击勾选 选一个距离最近的 点满GB 注意&#xff1a;一般试用的时用的是【阿里云】&#xff0c;真正做项目时用的是【腾讯云】 现在开始学习使用&#xff1a; 首先…

Samtec制造理念系列二 | 差异变量管理的意义与挑战

【摘要/前言】 制造高端电子产品是非常复杂精密的过程。制作用于演示或原型的一次性样品可能具有挑战性&#xff0c;但真正的挑战在于如何以盈利的方式持续生产。 这就是Samtec风险投资研发工程总监Aaron Tucker在一次关于生产高密度微小型连接器的挑战的演讲中所强调的观点。…

使用宝塔面板搭建Flask项目保姆级喂饭教程

目录 零.前言 一.准备工作 1.1创建requirements.txt文件 1.2将项目打包为压缩文件 1.3租一台服务器 1.4部署宝塔面板 二.宝塔面板(服务器)上的操作 2.1将本地Flask项目上传到服务器 2.2添加Python项目 2.3配置Python项目 2.4配置Nginx 2.5宝塔面板放行端口 2.6在服…

2024年一建报名汇总和常见问题答疑!

2024年一级建造师报名通知全国32个地区均已发布&#xff0c;考试100汇总如下&#xff0c;大家务必及时报名&#xff0c;千万不要错过&#xff01; ​ 报名问题 01、时间不多了&#xff0c;今年可以先考部分学科吗&#xff1f;分两年考完&#xff1f; 可以的&#xff0c;一建…

视觉SLAM14精讲——相机与图像3.3

视觉SLAM14精讲 三维空间刚体运动1.0三维空间刚体运动1.1三维空间刚体运动1.2李群与李代数2.1相机与图像3.1相机与图像3.2 视觉SLAM14精讲——相机与图像3.3 视觉SLAM14精讲相机投影流程双目相机模型 相机投影流程 至此&#xff0c;有关相机三维刚体变换的所有因素已经汇集。…

朗科HD10M2Pr震撼上市,自带风扇极速降温,匹敌私有云

近日,存储领域的领军企业朗科旗下全资子公司朗科创新宣布,其最新款磁吸硬盘盒HD10M2Pr正式上市。这款产品凭借超薄设计、极速降温、高速传输等多项优势,迅速成为了行业内的讨论焦点。 随着移动设备使用的普及和短视频内容的日益丰富,对于存储空间不断增长的需求逐渐成为日常生活…

react项目中如何书写css

一&#xff1a;问题&#xff1a; 在 vue 项目中&#xff0c;我们书写css的方式很简单&#xff0c;就是在 .vue文件中写style标签&#xff0c;然后加上scope属性&#xff0c;就可以隔离当前组件的样式&#xff0c;但是在react中&#xff0c;是没有这个东西的&#xff0c;如果直…

如何解决windows自动更新,释放C盘更新内存

第一步&#xff1a;首先关闭windows自动更新组件 没有更新windows需求&#xff0c;为了防止windows自动更新&#xff0c;挤占C盘空间&#xff0c;所以我们要采取停止Windows Update服务。按下WinR打开运行对话框&#xff0c;输入services.msc&#xff0c; 然后按Enter。在服务…

数据安全治理全面解析:企业数字化转型的守护者

在数字化时代&#xff0c;数据成为了企业至关重要的资产&#xff0c;这包括敏感的知识产权、商业机密、交易数据&#xff0c;以及与员工、客户和业务合作伙伴有关的所有业务相关数据。这些数据不仅对企业具有极高的价值&#xff0c;同时也吸引了那些企图非法获取利益的不法分子…

连锁餐厅降低员工离职率:发誓!绝不是靠“舌尖上的诱惑”

员工社交与成长&#xff0c;企业福利与文化&#xff0c;沃可趣多维度优化员工体验。 连锁餐饮业在全球范围内迅速发展&#xff0c;要为消费者提供更多便利&#xff0c;2023年中国餐饮市场连锁化率达到21%。 然而&#xff0c;这些分散式门店为企业运营创造了挑战。Black Box I…

微信小程序使用方法

一.在网页注册小程序账号&#xff08;在未注册的情况下&#xff09; 1.如果你还没有微信公众平台的账号&#xff0c;请先进入微信公众平台首页&#xff0c;点击 “立即注册” 按钮进行注册。我们选择 “小程序” 即可。 接着填写账号信息&#xff0c;需要注意的是&#xff0c;…

MATLAB直方图有关的函数

histogram Histogram plot画直方图 histcounts 直方图 bin 计数 histcounts是histogram的主要计算函数。 discretize 将数据划分为 bin 或类别 histogram2 画二元直方图 histcounts2 二元直方图 bin 计数 hist和histc过时了。替换不建议使用的 hist 和 histc 实例 hist → \r…

【C语言】函数指针

首先看一段代码&#xff1a; #include <stdio.h>void test(){printf("hehe\n");}int main(){printf("%p\n", test);printf("%p\n", &test);return 0;} 输出的结果&#xff1a; 输出的是两个地址&#xff0c;这两个地址是 test 函数的…

[Mysql] 的基础知识和sql 语句.教你速成(上)——逻辑清晰,涵盖完整

目录 前言 上篇的内容概况 下篇的内容概况 数据库的分类 关系型数据库 常见的关系型数据库系统 非关系型数据库 1. 键值对数据库&#xff08;Key-Value Stores&#xff09; 特点&#xff1a; 常见的键值对数据库&#xff1a; 2. 文档数据库&#xff08;Document Store…