跑马灯效果——this的使用和计时器

本文介绍如何在Vue.js中使用定时器实现动画效果,通过不断更新数据触发视图变化,实现文字滚动动画。利用Vue的VM机制,结合setInterval与clearInterval,演示了开始与停止动画的具体实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

注意:

1.VM机制,加载完页面后还持续监听data数据,一旦改变随之改变。是本地改变页面的基础,也是这个框架优点

2.了解在此机制中,在VM实例中,如果想要获取data中的数据,或者调用methods中的方法,要使用this关键字实现

3.ES6不是idea的默认规范,要调整。

HTML代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>   
    <script src="../lib/vue.js"></script>
</head>
<body>
      <div id="app">
          <input type="button" value="执行" v-on:click="start"></input>
          <input type="button" value="停止" v-on:click="stop"></input>
          
          <h3>{{ msg }}</h3>
      </div>

      <script>
          //注意:在VM实例中,如果想要获取data中的数据,或者调用methods中的方法,要使用this关键字实现
          //VM机制,加载完页面后还持续监听data数据,一旦改变随之改变
          var app = new Vue({
              el:'#app',
              data:{
                  msg:'每天起床第一句,燃烧我的卡路里~~',
                  intervalId: null
                  //初始的id将其设置为null,空    
                  
              },
              methods:{ //methods中可以实现ES6的写法,跟java中定义一个方法是一样的
                  start(){
                      if(this.intervalId !=null) return;
                      //执行一个监听器后,intervalID将被赋值,再次点击不会再次开启一个监听器
                      
                      this.intervalId = setInterval( () => {
                          var head = this.msg.substring(0,1);
                          var end = this.msg.substring(1);
                          //分别获取第一个字,和其他剩余所有的字,互换位置,达到将第一个字放在最后的效果
                          
                          this.msg = end + head;
                          //自动装箱和拆箱 
                      },200)   
                      //箭头效果解决低版本的this指向的问题,这里可以直接指向外部的vm实例,而不用再写 var _this=this    
                  },
                  stop(){ //停止计时器
                      clearInterval(this.intervalId);
                      this.intervalId = null;
                      //执行一次后,intervalId被赋值,停止后需要清除才能再次执行    
                  }
              }
          })
      </script>
</body>
</html>

效果:

 

import matrix4 from '@ohos.matrix4' import { promptAction, router } from '@kit.ArkUI'; import { NavBar } from '../component/NavBar'; import { getAlbum } from '../utils/SelectImage'; import { ForumPost, forumPostDao } from '../dataBase/ForumPostDao'; @Entry @Component struct AddPost { @State imageUrl: string = ''; @State context: string = '添加正文' @State tittle: string = '添加标题' private async addPost() { const userId = AppStorage.get("userId") as number; const now = new Date(); const formattedDate = `${now.getFullYear()}-${(now.getMonth() + 1).toString().padStart(2, '0')}-${now.getDate() .toString() .padStart(2, '0')} ${now.getHours().toString().padStart(2, '0')}:${now.getMinutes() .toString() .padStart(2, '0')}:${now.getSeconds().toString().padStart(2, '0')}`; const data: ForumPost = new ForumPost(1, this.tittle, this.context, this.imageUrl, userId, formattedDate); forumPostDao.insert(data).then(() => { router.back(); }); } build() { Column({ space: 10 }) { NavBar({ title: '发布帖子' }) Image(this.imageUrl === '' ? $r('app.media.addImage') : this.imageUrl) .size({ width: '95%', height: 300 }).onClick(async () => { const imageUrlData = await getAlbum(1); this.imageUrl = imageUrlData.imageUrl[0]; }) TextInput({ placeholder: this.tittle }).fontSize(16).borderRadius(5).onChange((value: string) => { this.tittle = value; }) TextArea({ text: this.context }) .placeholderFont({ size: 16, weight: 400 }) .width('100%') .height(200) .maxLength(200) .borderRadius(5) .fontSize(14) .showCounter(true, { thresholdPercentage: 50, highlightBorder: true }) .onChange((value: string) => { this.context = value }) Blank().layoutWeight(1) Button('发布笔记') .onClick(async (event: ClickEvent) => { this.addPost(); }) .backgroundColor('#ffff0000') .width('100%') .height(40) .alignSelf(ItemAlign.Center) }.width('100%').height('100%').alignItems(HorizontalAlign.Start).padding({ left: 10, right: 10 }) } }根据代码生成一个详细的文档
最新发布
06-08
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值