用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 相关文章推荐
超级强大的表单验证
Jun 26 Javascript
JScript内置对象Array中元素的删除方法
Mar 08 Javascript
使用jquery实现以post打开新窗口
Mar 19 Javascript
JavaScript实现点击自动选择TextArea文本的方法
Jul 02 Javascript
深入浅析Extjs中store分组功能的使用方法
Apr 20 Javascript
mongoose中利用populate处理嵌套的方法
May 26 Javascript
微信小程序wx.getImageInfo()如何获取图片信息
Jan 26 Javascript
使用ngrok+express解决本地环境中微信接口调试问题
Feb 26 Javascript
vue axios 表单提交上传图片的实例
Mar 16 Javascript
深入浅出理解JavaScript高级定时器原理与用法
Aug 02 Javascript
js实现通过开始结束控制的计时器
Feb 25 Javascript
浅谈js数组splice删除某个元素爬坑
Oct 14 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与SQL注入攻击[一]
2007/04/17 PHP
具有时效性的php加密解密函数代码
2013/06/19 PHP
解析PHP正则提取或替换img标记属性
2013/06/26 PHP
Laravel5.1 框架Middleware中间件基本用法实例分析
2020/01/04 PHP
javascript 一段左右两边随屏滚动的代码
2009/06/18 Javascript
JQuery与JSon实现的无刷新分页代码
2011/09/13 Javascript
Javascript模块化编程详解
2014/12/01 Javascript
jQuery制作仿Mac Lion OS滚动条效果
2015/02/10 Javascript
3种js实现string的substring方法
2015/11/09 Javascript
JavaScript中eval函数的问题
2016/01/31 Javascript
动态加载css方法实现和深入解析
2017/01/18 Javascript
vue组件如何被其他项目引用
2017/04/13 Javascript
微信小程序实现的canvas合成图片功能示例
2019/05/03 Javascript
JS+canvas五子棋人机对战实现步骤详解
2020/06/04 Javascript
js实现滑动滑块验证登录
2020/07/24 Javascript
JQuery基于FormData异步提交数据文件
2020/09/01 jQuery
JS实现4位随机验证码
2020/10/19 Javascript
Python引用(import)文件夹下的py文件的方法
2014/08/26 Python
python实现向ppt文件里插入新幻灯片页面的方法
2015/04/28 Python
详解python调度框架APScheduler使用
2017/03/28 Python
python smtplib发送带附件邮件小程序
2018/05/22 Python
使用Py2Exe for Python3创建自己的exe程序示例
2018/10/31 Python
使用matplotlib中scatter方法画散点图
2019/03/19 Python
Django实现跨域的2种方法
2019/07/31 Python
django项目简单调取百度翻译接口的方法
2019/08/06 Python
python 解决flask uwsgi 获取不到全局变量的问题
2019/12/22 Python
Python3 使用selenium插件爬取苏宁商家联系电话
2019/12/23 Python
Django之富文本(获取内容,设置内容方式)
2020/05/21 Python
Python使用Matlab命令过程解析
2020/06/04 Python
Python3实现英文字母转换哥特式字体实例代码
2020/09/01 Python
CSS 说明横向进度条最后显示文字的实现代码
2020/11/10 HTML / CSS
戴森美国官网:Dyson美国
2016/09/11 全球购物
Lampenwelt德国:欧洲领先的灯具和照明在线商店
2018/08/05 全球购物
好习惯伴我成长演讲稿
2014/05/21 职场文书
师范生求职信
2014/06/14 职场文书
放假通知怎么写
2015/08/18 职场文书