clearinterval函数不生效_利用函数式组件做二次封装

前言

随着技术的快速发展,前端为了快速开发,我们一般会接入像elementui这样的库,以element为例,一些组件无法满足我们的需求,就需要做二次封装。今天想着尝试利用vue的函数式组件做一下二次封装。

先来看一个最简单的demo来补充点基础知识

// demo.vue
"demo">"debounce" maxlength='5' @blur="inputBlur"/>


我们再来尝试封装一个elementui的el-button组件

// debounce.js 关键代码
if (vNode.componentOptions && vNode.componentOptions.tag === 'el-button') {
const funDefault = vNode.componentOptions.listeners && vNode.componentOptions.listeners.click
if (!funDefault) {
console.warn('请传入click方法(@click)')
return null
}
const fun = debounce(funDefault, time, Switch)

vNode.componentOptions.listeners.click = fun
}

我们elementui的组件和原生标签的区别是需要通过vNode.componentOptions获取,接下来贴出完整的代码

const debounce = (fn, delay=500, Switch=true) => {
let timeout = null;
return (params) => {
clearTimeout(timeout)

if (!Switch) {
return fn(params)
}

timeout = window.setTimeout(() => {
// el-button获取到的是数组,input获取到的是function
if (!Array.isArray(fn)) {
fn = [fn]
}

fn[0](params)
}, 1000)
}
}

export default {
functional: true,
render: function(createElement, context) {
const vNodeLists = context.slots().default
const time = context.props.time
const Switch = context.props.Switch

if (!vNodeLists) {
console.warn('必须要有一个子元素')
return null
}

const vNode = vNodeLists[0] || {}

if (vNode.componentOptions && vNode.componentOptions.tag === 'el-button') {
const funDefault = vNode.componentOptions.listeners && vNode.componentOptions.listeners.click
if (!funDefault) {
console.warn('请传入click方法(@click)')
return null
}
const fun = debounce(funDefault, time, Switch)

vNode.componentOptions.listeners.click = fun
} else if (vNode.tag && vNode.tag === 'input') {
const funDefault = vNode.data.on && vNode.data.on.input
if (!funDefault) {
console.warn('请传入input方法(@input)')
return null
}
const fun = debounce(funDefault, time, Switch)

vNode.data.on.input = fun
} else {
console.warn('仅支持input和el-button')
return null
}
return vNode
}
}

简单看一下效果吧

7ff1b1b0c8715ff5dee3a5a715913b68.gif

思考:以这种方式封装el-input是否会有问题?

465c606f263eb5f4b6d4fa71a9fa617d.png
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值