用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中与toggleClass等价的程序段 以及未来学习的方向
Mar 18 Javascript
js判断字符长度以及中英文数字等
Dec 31 Javascript
JQuery radio(单选按钮)操作方法汇总
Apr 15 Javascript
AngularJs Understanding the Model Component
Sep 02 Javascript
AngularJS实现的回到顶部指令功能实例
May 17 Javascript
React Js 微信禁止复制链接分享禁止隐藏右上角菜单功能
May 26 Javascript
Angular4.0中引入laydate.js日期插件的方法教程
Dec 25 Javascript
JS实现的Object数组去重功能示例【数组成员为Object对象】
Feb 01 Javascript
使用layer模态框给新页面传值的方法
Sep 27 Javascript
前端深入理解Typescript泛型概念
Mar 09 Javascript
js仿淘宝放大镜效果
Dec 28 Javascript
vue中div禁止点击事件的实现
Apr 02 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&amp;MYSQL分页原理及实现
2007/01/02 PHP
PHP 函数学习简单小结
2010/07/08 PHP
PHP随机生成随机个数的字母组合示例
2014/01/14 PHP
PHP批量删除jQuery操作
2017/07/23 PHP
JavaScript 语法集锦 脚本之家基础推荐
2009/11/15 Javascript
JSQL 基于客户端的成绩统计实现方法
2010/05/05 Javascript
jQuery dialog 异步调用ashx,webservice数据的代码
2010/08/03 Javascript
javascript中的void运算符语法及使用介绍
2013/03/10 Javascript
js日期联动示例
2014/05/02 Javascript
jQuery+ajax实现鼠标单击修改内容的方法
2014/06/27 Javascript
jQuery通过点击行来删除HTML表格行的实现示例
2014/09/10 Javascript
javascript如何操作HTML下拉列表标签
2015/08/20 Javascript
跟我学习javascript的浮点数精度
2015/11/16 Javascript
JS中call/apply、arguments、undefined/null方法详解
2016/02/15 Javascript
JS for...in 遍历语句用法实例分析
2016/08/24 Javascript
js实现模糊匹配功能
2017/02/15 Javascript
js实现下一页页码效果
2017/03/07 Javascript
Vue实现自带的过滤器实例
2017/03/09 Javascript
react在安卓中输入框被手机键盘遮挡问题的解决方法
2018/09/03 Javascript
Jquery和CSS实现选择框重置按钮功能
2018/11/08 jQuery
vue2.0中set添加属性后视图不能更新的解决办法
2019/02/22 Javascript
JavaScript剩余操作符Rest Operator详解
2019/07/20 Javascript
微信小程序webview与h5通过postMessage实现实时通讯的实现
2019/08/20 Javascript
深入了解JavaScript词法作用域
2020/07/29 Javascript
Python实现扣除个人税后的工资计算器示例
2018/03/26 Python
python实现全盘扫描搜索功能的方法
2019/02/14 Python
django连接oracle时setting 配置方法
2019/08/29 Python
Python基于mediainfo批量重命名图片文件
2020/12/29 Python
欧缇丽加拿大官方网站:Caudalie加拿大
2019/07/18 全球购物
台湾时尚彩瞳专门店:imeime
2019/08/16 全球购物
既然说Ruby中一切都是对象,那么Ruby中类也是对象吗
2013/01/26 面试题
英语专业大学生求职简历的自我评价
2013/10/18 职场文书
销售辞职报告范文
2014/01/12 职场文书
2015新学期家长寄语
2015/02/26 职场文书
业务员辞职信范文
2015/03/02 职场文书
2015年酒店销售部工作总结
2015/07/24 职场文书