函数式组件在React
社区很流行使用,那么在vue里面咱们要怎么用呢html
下面会涉及到的知识点: 高阶函数、状态、实例、vue组件vue
咱们能够把函数式组件想像成组件里的一个函数,入参是渲染上下文(render context),返回值是渲染好的HTMLless
对于函数式组件,能够这样定义:ide
因为函数式组件拥有的这两个特性,咱们就能够把它用做高阶组件(High order components),所谓高阶,就是能够生成其它组件的组件。就像日本的高精度的母机。函数
下面示例的完整Demo学习
functional: true
加上render function
,就是一个最简单的函数式组件啦,show your the code, 下面就建立一个名为FunctionButton.js
的函数式组件ui
export default { name: 'functional-button', functional: true, render(createElement, context) { return createElement('button', 'click me') } }
就像上文所讲的,函数式组件没有this,参数就是靠context
来传递的了,下面咱们看下context
有哪些属性呢this
props
children
slots
(a slots object)parent
listeners
injections
data
其中上面的data
包含了其余属性的引用,nibility。 在下面的范例中会有具体使用spa
如今建立一个App.vue
来引入上面的函数式组件设计
<template>
<FunctionalButton>
click me
</FunctionButton>
</template>
上面的click me
就是FunctionButton.js
的childern
属性了,咱们能够把组件改造下,由App.vue
来定义组件的button按钮
export default { name: 'funtional-button', functional: true, render(createElement, { children }) { return createElement('button', children) } }
看,上面用了ES6参数的解构,用{children}
来代替context
函数式组件没有实例,事件只能由父组件传递。下面咱们在App.vue
上定义一个最简单的click
事件
<template>
<FunctionalButton @click="log">
Click me
</FunctionalButton>
</template>
对应的FunctionalButton.js
export default { functional: true, render(createElement, { props, listeners, children }) { return createElement( 'button', { attrs: props, on: { click: listeners.click } }, children ); } };
对了,createElement
里事件属性就是on
了。具体能够看vue
的官方文档
尤大设计的Api仍是很人性的,上面涉及到的props
、listeners
那么多要传递的,是否是很麻烦,因此尤大统一把这个属性集成在data
里了,咱们能够再改写下
export default { functional: true, render(createElement, { data, children }) { return createElement( 'button', data, children ); } };
恩,是否是感受世界清爽了很多
这就是一个完整的高阶组件了,下面小小的展现一下高阶的魅力。
createElement('button', data, ['hello', ...children])
恩,很简单的就DIY了一个自带hello
的button按钮
上面就是关于函数式组件的基础定义和基本使用了,但愿对大家的学习有帮助。
demo效果图: