Vue函数式组件专篇深入分析

 更新时间:2023年01月05日 15:00:06   作者:loyd3  
Vue提供了一种称为函数式组件的组件类型,用来定义那些没有响应数据,也不需要有任何生命周期的场景,它只接受一些props来显示组件,下面这篇文章主要给大家介绍了关于Vue高级组件之函数式组件的使用场景与源码分析的相关资料,需要的朋友可以参考下

函数式组件的实现相对容易。一个函数式组件本质上就是一个普通函数,该函数的返回值是虚拟DOM。

在用户接口层面,一个函数式组件就是一个返回虚拟DOM的函数,如下面的代码所示:

function MyFuncComp(props){
	return {type:'h1',children: porps.title}
}

函数式组件没有自身状态,但仍然可以接收由外部传入的props。为了给函数式组件定义props,需要在组件函数上添加静态的props属性,如下面代码所示:

function MyFuncComp(props){
	return {type:'h1',children:props.title}
}
// 定义props
MyFuncComp.props = {
	title: String
}

在有状态组件的基础上,实现函数式组件将变得非常简单,因为挂载组件的逻辑可以复用mountComponent函数,为此,需要在patch函数内支持函数类型的vnode.type,如下面patch函数的代码所示:

function patch(n1,n2,container, anchor){
	if(n1 && n1.type !== n2.type){
		unmount(n1)
		n1 = null
	}
 	const {type} = n2
	if(typeof type === 'string'){
		// 省略部分代码
	}else if(type === Text) {
		// 省略部分代码
	}else if(type === Fragment) {
		// 省略部分代码
	}else if(type === 'object' || typeof type === 'function') {
		// component
		if(!n1){
			mountComponent(n2,container,anchor)
		}else{
			patchComponent(n1,n2,anchor)
		}
	}
}

在patch函数内部,通过检测vnode.type的类型来判断组件的类型

  • 如果vnode.type是一个对象,则它是一个有状态组件,并且vnode.type是组件选项对象;
  • 如果vnode.type是一个函数,则它是一个函数式组件

下面是修改后的mountComponent函数,其支持挂载函数式组件:

function mountComponent(vnode,container,anchor){
	// 检查是否是函数式组件
	const isFunctional = typeof vnode.type === 'function'
	let componentOptions = vnode.type
	if(isFunctional){
		// 如果是函数式组件,则将vnode.type作为渲染函数,将vnode.type.props作为props选项定义即可
		componentOptions = {
			render:vnode.type,
			props: vnode.type.props
		}
	}
	// 省略部分代码
}

实现对函数式组件的兼容非常简单。首先,在mountComponent函数内检查组件的类型,如果是函数式组件,则直接将组件函数作为组件选项对象的render选项,并将组件函数的静态props属性作为组件的props选项即可。

当然,出于更加严谨的考虑,我们需要通过isFunctional变量实现选择性地执行初始化逻辑,

到此这篇关于Vue函数式组件专篇深入分析的文章就介绍到这了,更多相关Vue函数式组件内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • vue-editor-bridge报错的解决方案

    vue-editor-bridge报错的解决方案

    这篇文章主要介绍了vue-editor-bridge报错的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-04-04
  • Vue在自定义指令绑定的处理函数中传递参数

    Vue在自定义指令绑定的处理函数中传递参数

    这篇文章主要介绍了Vue在自定义指令绑定的处理函数中传递参数方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-03-03
  • Vue首屏加载过慢出现长时间白屏的实现

    Vue首屏加载过慢出现长时间白屏的实现

    本文主要介绍了Vue首屏加载过慢出现长时间白屏的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-04-04
  • Vue router重定向redirect如何传值问题

    Vue router重定向redirect如何传值问题

    这篇文章主要介绍了Vue router重定向redirect如何传值问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-10-10
  • vue中transition组件在项目中运用小结

    vue中transition组件在项目中运用小结

    这篇文章主要介绍了vue中transition组件在项目中运用,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-12-12
  • 详解Vue中的Props与Data细微差别

    详解Vue中的Props与Data细微差别

    这篇文章主要介绍了详解Vue中的Props与Data细微差别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-03-03
  • 如何在Vue3中实现自定义指令(超详细!)

    如何在Vue3中实现自定义指令(超详细!)

    除了默认设置的核心指令(v-model和v-show),Vue也允许注册自定义指令,下面这篇文章主要给大家介绍了关于如何在Vue3中实现自定义指令的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2022-06-06
  • vue router嵌套路由在history模式下刷新无法渲染页面问题的解决方法

    vue router嵌套路由在history模式下刷新无法渲染页面问题的解决方法

    这篇文章主要介绍了vue router嵌套路由在history模式下刷新无法渲染页面问题的解决方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-01-01
  • 从0到1构建vueSSR项目之node以及vue-cli3的配置

    从0到1构建vueSSR项目之node以及vue-cli3的配置

    这篇文章主要介绍了从0到1构建vueSSR项目之node以及vue-cli3的配置,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-03-03
  • vue 2.0封装model组件的方法

    vue 2.0封装model组件的方法

    本篇文章主要介绍了vue 2.0封装model组件的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-08-08

最新评论