用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 相关文章推荐
用js实现手把手教你月入万刀(转贴)
Nov 07 Javascript
jQuery中使用了document和window哪些属性和方法小结
Sep 13 Javascript
javascript 中String.match()与RegExp.exec()的区别说明
Jan 10 Javascript
js格式化货币数据实现代码
Sep 04 Javascript
JS中的异常处理方法分享
Dec 22 Javascript
弹出遮罩层后禁止滚动效果【实现代码】
Apr 29 Javascript
JS弹出窗口插件zDialog简单用法示例
Jun 12 Javascript
Javascript中常见的逻辑题和解决方法
Sep 17 Javascript
String字符串截取的四种方式总结
Nov 28 Javascript
浅谈react+es6+webpack的基础配置
Aug 09 Javascript
利用js实现前后台传送Json的示例代码
Mar 29 Javascript
ES6对象操作实例详解
May 23 Javascript
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 获取文件路径(灵活应用__FILE__)
2013/02/15 PHP
跟我学Laravel之安装Laravel
2014/10/15 PHP
php实现Mongodb自定义方式生成自增ID的方法
2015/03/23 PHP
PHP多态代码实例
2015/06/26 PHP
PHP设计模式之观察者模式实例
2016/02/22 PHP
PHP构造函数与析构函数用法示例
2016/09/28 PHP
php解决crontab定时任务不能写入文件问题的方法分析
2019/09/16 PHP
Display SQL Server Login Mode
2007/06/21 Javascript
Jquery ui css framework
2010/06/28 Javascript
JavaScript全排列的六种算法 具体实现
2013/06/29 Javascript
js动态添加删除,后台取数据(示例代码)
2013/11/25 Javascript
绑定回车enter事件代码
2014/05/18 Javascript
cookie的secure属性详解
2015/04/08 Javascript
实例讲解JS中setTimeout()的用法
2016/01/28 Javascript
使用jQuery Rotare实现微信大转盘抽奖功能
2016/06/20 Javascript
微信小程序 教程之模块化
2016/10/17 Javascript
Bootstarp基本模版学习教程
2017/02/01 Javascript
vue.js element-ui tree树形控件改iview的方法
2018/03/29 Javascript
原生JS实现动态加载js文件并在加载成功后执行回调函数的方法
2020/12/30 Javascript
详解SPA中前端路由基本原理与实现方式
2018/09/12 Javascript
javascriptvoid(0)含义以及与&quot;#&quot;的区别讲解
2019/01/19 Javascript
小程序如何获取多个formId实现详解
2019/09/20 Javascript
[50:04]DOTA2上海特级锦标赛D组小组赛#2 Liquid VS VP第二局
2016/02/28 DOTA
python获得文件创建时间和修改时间的方法
2015/06/30 Python
python中os模块详解
2016/10/14 Python
Django进阶之CSRF的解决
2018/08/01 Python
Html5之webcoekt播放JPEG图片流
2020/09/22 HTML / CSS
Monnier Frères美国官网:法国知名奢侈品网站
2016/11/22 全球购物
专科毕业生学习生活的自我评价
2013/10/26 职场文书
大学生就业自我鉴定
2013/10/26 职场文书
毕业生毕业总结的自我评价范文
2013/11/02 职场文书
竞选部门副经理的自荐书范文
2014/02/11 职场文书
贸易跟单员英文求职信
2014/04/19 职场文书
英语通知范文
2015/04/22 职场文书
发言稿之优秀教师篇
2019/09/26 职场文书
Java实现二维数组和稀疏数组之间的转换
2021/06/27 Java/Android