用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操作ACCESS数据库(读增改删)的代码
May 14 Javascript
javascript网页关闭时提醒效果脚本
Oct 22 Javascript
js 获取中文拼音,Select自动匹配字母获取值的代码
Sep 23 Javascript
JQuery.uploadify 上传文件插件的使用详解 for ASP.NET
Jan 22 Javascript
推荐40款强大的 jQuery 导航插件和教程(上篇)
Sep 14 Javascript
js中的setInterval和setTimeout使用实例
May 09 Javascript
js获取Html元素的实际宽度高度的方法
May 19 Javascript
scroll事件实现监控滚动条并分页显示(zepto.js)
Dec 18 Javascript
微信小程序小组件 基于Canvas实现直播点赞气泡效果
May 29 Javascript
Vue-resource实现ajax请求和跨域请求示例
Feb 23 Javascript
元素全屏的设置与监听实例
Nov 28 Javascript
p5.js临摹动态图形的方法
Oct 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
乐信RP2100的电路分析和打磨
2021/03/02 无线电
使用php4加速网络传输
2006/10/09 PHP
php INI配置文件的解析实现分析
2011/01/04 PHP
PHP数据集构建JSON格式及新数组的方法
2012/11/07 PHP
javascript cookie解码函数(兼容ff)
2008/03/17 Javascript
JavaScript获取GridView中用户点击控件的行号,列号
2009/04/14 Javascript
一个JS小玩意 几个属性相加不能超过一个特定值.
2009/09/29 Javascript
利用div+jquery自定义滚动条样式的2种方法
2013/07/18 Javascript
基于jQuery的图片不完全按比例自动缩小
2014/07/11 Javascript
jquery分隔Url的param方法(推荐)
2016/05/25 Javascript
jQuery EasyUI学习教程之datagrid点击列表头排序
2016/07/09 Javascript
js闭包用法实例详解
2016/12/13 Javascript
angular-ui-sortable实现可拖拽排序列表
2016/12/28 Javascript
利用Vue v-model实现一个自定义的表单组件
2017/04/27 Javascript
Vue.js 踩坑记之双向绑定
2018/05/03 Javascript
用vue-cli开发vue时的代理设置方法
2018/09/20 Javascript
jquery层次选择器的介绍
2019/01/18 jQuery
Vue使用虚拟dom进行渲染view的方法
2019/12/26 Javascript
微信小程序实现比较功能的方法汇总(五种方法)
2020/03/07 Javascript
jdk1.8+vue elementui实现多级菜单功能
2020/09/24 Javascript
python与sqlite3实现解密chrome cookie实例代码
2018/01/20 Python
Python检查和同步本地时间(北京时间)的实现方法
2018/12/03 Python
Python从单元素字典中获取key和value的实例
2018/12/31 Python
Django-Model数据库操作(增删改查、连表结构)详解
2019/07/17 Python
Python多线程获取返回值代码实例
2020/02/17 Python
python Matplotlib数据可视化(1):简单入门
2020/09/30 Python
Yves Rocher捷克官方网站:植物化妆品的创造者
2019/07/31 全球购物
DC Shoes荷兰官方网站:美国极限运动品牌
2019/10/22 全球购物
澳洲Chemist Direct药房中文网:澳洲大型线上直邮药房
2019/11/04 全球购物
总经理秘书工作职责
2013/12/26 职场文书
中级会计职业生涯规划书
2014/03/01 职场文书
法律进企业活动方案
2014/03/04 职场文书
化工专业自荐书
2014/06/16 职场文书
Python天气语音播报小助手
2021/09/25 Python
如何利用 CSS Overview 面板重构优化你的网站
2021/10/24 HTML / CSS
vue实现input输入模糊查询的三种方式
2022/08/14 Vue.js