美文网首页
vue中改变data中的值,页面数据不变化的问题(js定时器函数

vue中改变data中的值,页面数据不变化的问题(js定时器函数

作者: mudssky | 来源:发表于2020-12-31 10:26 被阅读0次

    vue中改变data中的值,页面数据不变化的问题(js定时器函数,箭头函数的this指针问题)

    ​ 我这次写了一个实时显示时间戳的功能,但是我发现修改了data里面的时间戳变量以后,页面上不变化,并且在浏览器用vue官方的浏览器调试插件,发现组件中对应的时间戳变量并没有发生变化。

    ​ 这个现象让我很费解,最后在网上检索一番后找到了答案。

    ​ 一开始我的写法是这样的,在mounted函数里面,放了一个定时器,用来时刻改变currentTimeStamp的值。

    ​ 调试的时候,在mounted函数里面输出 console.log(this.currentTimeStamp)会发现是实时变化的,但是vue浏览器插件看到组件的变量没有发生变化。

    ​ 这是因为两个定时器函数setInterval和setTimeout的this指向,默认都是window,所以我们需要手动改变this指针。

    <script>
    export default {
      name: 'unix-timestamp',
      props: {
      },
      data () {
        return {
          // 存放当前时间数据的变量
          currentTimeStamp: this.getCurrentTimeStamp()
        }
      },
      methods: {
        // 获取当前时间戳使用的函数
        getCurrentTimeStamp () {
          const currentDate = new Date()
          return currentDate.getTime()
        }
      },
      mounted () {
        setInterval(function() {
          const currentDate = new Date()
          this.currentTimeStamp = currentDate.getTime()
        }, 1000)
      }
    }
    </script>
    
    

    改变定时器函数this指针的3个方法

    1. 在定时器函数外部,定义一个that变量把this保存下来作为参数传入。
    2. 使用bind方法(es5标准,低版本ie有兼容性问题),可以把函数的this指针绑定到bind的第一个参数上
    3. es6语法,箭头函数,函数体的this对象就是定义时所在的对象

    总结 ,定时器函数配合箭头函数使用比较合适

    修改成下面这样后,程序可以正常运行了。

     mounted: function () {
        setInterval(() => {
          const currentDate = new Date()
          this.currentTimeStamp = currentDate.getTime()
        }, 1000)
      }
    

    相关文章

      网友评论

          本文标题:vue中改变data中的值,页面数据不变化的问题(js定时器函数

          本文链接:https://www.haomeiwen.com/subject/bhsloktx.html