浅谈Vue 函数式组件的使用技巧


Posted in Javascript onJune 16, 2020

什么是函数式组件

没有管理任何状态,也没有监听任何传递给它的状态,也没有生命周期方法,它只是一个接受一些 prop 的函数。简单来说是 一个无状态和无实例的组件

基本写法:

Vue.component('my-component', {
 functional: true,
 // Props 是可选的
 props: {
  // ...
 },
 // 为了弥补缺少的实例
 // 提供第二个参数作为上下文
 render: function(createElement, context) {
  // ...
 }
})

.vue 单文件组件写法

<template functional>
 ...
</template>

因为函数式组件没有 this,参数就是靠 context 来传递的了,有如下字段的对象:

  • props:提供所有 prop 的对象
  • children:VNode 子节点的数组
  • slots:一个函数,返回了包含所有插槽的对象
  • scopedSlots:(2.6.0+) 一个暴露传入的作用域插槽的对象。也以函数形式暴露普通插槽。
  • data:传递给组件的整个数据对象,作为 createElement 的第二个参数传入组件
  • parent:对父组件的引用
  • listeners:(2.3.0+) 一个包含了所有父组件为当前组件注册的事件监听器的对象。这是 data.on 的一个别名。
  • injections:(2.3.0+) 如果使用了 inject 选项,则该对象包含了应当被注入的 property。

使用技巧

以下总结、都是基于使用 <template> 标签开发函数式组件中遇到的问题

attr 与 listener 使用

平时我们在开发组件时,传递 prop 属性以及事件等操作,都会使用v-bind="$attrs"和 v-on="$listeners"。而在函数式组件的写法有所不同,attrs属性集成在 data中。

<template functional>
 <div v-bind="data.attrs" v-on="listeners">
  <h1>{{ props.title }}</h1>
 </div>
</template>

class 与 style 绑定

在引入函数式组件、直接绑定外层的class类名和style样式是无效的。data.class 表示动态绑定class, data.staticClass 则表示绑定静态class, data.staticClass 则是绑定内联样式
TitleView.vue

<template functional>
 <div :class="[data.class, data.staticClass]" :style="data.staticStyle">
  <h1>{{ props.title }}</h1>
 </div>
</template>

Test.vue

<template>
 <title-view
  :class="{title-active: isActive}"
  style="{ color: red }"
  title="Hello Do"
 />
</template>

component 组件引入

函数式组件引入其他组件方式如下,具体参考:github.com/vuejs/vue/i…

<template functional>
 <div class="tv-button-cell">
  <component :is="injections.components.TvButton" type="info" />
  {{ props.title }}
  </component>
 </div>
</template>

<script>
import TvButton from '../TvButton'

export default {
 inject: {
  components: {
   default: {
    TvButton
   }
  }
 }
}
</script>

$options 计算属性

有时候需要修改prop数据源, 使用 Vue 提供的 $options 属性,可以访问这个特殊的方法。

<template functional>
 <div v-bind="data.attrs" v-on="listeners">
  <h1>{{ $options.upadteName(props.title) }}</h1>
 </div>
</template>

<script>
 export default {
  updateName(val) {
   return 'hello' + val
  }
 }
</script>

总结

虽然速度和性能方面是函数式组件的优势、但不等于就可以滥用,所以还需要根据实际情况选择和权衡。比如在一些展示组件。例如, buttons, tags, cards,或者页面是静态文本,就很适合使用函数式组件。

到此这篇关于浅谈Vue 函数式组件的使用技巧的文章就介绍到这了,更多相关Vue 函数式组件内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木! 

Javascript 相关文章推荐
jQuery AJAX实现调用页面后台方法和web服务定义的方法分享
Mar 01 Javascript
JavaScript中的small()方法使用详解
Jun 08 Javascript
jQuery实现模拟marquee标签效果
Jul 14 Javascript
Bootstrap精简教程中秋大放送
Sep 15 Javascript
微信小程序组件 marquee实例详解
Jun 23 Javascript
JavaScript动态绑定详解
Sep 14 Javascript
angularjs实现柱状图动态加载的示例
Dec 11 Javascript
Node.js 在本地生成日志文件的方法
Feb 07 Javascript
深入理解webpack process.env.NODE_ENV配置
Feb 23 Javascript
Vue Render函数原理及代码实例解析
Jul 30 Javascript
vue项目中播放rtmp视频文件流的方法
Sep 17 Javascript
uni-app 微信小程序授权登录的实现步骤
Feb 18 Javascript
原生JS实现天气预报
Jun 16 #Javascript
vue实现公告栏文字上下滚动效果的示例代码
Jun 16 #Javascript
原生JS实现无缝轮播图片
Jun 24 #Javascript
如何利用Node.js与JSON搭建简单的动态服务器
Jun 16 #Javascript
js+css实现全屏侧边栏
Jun 16 #Javascript
JavaScript装箱及拆箱boxing及unBoxing用法解析
Jun 15 #Javascript
通过实例解析JavaScript for in及for of区别
Jun 15 #Javascript
You might like
解决MySQL中文输出变成问号的问题
2008/06/05 PHP
php下关于Cannot use a scalar value as an array的解决办法
2010/08/08 PHP
php的大小写敏感问题整理
2011/12/29 PHP
ThinkPHP关联模型操作实例分析
2012/09/23 PHP
YII框架关联查询操作示例
2019/04/29 PHP
解决FireFox下[使用event很麻烦]的问题
2006/11/26 Javascript
jQuery中[attribute*=value]选择器用法实例
2014/12/31 Javascript
使用Node.js为其他程序编写扩展的基本方法
2015/06/23 Javascript
基于jQuery日历插件制作日历
2016/03/11 Javascript
JS阻止事件冒泡行为和闭包的方法
2016/06/16 Javascript
Vue数据驱动模拟实现2
2017/01/11 Javascript
JavaScript中利用for循环遍历数组
2017/01/15 Javascript
微信小程序实现的贪吃蛇游戏【附源码下载】
2018/01/03 Javascript
关于vue中的ajax请求和axios包问题
2018/04/19 Javascript
基于JavaScript实现贪吃蛇游戏
2020/03/16 Javascript
nodejs中使用worker_threads来创建新的线程的方法
2021/01/22 NodeJs
[02:01]BBC DOTA2国际邀请赛每日综述:八强胜者组鏖战,中国队喜忧参半
2014/07/19 DOTA
[01:32]2016国际邀请赛中国区预选赛IG战队首日赛后采访
2016/06/27 DOTA
[49:21]完美世界DOTA2联赛循环赛 Ink Ice vs LBZS BO2第二场 11.05
2020/11/06 DOTA
Python实现多线程抓取妹子图
2015/08/08 Python
Python工程师面试题 与Python Web相关
2016/01/14 Python
深入理解Python3 内置函数大全
2017/11/23 Python
python 3.5实现检测路由器流量并写入txt的方法实例
2017/12/17 Python
Python3中的json模块使用详解
2018/05/05 Python
Python实现的爬取百度贴吧图片功能完整示例
2019/05/10 Python
python写日志文件操作类与应用示例
2019/07/01 Python
原来我一直安装 Python 库的姿势都不对呀
2019/11/11 Python
selenium+python实现自动登陆QQ邮箱并发送邮件功能
2019/12/13 Python
详解pytorch中squeeze()和unsqueeze()函数介绍
2020/09/03 Python
Python 必须了解的5种高级特征
2020/09/10 Python
pycharm 快速解决python代码冲突的问题
2021/01/15 Python
关于HTML5你必须知道的28个新特性,新技巧以及新技术
2012/05/28 HTML / CSS
ToysRus日本官网:玩具反斗城
2018/09/08 全球购物
职业技术学校毕业生推荐信
2013/12/03 职场文书
县长群众路线对照检查材料思想汇报
2014/10/02 职场文书
react使用antd的上传组件实现文件表单一起提交功能(完整代码)
2021/06/29 Javascript