详解VUE的状态控制与延时加载刷新


Posted in Javascript onMarch 27, 2017

在实际项目中,我们经常会遇到这种状况,某些数据我们希望等到需要的时候再去获取,或者某些数据我们需要刷新,但是不必立刻刷新,而是延时到展示的时候再去刷新。

在DOM操作的年代,想要实现这样的功能可能会稍微麻烦一些,然而当我们使用数据驱动的mv*框架的时候,这个想要实现这个需求就容易了许多。

当我们理解数据驱动时,我们很容易想到将需要刷新的状态也设置成为某个数据,在需要刷新的地方watch这个数据,当刷新状态发生变动的时候,watch生效并执行刷新的方法,这就实现了延时刷新。而且我们不再需要关注延时的过程,只需要更改刷新状态就可以了。

现在我们用Vue来实现一个状态驱动的延时刷新。

首先我们利用vue的混合来实现一个统一的刷新接口,你可以把混合理解成一种特殊的继承来使用。

//刷新mixin
var refreshMixin = {
  props: ['refresh'],
  watch: {
    //状态监视
    'refresh': function (val) {
      //console.log(val)
      //刷新列表
      val && this.refreshData()
    },
  },
  created: function () {
    this.refresh && this.refreshData()
  },
}

在这个refreshMixin中,当组建创建或者refresh状态发生变更时,判断状态是否是true,如果是true,则调用组建的refreshData方法。

我们在组建当中混合这个refreshMixin,并且实现refreshData方法,就可以实现状态驱动刷新。

注意,refresh状态使用双向绑定,并且在调用refreshData方法时立刻将refresh状态置为false,以便下次调用。

下面给予一个完整的demo

<html>
<head>
  <meta charset="utf-8" />
  <title></title>
  <script src="http://cdn.jsdelivr.net/vue/1.0.26/vue.min.js"></script>
</head>
<body>
  <div id="root" style="padding-left:10%;padding-top:5%;">
    <delay-test v-bind:refresh.sync="testRefresh"
          v-bind:num.sync="num"></delay-test>
    <button type="button" v-on:click="refreshTest">刷新组件数据</button>
  </div>
  <template id="delayTempl">
    <div>
      延时加载数据: {{num}}
    </div>
  </template>

  <script type="text/javascript">
    //刷新mixin
    var refreshMixin = {
      props: ['refresh'],
      watch: {
        //状态监视
        'refresh': function (val) {
          //console.log(val)
          //刷新列表
          val && this.refreshData()
        },
      },
      created: function () {
        this.refresh && this.refreshData()
      },
    }
    //延时加载数据组件
    var delayComp = Vue.extend({
      template: '#delayTempl',
      mixins: [refreshMixin],
      props: ['num'],
      methods: {
        refreshData: function () {
          var self = this
          //注意,refresh状态使用双向绑定,并且在调用refreshData方法时立刻将refresh状态置为false,以便下次调用
          self.refresh = false
          setTimeout(function () {
            self.num++
          }, 5000)
        },
      },
    })
    //根实例
    var vm = new Vue({
      el: '#root',
      data: {
        testRefresh: false,
        num: 0,
      },
      methods: {
        refreshTest: function () {
          this.testRefresh = true
        }
      },
      components: {
        delayTest: delayComp,
      }
    })
  </script>
</body>
</html>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JavaScript 设计模式学习 Factory
Jul 29 Javascript
js限制textarea每行输入字符串长度的代码
Oct 31 Javascript
JS对HTML标签select的获取、添加、删除操作
Oct 17 Javascript
Javascript学习笔记之相等符号与严格相等符号
Nov 23 Javascript
JavaScript实现MIPS乘法模拟的方法
Apr 17 Javascript
jquery实现可自动判断位置的弹出层效果代码
Oct 12 Javascript
js表单中选择框值的获取及表单的序列化
Dec 17 Javascript
关于webuploader插件使用过程遇到的小问题
Nov 07 Javascript
Bootstrap标签页(Tab)插件使用方法
Mar 21 Javascript
vue的Virtual Dom实现snabbdom解密
May 03 Javascript
微信小程序 配置顶部导航条标题颜色的实现方法
Sep 20 Javascript
Vue实现购物车的全选、单选、显示商品价格代码实例
May 06 Javascript
vue2.0实战之使用vue-cli搭建项目(2)
Mar 27 #Javascript
js实现三级联动效果(简单易懂)
Mar 27 #Javascript
JS数组去重(4种方法)
Mar 27 #Javascript
JS实现隔行换色的表格排序
Mar 27 #Javascript
JavaScript实现获取远程的html到当前页面中
Mar 26 #Javascript
axios学习教程全攻略
Mar 26 #Javascript
js oncontextmenu事件使用详解
Mar 25 #Javascript
You might like
PHP的autoload自动加载机制使用说明
2010/12/28 PHP
PHP数据的提交与过滤基本操作实例详解
2016/11/11 PHP
深入理解JavaScript系列(4) 立即调用的函数表达式
2012/01/15 Javascript
js导出table到excel同时兼容FF和IE示例
2013/09/03 Javascript
javascript浏览器兼容教程之事件处理
2014/06/09 Javascript
js实现的页面矩阵图形变换特效
2016/01/26 Javascript
jquery分页插件jquery.pagination.js使用方法解析
2016/04/01 Javascript
jQuery代码实现表格中点击相应行变色功能
2016/05/09 Javascript
在JavaScript中对HTML进行反转义详解
2016/05/18 Javascript
jQuery中的通配符选择器使用总结
2016/05/30 Javascript
dul无法加载bootstrap实现unload table/user恢复
2016/09/29 Javascript
用jmSlip编写移动端顶部日历选择控件
2016/10/24 Javascript
详解使用fetch发送post请求时的参数处理
2017/04/05 Javascript
微信小程序后台解密用户数据实例详解
2017/06/28 Javascript
Vue computed计算属性的使用方法
2017/07/14 Javascript
vue实现表格增删改查效果的实例代码
2017/07/18 Javascript
jQury Ajax使用Token验证身份实例代码
2017/09/22 Javascript
浅谈jquery fullpage 插件增加头部和版权的方法
2018/03/20 jQuery
vue路由传参的基本实现方式小结【三种方式】
2020/02/05 Javascript
JavaScript实现无限轮播效果
2020/11/19 Javascript
[01:03:13]VG vs Pain 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
在python3环境下的Django中使用MySQL数据库的实例
2017/08/29 Python
Python队列、进程间通信、线程案例
2019/10/25 Python
详解Django配置JWT认证方式
2020/05/09 Python
Python Scrapy多页数据爬取实现过程解析
2020/06/12 Python
python 发送邮件的四种方法汇总
2020/12/02 Python
澳大利亚购买最佳炊具品牌网站:Cookware Brands
2019/02/16 全球购物
Fossil德国官网:化石手表、手袋、珠宝及配件
2019/12/07 全球购物
面向对象设计的原则是什么
2013/02/13 面试题
高中班级口号
2014/06/09 职场文书
乡镇党委书记个人整改措施
2014/09/15 职场文书
2014年党员加强作风建设思想汇报
2014/09/15 职场文书
2015年财务个人工作总结范文
2015/05/22 职场文书
导游词之太原天龙山
2020/01/02 职场文书
MySQL锁机制
2021/04/05 MySQL
使用Djongo模块在Django中使用MongoDB数据库
2021/06/20 Python