Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Vue的抽象组件 #101

Open
andyChenAn opened this issue Dec 17, 2020 · 0 comments
Open

Vue的抽象组件 #101

andyChenAn opened this issue Dec 17, 2020 · 0 comments

Comments

@andyChenAn
Copy link
Owner

Vue的抽象组件

当我们在编写Vue组件的时候,如果我们给组件设置了一个abstract为true的属性,那么这个组件就是一个抽象组件,抽象组件并不会存在于虚拟DOM树中,因为在Vue组件初始化的时候,再查找当前组件的父节点的时候,会过滤掉父节点为抽象组件的节点。所以抽象组件并不会挂载在虚拟DOM树中,从而也不会被渲染成真实的DOM。像Vue内部的keep-alive,transition,transition-group都是抽象组件。

抽象组件可以很方便的让我们复用功能,我们只需要将复用的功能写到抽象组件里面即可。比如像我们常见的防抖功能,节流功能等。

举个例子:当点击按钮时,隔1秒钟后再执行其他操作,而且这个功能会在应用中很多地方使用,那么为了复用我们可以把它写成一个抽象组件,然后将按钮元素作为这个抽象组件的子元素即可。

function debounce (fn , interval) {
    let timer = null;
    return function () {
        let args = arguments;
        timer && clearTimeout(timer);
        timer = setTimeout(() => {
            fn.apply(null , args)
        } , interval)
    }
}
export default {
    name : 'debounce',
    abstract : true,
    props : {
        events : String,
        time : Number
    },
    render () {
        const vnode = this.$slots.default[0];
        if (vnode && this.events) {
            let eventList = this.events.split('-');
            eventList.forEach(event => {
                let eventFn = vnode.data.on[event];
                if (typeof eventFn === 'function') {
                    vnode.data.on[event] = debounce(eventFn , this.time);
                }
            })
        }
        return vnode;
    }
}
<debounce :time=3000 events="click">
	<button @click="handleClick" id="btn">click</button>
</debounce>

这样我们就完成了一个简单的抽象组件。比如我们现在又有一个需求就是,在输入框中输入完1秒后,显示提示内容

<debounce :time=1000 events="input">
	<input type="text" @input="handleInput">
</debounce>

这样我们就编写了一个抽象组件,并复用了这个防抖功能。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant