巧用 Vue 中的函数式组件
Posted 子曰思鱼
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了巧用 Vue 中的函数式组件相关的知识,希望对你有一定的参考价值。
如果一个组件是无状态的,也就是说其无响应式数据和上下文,我们就可以将这个组件标记为 functional ,即函数式的。
由上面的描述我们可以知道,函数式组件本质是一个函数,所以其在渲染方面的开销会比普通的组件要小。
如果我们当前仅仅是提供一个包装其他组件的功能,函数式组件就能发挥其作用。
额,这是什么意思呢?
别急,我们先来看一个最简单的示例
import Vue from 'vue';
export default Vue.extend({
name : 'plain-functional',
functional: true,
render (h, context) {
return h('h1', {}, '这是一个 Functional 组件')
}
})
与非函数式组件相比,我们的代码中多了两点:
(1)添加了一个 functional: true 的属性
(2)render 函数的参数多了一个 context
由于函数式组件是无状态的,所以 context 对象中就包含了一些需要的数据,我们在 console 中打印出来,其结构如下:
其中就包含了我们创建组件时候必要的一些参数。具体参数的作用见:
https://cn.vuejs.org/v2/guide/render-function.html#%E5%87%BD%E6%95%B0%E5%BC%8F%E7%BB%84%E4%BB%B6
上面我们已经对函数式组件有了一个了解,我们就来实现 —— 一个提供包装其他组件 的组件
当前组件有一个 prop 为 type,其定义如下:
type 为 'user',则渲染 UserInfo页面;
type 为 'goods', 则渲染 'GoodsInfo'页面;
import Vue from 'vue';
import UserInfo from './UserInfo';
import GoodsInfo from './GoodsInfo';
export default Vue.extend({
name : 'plain-functional',
props: {
type: {
type: String,
default: 'user',
},
},
functional: true,
render (h, context) {
const comp = context.props.type === 'user'
? UserInfo : GoodsInfo;
return h(comp,context.data, context.children)
}
})
由于当前组件只是想提供包装功能,没有其他的类似响应式数据和上下文的需求,所以使用函数式组件就显得尤为恰当了。
快在你的代码中使用这个小技巧吧~
以上是关于巧用 Vue 中的函数式组件的主要内容,如果未能解决你的问题,请参考以下文章
`.vue` 组件分离/就绪函数中的显式调用 vuex 操作
立等可取的 Vue + Typescript 函数式组件实战
Vue3官网-高级指南(十七)响应式计算`computed`和侦听`watchEffect`(onTrackonTriggeronInvalidate副作用的刷新时机`watch` pre)(代码片段