vue3 setup+Taro3 调用原生小程序自定义年月日时分多列选择器,NutUI改造

这篇具有很好参考价值的文章主要介绍了vue3 setup+Taro3 调用原生小程序自定义年月日时分多列选择器,NutUI改造。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

vue3 setup+Taro3 调用原生小程序自定义年月日时分多列选择器,NutUI改造

NutUI 有日期时间选择器,但是滑动效果太差,卡顿明显。换成 原生小程序 很顺畅

vue3 setup+Taro3 调用原生小程序自定义年月日时分多列选择器,NutUI改造,微信公众号小程序,小程序,taro,javascript

上代码:

<template>
  <view>
    <picker
      mode="multiSelector"
      @change="confirmPicker"
      @columnChange="scrollColumnChange"
      :value="columnVal"
      :range="multiArray"
    >
      <nut-cell
        title="选择时间"
        :desc="showVal"
        @click="copyColumnVal = columnVal"
      ></nut-cell>
      <!-- <view @click="copyColumnVal = columnVal">
        当前选择:{{ showVal }}
      </view> -->
    </picker>
  </view>
</template>

<script setup>
import { ref, onMounted, watch } from "vue";
const multiArray = ref(undefined); // 列可选列表
const columnVal = ref(undefined); // 列当前选中值
const copyColumnVal = ref(undefined); // 记录滚动中数据
const showVal = ref(undefined); // 显示:后年月日时分

// 个位数时 补0
const add0 = (num) => String(num > 9 ? num : "0" + num);

// 判断平年闰年
const resYearType = (year) =>
  (year % 4 == 0) & (year % 100 != 0) || year % 400 == 0;

// 获取当前时间
const getNowT = (timeInfo) => {
  // timeInfo 为 年月日字符串 或者 时间戳
  var nowT = new Date(timeInfo);
  return {
    year: nowT.getFullYear(),
    month: nowT.getMonth() + 1,
    day: nowT.getDate(),
    hour: nowT.getHours(),
    minute: nowT.getMinutes(),
    second: nowT.getSeconds(),
  };
};

// 设置当前时间 - columnVal:每列索引数组集合
function setNowTime(timeStr) {
  const timeObj = getNowT(timeStr); // timeObj 为: { year, month, day... }
  const { year, month, day, hour, minute } = timeObj;
  // 获取滚动列表数据
  const [
    years,
    months,
    days,
    hours,
    minutes,
  ] = multiArray.value;
  const yearsIdx = years.findIndex((item) => item == year);
  const monthsIdx = months.findIndex((item) => item == month);
  const daysIdx = days.findIndex((item) => item == day);
  const hoursIdx = hours.findIndex((item) => item == hour);
  const minutesIdx = minutes.findIndex((item) => item == minute);
  columnVal.value = [yearsIdx, monthsIdx, daysIdx, hoursIdx, minutesIdx];
  showVal.value = `${year}/${add0(month)}/${add0(day)} ${add0(hour)}:${add0(
    minute
  )}`;

  // 根据当前时间,初始化可选择日期时间
  setDaysList(columnVal.value)
}

// 初始化时间
function initColumn(daysNum = 31) {
  // 年
  const yearStart = 2000; // 年 - 开始时间
  const yearLength = 100; // 年 - 列表长度
  const years = Array.from({ length: yearLength }).map((i, idx) =>
    add0((idx += yearStart))
  );

  // 月
  const months = Array.from({ length: 12 }).map((i, idx) => add0((idx += 1)));

  // 日
  const days = Array.from({ length: daysNum }).map((i, idx) =>
    add0((idx += 1))
  );

  // 时
  const hours = Array.from({ length: 24 }).map((i, idx) => add0((idx += 0)));

  // 分
  const minutes = Array.from({ length: 60 }).map((i, idx) => add0((idx += 0)));

  multiArray.value = [
    years,
    months,
    days,
    hours,
    minutes,
  ];
}

// 滚动设置可选天数 28 - 29 - 30 - 31
function setDays(daysNum = 31) {
  multiArray.value[2] = Array.from({ length: daysNum }).map((i, idx) =>
    add0((idx += 1))
  );

  // 深拷贝下,否则不动态修改列
  multiArray.value = JSON.parse(JSON.stringify(multiArray.value));
}

// 修改每月的天数
function setDaysList(columnArr) {
  const [yearsIdx, monthsIdx] = columnArr;
  const [years] = multiArray.value;
  // 当选择2月
  if (monthsIdx == 1) {
    // 如果闰年
    if (resYearType(years[yearsIdx])) {
      setDays(29);
    } else {
      setDays(28);
    }
  } else if ([1, 3, 5, 7, 8, 10, 12].includes(monthsIdx + 1)) {
    // 当选择1, 3, 5, 7, 8, 10, 12月
    setDays(31);
  } else {
    setDays(30);
  }
}

// 确认选中结果
function confirmPicker(e) {
  columnVal.value = e.detail.value;
  const [yearsIdx, monthsIdx, daysIdx, hoursIdx, minutesIdx] = e.detail.value;
  const [years, months, days, hours, minutes] = multiArray.value;
  showVal.value = `${years[yearsIdx]}/${months[monthsIdx]}/${days[daysIdx]} ${hours[hoursIdx]}:${minutes[minutesIdx]}`;
}

// 滚动事件(未点击确定)
function scrollColumnChange(e) {
  const { column, value } = e.detail;
  copyColumnVal.value[column] = value;
  setDaysList(copyColumnVal.value);

  console.log("修改的列为", column, ",值为", value);
}

// 初始化
onMounted(() => {
  initColumn();

  // 回显时间
  setNowTime(new Date().getTime());
});


// 监听传递日期
const props = defineProps({
  propsTime: {
    type: String,
    default: ''
  }
})
watch(props.propsTime, (newValue, oldValue) => {
  console.log('值发生了变更', newValue, oldValue);
  // 回显时间
  setNowTime(newValue);
});

</script>

若需要自定义年开始时间,见 initColumn 方法

vue3 setup+Taro3 调用原生小程序自定义年月日时分多列选择器,NutUI改造,微信公众号小程序,小程序,taro,javascript

如作为组件,通过父级传递,可使用:

vue3 setup+Taro3 调用原生小程序自定义年月日时分多列选择器,NutUI改造,微信公众号小程序,小程序,taro,javascript文章来源地址https://www.toymoban.com/news/detail-641760.html

到了这里,关于vue3 setup+Taro3 调用原生小程序自定义年月日时分多列选择器,NutUI改造的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Taro3的编译配置

    taro的编译配置存放在项目根目录下的 config 文件中,有三个文件 index.js 是通用配置 dev.js 是项目开发时的配置 prod.js 是项目打包时的配置 1. 默认配置 2. 配置详情 sourceRoot 源代码存在的目录 类型: string 默认: src outputRoot 打包后的代码存在目录 类型: string 默认: dist design

    2024年02月13日
    浏览(70)
  • vue3自定义dialog createApp setup语法组件使用element

    目录  index.vue mapDialog.js

    2024年02月14日
    浏览(34)
  • vue3的setup函数中定义data数据,使用data数据

    vue3保留了vue2的语法,但是不能混着用,setup中定义原有vue2中data数据的方法有所改变 直接上代码 对比原有vue2代码 data() {             return {                 name: \\\"张三\\\",                 age:18             }     } 在setup函数中使用数据也无需 this.xxx, 而是用你定义的名字

    2024年02月12日
    浏览(29)
  • 在uniapp vue3 setup语法糖中调用onLoad、onShow等生命周期

    从 @dcloudio/uni-app 导出 可导出项:

    2024年02月16日
    浏览(34)
  • Taro+Vue3 小程序引入echarts表

    背景:根据需求在一个报告界面需要展示不同的echarts表来使数据更友好的显示。 效果如下: 一.taro支持echarts 官方说明:Taro 文档支持引用小程序端第三方组件库 物料文档:Taro 物料市场 | 让每一个轮子产生价值 二.引入echarts-for-weixin插件 github地址: https://github.com/ecomfe/echar

    2024年02月13日
    浏览(24)
  • vue3+taro+Nutui 开发小程序(一)

    前言:最近在调研开发小程序,发现现在taro框架逐渐成熟,能完美地使用vue3来进行开发,调研中发现京东的Nutui也不错所以准备写一个由0到1的vue3+taro+Nutui的小程序。 这篇我们首先搭建一个框架: vscode插件准备环节: 目前我用到的插件如下: Eslint   用来vue格式化代码的

    2024年02月08日
    浏览(25)
  • vue3+taro+Nutui 开发小程序(二)

    上一篇我们初始化了小程序项目,这一篇我们来整理一下框架 首先可以看到我的项目整理框架是这样的:  components:这里存放封装的组件 custom-tab-bar:这里存放自己封装的自定义tabbar interface:这里放置了Ts的一些基本泛型,不用Ts的可以忽略 pages:这里放置了小程序的所有页面

    2024年02月16日
    浏览(34)
  • Taro + vue3 + js + nutUI 框架中自定义tabbar的组件封装以及页面跳转的逻辑

    1.需求:   在H5 中需要封装一个自定义的tabbar 菜单跳转 通过nut-ui 进行二次封装 2. 注意点   H5 中原生的tabbar 在ios 中会出现问题 所以进行 封装tabbar 3. 代码操作 首先全部的代码  4.解析 tabList: 菜单的内容数组  根据自己菜单的数量 来决定 const tabList = reactivemenu[]([     {    

    2024年04月17日
    浏览(30)
  • Taro+Vue3开发微信小程序的分享好友功能

    1、背景:使用taro框架和vue3框架开发小程序,实现一个把pdf文件直接分享给微信好友。 一开始看taro文档理解有偏差,导致分享出去的文件是个app的小程序连接。如下图  实现代码如下: 后续仔细查看taro文档, Taro 文档,发现这种写法是个页面组件,转发出去的是个小程序,

    2024年02月12日
    浏览(47)
  • taro+vue3 搭建一套框架,适用于微信小程序和H5

    安装 Taro。可以在终端输入以下命令进行安装: 创建项目。使用以下命令创建 Taro+Vue3 项目: 其中,myApp 是项目名称。 进入项目并启动。使用以下命令进入项目并启动: 注意,需要先进入对应的目录再启动。 编写代码。在 src 目录下编写代码,可以像使用 Vue 开发 Web 应用程

    2024年02月10日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包