用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下实现overlay遮罩层代码
Aug 25 Javascript
jquery validate在ie8下的bug解决方法
Nov 13 Javascript
Extjs4实现两个GridPanel之间数据拖拽功能具体方法
Nov 21 Javascript
JavaScript设计模式之观察者模式(发布者-订阅者模式)
Sep 24 Javascript
JS简单实现动画弹出层效果
May 05 Javascript
jQuery实现的动态伸缩导航菜单实例
May 07 Javascript
浅析JavaScriptSerializer类的序列化与反序列化
Nov 22 Javascript
微信小程序链接传参并跳转新页面
Nov 29 Javascript
AngularJS实现的获取焦点及失去焦点时的表单验证功能示例
Oct 25 Javascript
解决layer弹出层中表单不起作用的问题
Sep 09 Javascript
vue 设置 input 为不可以编辑的实现方法
Sep 19 Javascript
vue实现修改图片后实时更新
Nov 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修改session_id示例代码
2014/01/08 PHP
深入讲解PHP Session及如何保持其不过期的方法
2015/08/18 PHP
PHP使用file_get_contents发送http请求功能简单示例
2018/04/29 PHP
js操作ajax返回的json的注意问题!
2010/02/23 Javascript
为Extjs加加速(javascript加速)
2010/08/19 Javascript
jQuery 网易相册鼠标移动显示隐藏效果实现代码
2013/03/31 Javascript
jQuery简单创建节点的方法
2016/09/09 Javascript
微信小程序 Flex布局详解
2016/10/09 Javascript
JavaScript中for循环的几种写法与效率总结
2017/02/03 Javascript
JavaScript中的遍历详解(多种遍历)
2017/04/07 Javascript
Vue 换肤的示例实践
2018/01/23 Javascript
微信小程序简单的canvas裁剪图片功能详解
2019/07/12 Javascript
基于JavaScript实现控制下拉列表
2020/05/08 Javascript
[07:47]DOTA2国际邀请赛采访专栏:探访Valve总部
2013/08/08 DOTA
Python中运行并行任务技巧
2015/02/26 Python
Scrapy爬虫实例讲解_校花网
2017/10/23 Python
浅谈Python中的私有变量
2018/02/28 Python
windows下python安装小白入门教程
2018/09/18 Python
对dataframe数据之间求补集的实例详解
2019/01/30 Python
利用Python+阿里云实现DDNS动态域名解析的方法
2019/04/01 Python
Django 在iframe里跳转顶层url的例子
2019/08/21 Python
python爬虫爬取幽默笑话网站
2019/10/24 Python
Python实现word2Vec model过程解析
2019/12/16 Python
TensorFlow 多元函数的极值实例
2020/02/10 Python
Python django框架开发发布会签到系统(web开发)
2020/02/12 Python
Python制作简易版小工具之计算天数的实现思路
2020/02/13 Python
HTML5实现经典坦克大战坦克乱走还能发出一个子弹
2013/09/02 HTML / CSS
Jones New York官网:美国女装品牌,受白领女性欢迎
2019/11/26 全球购物
投资合作协议书
2014/04/17 职场文书
英语专业求职信
2014/07/08 职场文书
2015年市场部工作总结
2015/04/30 职场文书
2015年推普周活动方案
2015/05/06 职场文书
2015年安全生产月工作总结
2015/07/27 职场文书
Python编程中Python与GIL互斥锁关系作用分析
2021/09/15 Python
浅谈Redis的事件驱动模型
2022/05/30 Redis
win10如何开启ahci模式?win10开启ahci模式详细操作教程
2022/07/23 数码科技