用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 相关文章推荐
javascript脚本编程解决考试分数统计问题
Oct 18 Javascript
通过Jscript中@cc_on 语句识别IE浏览器及版本的代码
May 07 Javascript
JavaScript中把数字转换为字符串的程序代码
Jun 19 Javascript
JQuery对id中含有特殊字符的转义处理示例
Sep 06 Javascript
JQuery判断HTML元素是否存在的两种解决方法
Dec 26 Javascript
探寻Javascript执行效率问题
Nov 12 Javascript
酷炫jQuery全屏3D焦点图动画效果
Mar 22 Javascript
基于JavaScript实现弹幕特效
Aug 27 Javascript
js实现Tab选项卡切换效果
Jul 17 Javascript
vue实现压缩图片预览并上传功能(promise封装)
Jan 10 Javascript
vue实现鼠标经过动画
Oct 16 Javascript
浅谈vue中resetFields()使用注意事项
Aug 12 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网页游戏学习之Xnova(ogame)源码解读(十六)
2014/06/30 PHP
PHP实现简单数字分页效果
2015/07/26 PHP
php获取远程文件内容的函数
2015/11/02 PHP
PHP实现对文件锁进行加锁、解锁操作的方法
2017/07/04 PHP
Thinkphp5+uploadify实现的文件上传功能示例
2018/05/26 PHP
php实现微信公众平台发红包功能
2018/06/14 PHP
JS操作XML中DTD介绍及使用方法分析
2019/07/04 PHP
php解析非标准json、非规范json的方式实例
2020/12/10 PHP
Nigma vs Alliance BO5 第四场2.14
2021/03/10 DOTA
Prototype 学习 工具函数学习($方法)
2009/07/12 Javascript
js简单的弹出框有关闭按钮
2014/05/05 Javascript
js+jquery实现图片裁剪功能
2015/01/02 Javascript
javascript倒计时效果实现
2015/11/12 Javascript
jQuery插件pagination实现无刷新分页
2016/05/21 Javascript
使用jquery.qrcode.js生成二维码插件
2016/10/17 Javascript
老生常谈angularjs中的$state.go
2017/04/24 Javascript
vue element-ui 绑定@keyup事件无效的解决方法
2018/03/09 Javascript
nodejs实现的简单web服务器功能示例
2018/03/15 NodeJs
jquery操作select常见方法大全【7种情况】
2019/05/28 jQuery
浅谈VUE中演示v-for为什么要加key
2020/01/16 Javascript
Angular短信模板校验代码
2020/09/23 Javascript
微信小程序自定义modal弹窗组件的方法详解
2020/12/20 Javascript
Python实现合并字典的方法
2015/07/07 Python
python使用opencv读取图片的实例
2017/08/17 Python
python logging日志模块的详解
2017/10/29 Python
Python3.6基于正则实现的计算器示例【无优化简单注释版】
2018/06/14 Python
python的debug实用工具 pdb详解
2019/07/12 Python
django自带的权限管理Permission用法说明
2020/05/13 Python
VSCode中autopep8无法运行问题解决方案(提示Error: Command failed,usage)
2021/03/02 Python
普通大学毕业生自荐信
2013/11/04 职场文书
缓刑人员的思想汇报
2014/01/11 职场文书
优乐美广告词
2014/03/14 职场文书
大学学生会辞职信
2015/05/13 职场文书
会计试用期工作总结2015
2015/05/28 职场文书
2016应届大学生自荐信模板
2016/01/28 职场文书
浅谈css清除浮动(clearfix和clear)的用法
2023/05/21 HTML / CSS