用Vue编写抽象组件的方法


Posted in Javascript onMay 06, 2019

看过 Vue 源码的同学可以知道,<keep-alive>、<transition>、<transition-group>等组件

组件的实现是一个对象,注意它有一个属性 abstract 为 true,表明是它一个抽象组件。

Vue 的文档没有提这个概念,在抽象组件的生命周期过程中,我们可以对包裹的子组件监听的事件进行拦截,也可以对子组件进行 Dom 操作,从而可以对我们需要的功能进行封装,而不需要关心子组件的具体实现。

<!-- more -->

下面实现一个 debounce 组件,对子组件的 click 事件进行拦截

核心代码如下:

<script>
import {get, debounce, set} from 'loadsh';

export default {
  name: 'debounce',

  abstract: true, //标记为抽象组件

  render() {
    let vnode = this.$slots.default[0]; // 子组件的vnode
    if (vnode) {
      let event = get(vnode, `data.on.click`); // 子组件绑定的click事件
      if (typeof event === 'function') {
        set(vnode, `data.on.click`, debounce(event, 1000));
      }
    }
    return vnode;
  }
};
</script>

使用

<debounce>
  <button @click="clickHandler">测试</button>
</debounce>

可以看到,按钮的 click 事件已经加上了去抖(debounce)操作。

我们可以进一步对 debounce 组件进行优化。

<script>
import {get, debounce, set} from '@/utils';

export default {
  name: 'debounce',

  abstract: true, //标记为抽象组件

  props: {
    events: String,
    wait: {
      type: Number,
      default: 0
    },
    options: {
      type: Object,
      default() {
        return {};
      }
    }
  },

  render() {
    let vnode = this.$slots.default[0]; // 子组件的vnode

    if (vnode && this.events) {
      let eventList = this.events.split(',');
      eventList.forEach(eventName => {
        let event = get(vnode, `data.on[${eventName}]`); // 子组件绑定的click事件
        if (typeof event === 'function') {
          /**
           * 加上debounce操作, 参数与 lodash 的debounce完全相同
           */
          set(vnode, `data.on[${eventName}]`, debounce(event, this.wait, this.options));
        }
      });
    }
    return vnode;
  }
};
</script>

使用

<debounce events="click" :wait="250" :options="{maxWait: 1000}">
  <button @click="clickHandler">测试</button>
</debounce>

我们同样可以为输入框的 input 事件进行 debouce 操作

<debounce events="input" :wait="250" :options="{maxWait: 1000}">
  <input @input="inputandler" placeholder="输入关键字进行搜索" />
</debounce>

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

Javascript 相关文章推荐
一个简单的jQuery插件制作 学习过程及实例
Apr 25 Javascript
常用Extjs工具:Extjs.util.Format使用方法
Mar 22 Javascript
cookie在javascript中的使用技巧以及隐私在服务器端的设置
Dec 03 Javascript
Extjs 继承Ext.data.Store不起作用原因分析及解决
Apr 15 Javascript
jQuery实现异步获取json数据的2种方式
Aug 29 Javascript
用javascript关闭本窗口技巧小结
Sep 05 Javascript
Js实现自定义右键行为
Mar 26 Javascript
jquery利用拖拽方式在图片上添加热链接
Nov 24 Javascript
javascript匀速动画和缓冲动画详解
Oct 20 Javascript
原生JS实现移动端web轮播图详解(结合Tween算法造轮子)
Sep 10 Javascript
用vuex写了一个购物车H5页面的示例代码
Dec 04 Javascript
Vue开发中常见的套路和技巧总结
Nov 24 Vue.js
JS解惑之Object中的key是有序的么
May 06 #Javascript
微信小程序和百度的语音识别接口详解
May 06 #Javascript
微信小程序生成海报分享朋友圈的实现方法
May 06 #Javascript
vue项目打包后上传至GitHub并实现github-pages的预览
May 06 #Javascript
Vue实现购物车的全选、单选、显示商品价格代码实例
May 06 #Javascript
JavaScript中关于base64的一些事
May 06 #Javascript
JavaScript中工厂函数与构造函数示例详解
May 06 #Javascript
You might like
十天学会php之第四天
2006/10/09 PHP
浅析PHP substr,mb_substr以及mb_strcut的区别和用法
2013/06/21 PHP
PHP开发中常见的安全问题详解和解决方法(如Sql注入、CSRF、Xss、CC等)
2014/04/21 PHP
在WordPress中使用wp_count_posts函数来统计文章数量
2016/01/05 PHP
浅谈PHP中类和对象的相关函数
2017/04/26 PHP
Yaf框架封装的MySQL数据库操作示例
2019/03/06 PHP
php利用array_search与array_column实现二维数组查找
2019/07/08 PHP
js报错 Object doesn't support this property or method的原因分析
2011/03/31 Javascript
jquery跨域请求示例分享(jquery发送ajax请求)
2014/03/25 Javascript
JavaScript获取鼠标移动时的坐标(兼容IE8、chome谷歌、Firefox)
2014/09/13 Javascript
Jquery技巧(必须掌握)
2016/03/16 Javascript
js获取新浪天气接口的实现代码
2016/06/06 Javascript
js事件驱动机制 浏览器兼容处理方法
2016/07/23 Javascript
vue如何安装使用Quill富文本编辑器
2018/09/21 Javascript
vue.js click点击事件获取当前元素对象的操作
2020/08/07 Javascript
openLayer4实现动态改变标注图标
2020/08/17 Javascript
浅谈vue.watch的触发条件是什么
2020/11/07 Javascript
Python fileinput模块使用实例
2015/06/03 Python
Python编程之event对象的用法实例分析
2017/03/23 Python
python爬虫入门教程--HTML文本的解析库BeautifulSoup(四)
2017/05/25 Python
python实现括号匹配的思路详解
2018/08/23 Python
Python实现程序判断季节的代码示例
2019/01/28 Python
使用python接受tgam的脑波数据实例
2020/04/09 Python
使用Keras预训练好的模型进行目标类别预测详解
2020/06/27 Python
实例代码讲解Python 线程池
2020/08/24 Python
HTML+CSS3模拟心的跳动实例代码
2017/09/05 HTML / CSS
微信浏览器左上角返回按钮拦截功能
2017/11/21 HTML / CSS
html5将图片转换成base64的实例代码
2016/09/21 HTML / CSS
Oakley官网:运动太阳镜、雪镜和服装
2016/09/30 全球购物
英国最大的LED专业零售商:Led Hut
2018/03/16 全球购物
某公司C#程序员面试题笔试题
2014/05/26 面试题
前台领班岗位职责
2013/12/04 职场文书
导游个人求职信范文
2014/03/23 职场文书
购房协议书
2014/04/11 职场文书
护理专科毕业自荐信范文
2014/04/21 职场文书
2015大学生自我评价范文
2015/03/03 职场文书