vue3中实现一个动态滚动的时钟效果

2023-11-09

前言:

        用vue3如何来实现一个滚动的时钟效果呢?这里来分享下方法。

注意,因为vue3很多写法都不同,所以这里多分享点东西。

实现效果:

 

 实现步骤:

1、路由添加

import { createRouter, createWebHashHistory } from 'vue-router'

const router = createRouter({
  history: createWebHashHistory(),
  routes: [
    {
      path: '/a',
      name: 'ScrollTime',
      component: () => import('../components/scrollTime.vue')
    }
  ]
})

export default router

2、在components里面新建一个scrllTime.vue文件

首先引入配置,因为vue3是按需引入,把需要的内容导入

 import {
    defineComponent,
    reactive,
    watch,
    toRefs,
    onMounted,
  } from 'vue'

其次,开始他的具体方法定义

1)data数据定义,实现双向绑定方法

const data = reactive({})
return {
    ...toRefs(data),
}

2)methods方法定义

setup() {

    function abc(){}
    function clickFun(){}
    
    return{
        clickFun, //发送以后,界面上就可以调用了
    }
}

3)生命周期,mounted方法使用

//初始化调用,如果是create方法,直接在setup里面调用就行
onMounted(() => {
   getTime()
})

3)watch监听

setup(){  
      //watch监听机型
      watch(
        () => data.index5,
        (newVal) => {
          debugger
          // 超过24小时
          if (data.index6 === 2 && newVal === 4) {
            for (let i = 1; i < 7; i++) {
              data[`index${i}`] = 0
            }
          }
        },
      )

}

源码:

<template>
  <div class="wraper">
    <div class="column" :style="{transform: `translateY(${-lineHeight*index6}px)`}">
      <div class="num" v-for="(item, index) in arr6" :key="index">{{ item }}</div>
    </div>
    <div class="column" :style="{transform: `translateY(${-lineHeight*index5}px)`}">
      <div class="num" v-for="(item, index) in arr5" :key="index">{{ item }}</div>
    </div>
    <div>:</div>

    <div class="column" :style="{transform: `translateY(${-lineHeight*index4}px)`}">
      <div class="num" v-for="(item, index) in arr4" :key="index">{{ item }}</div>
    </div>

    <div class="column" :style="{transform: `translateY(${-lineHeight*index3}px)`}">
      <div class="num" v-for="(item, index) in arr3" :key="index">{{ item }}</div>
    </div>

    <div>:</div>

    <div class="column" :style="{transform: `translateY(${-lineHeight*index2}px)`}">
      <div class="num" v-for="(item, index) in arr2" :key="index">{{ item }}</div>
    </div>

    <div class="column" :style="{transform: `translateY(${-lineHeight*index1}px)`}">
      <div class="num" v-for="(item, index) in arr1" :key="index">{{ item }}</div>
    </div>
  </div>
</template>

<script>
  import {
    defineComponent,
    reactive,
    watch,
    toRefs,
    onMounted,
  } from 'vue'
  export default defineComponent ({
    name: "ScrollTime",
    setup() {
      /************************ todo-定义数据data(START) ************************/
      const data = reactive({
        lineHeight: 64, //跟字体大小和wraper的高度相关!
        // 秒
        arr1: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
        index1: 0, //就是获取真实时间后的起始数字
        arr2: [0, 1, 2, 3, 4, 5],
        index2: 0,
        // 分
        arr3: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
        index3: 0,
        arr4: [0, 1, 2, 3, 4, 5],
        index4: 0,
        // 时
        arr5: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
        index5: 0,
        arr6: [0, 1, 2],
        index6: 0
      })
      /************************ todo-定义数据data(END) ************************/
      /************************ todo-生命周期(START) ************************/
      onMounted(() => {
        getTime()
      })
      //watch监听机型
      watch(
        () => data.index5,
        (newVal) => {
          debugger
          // 超过24小时
          if (data.index6 === 2 && newVal === 4) {
            for (let i = 1; i < 7; i++) {
              data[`index${i}`] = 0
            }
          }
        },
      )

      /************************ todo-生命周期(END) ************************/
      /************************ todo-methods(START) ************************/
      function getTime() {
        const date = new Date()
        let hour = bu0(date.getHours())
        let minute = bu0(date.getMinutes())
        let second = bu0(date.getSeconds())

        // 秒
        data.index1 = +second[1]
        data.index2 = +second[0]
        // 分
        data.index3 = +minute[1]
        data.index4 = +minute[0]
        // 时
        data.index5 = +hour[1]
        data.index6 = +hour[0]

        turnSecond(data.arr1.length)
      }

      function turnSecond(length) {
        setInterval(() => {
          if (data.index1 === length - 1) {
            // 通知前一位移动
            turnOther(2, data.arr2.length)
            data.index1 = -1
          }
          data.index1++
        }, 1000)
      }

      function bu0(num) {
        let str
        if (num < 10) str = `0${num}`
        else str = `${num}`
        return str.split('')
      }

      function turnOther(type, length) {
        // type代表第几组数列,例如2,就是从右往左第二列
        if (data[`index${type}`] === length - 1) {
          // console.log(type)
          // 通知前一位移动
          let next = type + 1
          turnOther(next, data[`arr${next}`].length)

          data[`index${type}`] = -1
        }
        data[`index${type}`]++
      }
      /************************ todo-methods(END) ************************/

      return {
        //数据
        ...toRefs(data),
      }
    }
  })
</script>

<style scoped>
  .wraper {
    text-align: center;
    background: #ffffff;
    height: 64px;
    font-size: 48px;
    font-weight: bolder;
    letter-spacing: 7px;
    margin-top: 7px;
    display: flex;
    justify-content: center;
    overflow:hidden;

  }
  .column {
    transition: transform 300ms;
  }
  .num {
    height: 64px;
  }
</style>

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

vue3中实现一个动态滚动的时钟效果 的相关文章

  • 如何减少 WEBPACK + VUEJS 中的包大小

    我遵循了很多有关如何减小捆绑包大小的教程 但没有任何内容对捆绑包大小产生任何影响 我不知道为什么 每次当我向 webpack 添加一些新代码时 我的包大小都保持与以前相同 我的应用程序是使用 vue cli 3 pwa 插件 webpack
  • 如何在 ChartJS 中创建自定义图例

    我需要使用 ChartJS 库为我的圆环图创建自定义图例 我已经使用 ChartJS 提供的默认图例创建了甜甜圈 但我需要一些修改 我希望其价值高于汽车名称 另外 我不喜欢粘性图例 我想将其与甜甜圈分开 这样我就可以更改字体 框的样式 例如
  • $vuetify.goTo 不会在 v-card 组件内滚动

    我有一个带有 v 卡的组件 我在卡片标题区域放置了一个简单的按钮 当我单击时 我看到该方法被触发 它显示在控制台中 但是 卡片永远不会滚动 如果我输错了类名 则会收到错误 因此 goTo 似乎会执行某些操作 因为它找不到该类 没有拼写错误
  • Vue js按钮冻结dom

    我试图在按下按钮时切换包含加载动画的跨度 直到使用 v if 函数完成 但是当我按下按钮时 DOM 冻结并且 span 元素保持不变 直到函数调用结束 如何让 DOM 不冻结并显示加载图标 非阻塞按钮按下可能是一个解决方案 HTML
  • 如何在 vuejs 中防止/停止点击传播

    我有一个递归列表 树 每个元素都有一个 click sayHello el id 现在的问题是 因为它是一个嵌套列表 例如 list element 0 01 list el 1 01 list el 2 01 list el 1 02 l
  • 将 Select2(多项选择)与 vue.js 结合使用

    我是 vue 新手 并遵循了他们的 自定义指令 http vuejs org examples select2 html http vuejs org examples select2 html 当仅选择一个项目时 此方法效果很好 但当您选
  • 使用 Javascript 在前端创建基本 URL(开发、API 和生产)

    无论开发和部署如何 如何制作适用于 http https localhost 端口和实际域的基本 url 我想创建一个可以在所有场景或条件下工作的基本 url 无论 http https 协议 端口 本地主机和实际域如何 无论是在开发中还是
  • 如何使用vue.js获取点击时按钮的值

    我在页面上有几个按钮 它们连接到相同的方法webcamSendRequestButton
  • Vuejs ssr 检查用户是否针对每个请求进行了身份验证

    我正在为我的应用程序使用这个 ssr 样板 https github com vuejs vue hackernews 2 0 https github com vuejs vue hackernews 2 0 我不知道如何实现逻辑来检查每
  • 使用 vue.js 显示 json 结果

    您好 我尝试使用 vue js 显示 json 文件结果 目标是结果将显示在值上 这是我的代码 data return fetchData function var self this self http get api casetotal
  • 模拟安装挂钩 Jest 测试装置

    我正在对组件进行一些单元测试 但是 在某些组件中 我有一些东西在运行mounted使我的测试失败的钩子 我设法模拟了我不需要的方法 但是 我想知道是否有一种解决方法可以模拟mounted钩住自己 components attendeesLi
  • VueJS - 访问已安装的存储数据

    我无法理解以下内容 我有一个store其中包含应用程序所需的变量 特别地 有一个globalCompanies哪些商店 globalCompanies current all currentName 在另一个组件中 我想执行以下操作 mou
  • 在 ES6 中使用 import 和 require 的正确方法是什么?

    关于 import 和 require 及其差异有多个问题 像这些 JavaScript 中的 import 和 require 有什么区别 https stackoverflow com questions 51373933 what i
  • Vue js - 在同一级别的两个组件内传递数据

    我有需要从一个传递的数据component1到另一个component2 我不使用vuex or router 组件树 Parent Component1 Component2 从一开始component1我发出 ajax 请求 检索信息并
  • 未向导出的模块提供此上下文

    我对问题的提出感到不满意 受到鼓励提出改进建议 另外 请记住 由于无知 无知导致烦恼 我对问题的诊断可能有缺陷 对于那个很抱歉 In 这个答案 https stackoverflow com a 40893583 1525840建议使用th
  • vue如何检测页面是否刷新?

    我尝试这样 created window addEventListener beforeunload function event event returnValue Write something this router push 像这样
  • 从组件传递数据

    我对 Vue 相当陌生 我正在尝试将数据从组件传递到视图 我不确定我是否在使用props正确的 我有一个对话框 当我保存时 我想将数据插入数据库 我也想重复使用addCustomer function 这就是为什么我没有将该函数放置在组件中
  • 用变量字符串设置槽的简单方法?

    有许多slot例子 但没有克莱尔和简单 因为我需要 我需要类似的东西 var x Hello slot x 这就是我需要的 在一个具体的例子中 https jsfiddle net 2qdh3x3v https jsfiddle net 2
  • FullCalendar-vue + Typescript:属性“getApi”不存在

    我尝试将 FullCalendar vue 与 Typescript 结合使用 但在访问其 API 时遇到错误 我的日历设置如下
  • Vue 3 Composition API 提供/注入在单文件组件中不起作用

    我正在使用 Composition API 在 VueJS 3 中创建一个库 我实现了提供 注入 如中所述docs https v3 vuejs org guide composition api provide inject html i

随机推荐

  • Scribe配置文件解析

    Scribe的配置文件由全局的section和一个或多个store的section组成 这篇来了解一下scribe的配置文件 在源码包的examples目录下有多个配置文件实例 examples example1 conf 模拟服务端 ex
  • 缺失值处理 - 拉格朗日插值法 - Python代码

    目录 缺失值处理 拉格朗日差值法的理论基础 拉格朗日插值法代码实现 其他数据预处理方法
  • 【Git】Git复习

    常用的Linux命令 1 cd 改变目录 2 cd 回退到上一个目录 直接cd进入默认目录 3 pwd 显示当前所在的目录路径 4 ls ll 都是列出当前目录中的所有文件 只不过ll 两个ll 列出的内容更为详细 5 touch 新建一个
  • python3把jpg png图片转换为ico图标

    环境ubuntu 20 04系统 python3 需要安装PythonMagick 然后可以直接调用PythonMagick包了 window暂时没有测试 sudo apt get install y python3 pythonmagic
  • 手把手带大家搭建一台服务器(腾讯云为例)

    今天带大家入门如何搭建服务器 主要是面向小白读者 先说好 我自己也不是专业做后端的 只不过平时爱折腾点项目玩玩 所以有点小经验 本文就是基于这点小经验讲解的 如有不当之处还请谅解 一 什么是服务器 这个问题被问过不止10次 对于小白来说服务
  • java rsa加密数据大小_RSA加密解密(无数据大小限制,php、go、java互通实现)

    RSA加解密中必须考虑到的密钥长度 明文长度和密文长度问题 明文长度需要小于密钥长度 而密文长度则等于密钥长度 因此当加密内容长度大于密钥长度时 有效的RSA加解密就需要对内容进行分段 这是因为 RSA算法本身要求加密内容也就是明文长度m必
  • Java的数据库编程:JDBC

    目录 一 JDBC是什么 二 使用步骤 1 首先将JDBC的包引进java中 2 创建新的类来写代码 3 描述你的服务器 4 设置你的数据库地址 数据库用户名 数据库密码 5 连接数据库 6 书写你所要执行的SQL语句 7 把字符串风格的s
  • [已解决] Mac上下载Visual Studio code非常缓慢

    概述 环境 MacBook Pro 从官网下载 https code visualstudio com 使用自带的Safari浏览器 步骤如下 进入vscode官方网站 https code visualstudio com Downloa
  • SumatraPDF

    SumatraPDF 是Windows平台上一款免费阅读器 它支持打开 PDF ePub MOBI XPS DjVu CHM CBZ 和 CBR 格式 Sumatra PDF 很小并且启动迅速 支持多国语言 含中文 支持绿色便携版 安装版可
  • 基础语言-最后一天-时间模块和随机模块

    时间模块和随机模块 1 time模块 1 1导入时间模块 import time 1 2睡眠 sleep 时间 时间的单位 秒 1 3获取当前时间 time 时间戳 定义 通过时间差来表示具体的时间 指定时间到1970年1月1日0时0分0秒
  • 如何使用request.post(Python)直接发送数组类型的方式

    我们先来看一下request的源码 Constructs a class Request
  • macOS BigSur下无法在根目录创建/data解决方法

    sudo vim etc synthetic conf 添加 data xxx data 建立 data到 xxx data的链接 data和 xxx data之间是tab不是空格 重启后生效 注意 请把 xxx data替换成你自己的目录
  • C++绑定器和函数对象

    C 绑定器和函数对象 简介 C STL中的绑定器 bind1st operator 的第一个形参变量绑定一个确定的值 bind2nd operator 的第二个形参变量绑定一个确定的值 C Boost库 C 的Boost库中引入了bind绑
  • PID整定之临界比例度法

    概述 在闭环的控制系统中 激励为阶跃信号 将调节器置于纯比例作用下 从小到大逐渐改变调节器比例度的大小 直到出现等幅振荡的过渡过程 此时的比例度称为临界比例度 r 1 K p 相邻两个波峰间的距离称为临界振荡周期T r 比例增益K Pr 图
  • 智能指针(三):unique_ptr使用简介

    我们知道auto ptr通过复制构造或者通过 赋值后 原来的auto ptr对象就报废了 所有权转移到新的对象中去了 而通过shared ptr可以让多个智能指针对象同时拥有某一块内存的访问权 但假如我们不希望多个内存块被多个智能指针对象共
  • Python开发Activex组件

    Python强的功能就在于它无所不能 使用win32com模块开发window ActiveX的示例 如果你还没有装win32com模块的话 请到http python net crew skippy win32 Downloads htm
  • C0210 [2012普及组-A]质因数分解-C语言写

    题目描述 已知正整数n是两个不同的质数的乘积 试求出较大的那个质数 输入描述 输入只有一行 包含一个正整数n 输出描述 输出只有一行 包含一个正整数p 即较大的那个质数 样例输入 1 21 样例输出 1 7 提示 数据范围 对于60 的数据
  • 伪造HTTP请求中的IP信息

    很多程序需要检测客户端的IP地址 然后来授予相关的权限 比如数据库读写 文件读写 等等 其实还有一个很常见的应用 网站投票 网站投票始于2000年的左右 那时候 COM正热得发红 红得发紫 早 期的投票只要投了就行可能技术牛人们还没有想到一
  • 数据结构8.13刷题

    8 13 队列
  • vue3中实现一个动态滚动的时钟效果

    前言 用vue3如何来实现一个滚动的时钟效果呢 这里来分享下方法 注意 因为vue3很多写法都不同 所以这里多分享点东西 实现效果 实现步骤 1 路由添加 import createRouter createWebHashHistory f