Vue renderless组件(函数式组件)

开门见山,我在codepen上写了个简单demo:上下两个按钮,功能一致(开关);不同之处是:前者只改变文字,后者顺带改变了背景颜色。OK,怎么实现呢?

Vue renderless组件(函数式组件)_第1张图片
Two Toggles

实现相同功能的模块,理想方式自然是提供通用的抽象组件。这个例子中,想要配合背景更换的效果,最直观的设计应该是实现一个子组件,再根据父组件传递的props值——比如一个叫backgroud的function——联动更改背景色。
不过,在某些场景中,我们想要的是模块提供固定的功能逻辑,但并不希望它限制页面的渲染(比如,我希望给开关加上更酷炫的动态效果,而不仅仅只有更换背景色这种单调的操作)。组件设计者显然不可能尽善尽美地提供所有候选props,这时候留出更多的自定义空间反倒是一个比较切合实际的解决途径。

Render函数

进入正题前,先简介一下Vue是如何渲染组件的。众所周知,在工程中,我们会在.vue文件中定义