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中实现一个动态滚动的时钟效果 的相关文章

  • 使用 vue-cli 服务时如何禁用 linting?

    我正在使用以下命令使用 vue cli 运行我的项目 vue cli service 服务 open 如何禁用所有 linting 目前每次保存时都会重新进行 linting 并且更改代码需要很长时间 我已经把 lintOnSave fal
  • Vue SPA - 如何在浏览器中呈现时隐藏 .vue 文件

    我正在开发一个用 Vue js 开发的单页应用程序 托管在 Node js 服务器上 目前它仍在开发中 但最终将暴露给外部客户 并且由于我们将处理敏感数据 我们希望避免在用户检查元素时看到 vue 文件和相对文件树结构在开发工具中 See
  • Vue-动态导入vue组件

    我有很多组件 我想按需导入 我有一个下拉菜单 其中实际上包含组件列表 即要加载的内容 我试过这个例子
  • Vuetify:v-ripple 只能用于块级元素

    我今天刚开始收到此错误 它破坏了我的整个网站 因为我像个傻瓜一样在页面加载时加载 Vuetify 有谁知道这意味着什么或如何解决它 谷歌搜索没有发现任何有用的信息 Edit 对于因网站也损坏而发现此问题的任何人 这可能是因为您加载的位置vu
  • Nuxt JS 插件是否可以只运行一次?

    我有几个 VueX 操作 仅在服务器上运行 并从nuxtServerInit 它们向外部服务发出 HTTP 请求 这会减慢 TTFB 的速度 我想实现一个缓存插件 可以从 Redis 存储和检索值 目的是避免在每个请求的操作中发出 HTTP
  • Vue Router - 使用 Vue 2 Composition API 获取路由参数

    我正在使用Vue 2 组合 API https github com vuejs composition api并想从我的 Vue Router 访问路由参数setup method 如中所述Vue 路由器文档 https next rou
  • 为网格注入浏览器前缀不适用于 Vue

    我已经在这件事上浪费了一个下午的时间了 我被难住了 我发现IE11不支持grid template我需要使用 ms grid columns and ms grid rows相反 我正在尝试生成一些 CSS 并通过 Vue 方法注入它 这适
  • Vue 组件方法未在动态 HTML 中的事件上运行

    我正在尝试动态创建一些 HTML 内容并将 Vue 组件方法绑定到元素上的事件 然而这不起作用 下面是问题的描述和测试用例的片段 重现问题的步骤 Click 点我1 观察控制台 Click 切换工具提示的弹出框 Click 点我2 观察控制
  • $vuetify.goTo 不会在 v-card 组件内滚动

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

    我正在尝试使用 vue3 和 ref 方法访问父组件中的子方法 但它返回一个错误 未捕获的类型错误 addNewPaper value savePaper 不是函数 下面是我的代码 请指导我哪里错了 子组件
  • 如何隔离 Vuetify 全局样式

    我已经开始在旧的现有项目中将 Vue js 与 Vuetify 结合使用 所以我没有重写所有前端 我只是导入了Vue并替换了一些部分 然后我注意到一个非常意想不到的行为 Vuetify 具有常见类的全局样式 例如 title它不仅影响整个页
  • 将 Select2(多项选择)与 vue.js 结合使用

    我是 vue 新手 并遵循了他们的 自定义指令 http vuejs org examples select2 html http vuejs org examples select2 html 当仅选择一个项目时 此方法效果很好 但当您选
  • 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
  • node.js、vue.js 和express.js 堆栈开发

    我正在尝试使用 Linux 上的 Visual Studio Code IDE 使用 vue js express js 和 node js 创建一个 Web 应用程序 根据网上的一些文档 我读到安装 vue js 后 可以创建一个vue
  • 如何在Vue中获取输入字段值

    我是 Vue 新手 我需要一些帮助来从输入字段获取值 在我的表格中 我有
  • Vue 3:使用渲染函数将所有项目包装在一个自定义组件中

    我正在尝试建立自己的sortable成分 我想将项目列表传递到它的默认插槽 然后 可排序组件应该用自定义包装所有传递的项目v draggable成分
  • Vue.js 更改 {{ }} 标签

    我想改变 something by 在 Vue js 中 我怎样才能实现这一点 这可能吗 我在 AngularJS 中寻找的等效项 var app angular module app function interpolateProvide
  • 如何在 Atom 中启用 .vue 文件的语法突出显示?

    我开始使用 Vue js 我遇到的第一个问题是我的 IDE Atom 无法美化我的 vue 文件 这一切都只是白色的文字 如何让 Atom 正确突出显示 vue 文件 语言 vue https atom io packages langua
  • { ...obj1, obj2 } 到底做什么[重复]

    这个问题在这里已经有答案了 假设我们有两个对象 const state fishes some obj data animals some obj data const animals some NEW data 在Vuex中有一个方法re

随机推荐

  • 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