案例实现分析:

把第一个字符追加到最后一个字符身上去

基本结构:

<body>
<div id="app">
<input type="button" value="继续浪" @click="lang()"/>
<input type="button" value="别浪了" @click="stop()"/>
<h1>{{msg}}</h1>
</div>
<script src="./vue2.6.10.min.js"></script>
<script>
var vm = new Vue({
el: '#app',
data: {
msg:'浪起来吧~~~~哦耶'
},
methods: {
lang(){ },
stop(){ }
}
})
</script>
</body>

添加方法:

  1. 先截取到第一个字符,然后把这个字符放到结尾

截取字符串的方法 subsring()

substring()的使用如下:

var vm = new Vue({
el: '#app',
data: {
msg:'浪起来吧~~~~哦耶'
},
methods: {
add(){
// console.log(this.msg.substring(开始的索引,结束的索引(不包含结束的索引)))
// 想要获取'浪'
var num = this.msg.substring(0,1) console.log('获取浪' + '-------' + num)
//想要获取'吧'
var num2 = this.msg.substring(3,4)
console.log('获取吧'+' ------- '+ num2)
//想要获取'浪起来'
var num3 = this.msg.substring(0,3)
console.log('获取浪起来'+ ' ------- ' + num3) //substring(0)要是只传入一个参数0或者什么都不传的话,截取的就是全部字符串
var num4 = this.msg.substring()
console.log('获取全部' + ' ------- ' + num4) var num5 = this.msg.substring(0)
console.log('获取全部' + ' ------- ' + num5) //substring(1)要是只传入一个参数1的话,截取的就是出第一个字符以外的全部字符串
var num6 = this.msg.substring(1)
console.log('获取除第一个字符外的全部字符串'+'-------'+num6) } }
})

来吧展示:



获取第一个字符与除第一个字符的全部字符进行尾和头的拼接

var vm = new Vue({
el: '#app',
data: {
msg:'浪起来吧~~~~哦耶'
},
methods: {
lang(){
var header = this.msg.substring(0,1)
var body = this.msg.substring(1)
this.msg = body + header
console.log(this.msg)
}
} })



不可能每次都由我们自动去点击它才让它跑起来,所以需要添加定时器

methods:{
lang(){
setIntervar(function(){
var header = this.msg.substring(0,1)
var body = this.msg.substring(1)
this.msg = body + header
console.log(this.msg)
},400)
}
}

报错原因:

定时器中的this指向的使window,所以需要转换一下this的指向

解决方法:

使用箭头函数,箭头函数的特性:内部的this永远指向外部的this,所以this.msg也是指向vm实例的

lang(){
setInterval(() => {
var header = this.msg.substring(0,1)
var body = this.msg.substring(1)
this.msg = body + header
console.log(this.msg)
}, 400)
}

来吧展示:



别浪了 绑定停止事件stop()

<script>
var vm = new Vue({
el: '#app',
data: {
msg:'浪起来吧~~~~哦耶',
intervalId:null
},
methods: {
lang(){ // var intervalId = setInterval(() => {
this.intervalId = setInterval(() => {
var header = this.msg.substring(0,1)
var body = this.msg.substring(1)
this.msg = body + header
console.log(this.msg)
}, 400) },
stop(){
clearInterval(this.intervalId)
}
} })
</script>

解释:

clearInterval(this.intervalId)

这里应该给setInterval用变量接收一下

var intervalId = setInterval(()=>{})

然后把要把intervalId拿过来

但是stop()与lang()属于两个不同的函数,代表着两个不同的作用域

在clearInterval()中拿不到intervalId

不能写成clearInterval(intervalId)

注意:只要属于vm就能拿到this,data中的数据就都能拿到,只要能访问到this,那么this上的数据就能拿到

所以说把interval挂载到data身上,也就是在data中再添加一个变量

data:{ interval:null }

那么claeraInterval()就能拿到

就可以通过this.intervalId清除定时器

注意:

虽然实现了浪起来和别浪了的事件,但是有个bug在于:

每当点击浪起来的时候,就会重新开启触发新的定时器,会导致速度加快,并且点击别浪了也不会停止

解决办法:

办法一:在执行lang()方法的时候,先清除定时器

lang(){
clearInterval(this.intervalId)
this.intervalId = setInterval(() => {
var header = this.msg.substring(0,1)
var body = this.msg.substring(1)
this.msg = body + header
console.log(this.msg)
}, 400) },

注意(bug):

当频繁一直点击“继续浪”的时候,就会卡住停止,因为400毫秒就会执行下一次定时器,一直在点击的时候就会清定时器

最佳方式:

      lang(){
//如果定时器的id不等于null,就表示有定时器在执行了,直接退出就不会再开启第二个定时器
// if(this.intervalId !== null){
// return intervalId
// }
// 简写成
//if(this.intervalId !== null) return
if(this.intervalId !== null) return
this.intervalId = setInterval(() => {
var header = this.msg.substring(0,1)
var body = this.msg.substring(1)
this.msg = body + header
console.log(this.msg)
}, 400)

注意(bug):

当点击“别浪了以后”,再次点击“继续浪”没有再次执行,所以需要在stop()方法在清除定时器以后再重置定时器

stop(){
//如果不清除定时器的话,那么点击“别浪了”没有反应,不会停止
clearInterval(this.intervalId)
this.intervalId = null
//每当清除定时器之后,为了保证下次能够正常开启定时器,所以,需要把intervalIdcID重置为null
}

浪起来~~~哦耶的代码整合

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>浪起来~~哦耶</title>
</head>
<body>
<div id="app">
<input type="button" value="继续浪" @click="lang()"/>
<input type="button" value="别浪了" @click="stop()"/>
<h1>{{msg}}</h1>
</div>
<script src="./vue2.6.10.min.js"></script>
<script>
var vm = new Vue({
el: '#app',
data: {
msg:'浪起来吧~~~~哦耶',
intervalId:null
},
methods: {
lang(){
clearInterval(this.intervalId)
if(this.intervalId !== null) return
this.intervalId = setInterval(() => {
var header = this.msg.substring(0,1)
var body = this.msg.substring(1)
this.msg = body + header
console.log(this.msg)
}, 400) },
stop(){
clearInterval(this.intervalId)
this.intervalId = null
}
} })
</script>
</body>
</html>

来吧展示:

最新文章

  1. Entity Framework 6 with MySql
  2. maven项目 启动报错:java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoaderListener
  3. 动态作用域与this +apply和call +bind
  4. MySQL主从数据库同步延迟问题解决(转)
  5. [Asp.net Mvc]通过UrlHelper扩展为js,css静态文件添加版本号
  6. Java实现mysql数据库备份
  7. powerdesigner 使用的几点问题
  8. 站在巨人的肩膀上学习Android开发
  9. 查看Redis信息和状态
  10. TypeError: not enough arguments for format string
  11. html代替submit按钮的图片代码
  12. Git时光机穿梭
  13. 【算法编程】基于Miller-Rabin的大素数测试
  14. Unity进阶----AssetBundle_01(2018/10/30)
  15. idea格式化代码无效Ctrl+Alt+L
  16. QThread使用——关于run和movetoThread的区别
  17. 【LeetCode每天一题】Remove Element(移除指定的元素)
  18. Threadlocal 传递参数(百度二面)
  19. Spark streaming的正确使用。。
  20. PHP 实战之设计模式:PHP 中的设计模式

热门文章

  1. Python基础部分:11、文件和光标移动
  2. 面试 考察js基础不能不会的内容(第五天)
  3. C语言算法入门
  4. devexpress 中advBandedGridView内容自动换行和调整自适应行高
  5. 说一下 ArrayDeque 和 LinkedList 的区别?
  6. 解决"raise EnvironmentError("%s not found" % (_mysql_config_path,)) OSError: mysql_config not found"报错
  7. VulnHub靶机渗透实战9-vikings
  8. 《浅谈亚 log 数据结构在 OI 中的应用》阅读随笔
  9. 零基础入门数据挖掘——二手车交易价格预测:baseline
  10. JDK卸载