浅谈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 相关文章推荐
图片上传即时显示缩略图的js代码
May 27 Javascript
深入分析js中的constructor和prototype
Apr 07 Javascript
JavaScript中遍历对象的property的3种方法介绍
Dec 30 Javascript
javascript实现无限级select联动菜单
Jan 02 Javascript
jQuery实现仿腾讯微博滑出效果报告每日天气的方法
May 11 Javascript
webpack+vue.js快速入门教程
Oct 12 Javascript
利用jQuery插件imgAreaSelect实现图片上传裁剪(放大缩小)
Dec 02 Javascript
解析JavaScript实现DDoS攻击原理与保护措施
Dec 26 Javascript
angularjs实现下拉列表的选中事件示例
Mar 03 Javascript
JavaScript实现的简单Tab点击切换功能示例
Jul 06 Javascript
基于Vue 服务端Cookies删除的问题
Sep 21 Javascript
微信小程序解析富文本过程详解
Jul 13 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
php mysql_real_escape_string函数用法与实例教程
2013/09/30 PHP
PHP中使用Imagick操作PSD文件实例
2015/01/26 PHP
php cookie 详解使用实例
2016/11/03 PHP
php curl中gzip的压缩性能测试实例分析
2016/11/08 PHP
PHP大文件分割上传 PHP分片上传
2017/08/28 PHP
Thinkphp 框架扩展之标签库驱动原理与用法分析
2020/04/23 PHP
游戏人文件夹程序 ver 4.03
2006/07/14 Javascript
如何在Web页面上直接打开、编辑、创建Office文档
2007/03/12 Javascript
Z-Blog中用到的js代码
2007/03/15 Javascript
javascript奇异的arguments分析
2010/10/20 Javascript
javascript 延迟加载技术(lazyload)简单实现
2011/01/17 Javascript
基于JQuery的一句话搞定手风琴菜单
2012/09/14 Javascript
JavaScript程序员应该知道的45个实用技巧
2014/03/04 Javascript
js实现微信分享代码
2020/10/11 Javascript
jQuery+CSS3实现四种应用广泛的导航条制作实例详解
2016/09/17 Javascript
KnockoutJS 3.X API 第四章之表单textInput、hasFocus、checked绑定
2016/10/11 Javascript
canvas绘制表盘时钟
2017/01/23 Javascript
使用 Vue.js 仿百度搜索框的实例代码
2017/05/09 Javascript
JS实现留言板功能[楼层效果展示]
2017/12/27 Javascript
Python BeautifulSoup中文乱码问题的2种解决方法
2014/04/22 Python
使用Python读写文本文件及编写简单的文本编辑器
2016/03/11 Python
python2 与 pyhton3的输入语句写法小结
2018/09/10 Python
Python使用ctypes调用C/C++的方法
2019/01/29 Python
Python实现京东秒杀功能代码
2019/05/16 Python
一行Python代码过滤标点符号等特殊字符
2019/08/12 Python
简单了解python filter、map、reduce的区别
2020/01/14 Python
python3中布局背景颜色代码分析
2020/12/01 Python
一款纯css3实现的鼠标悬停动画按钮
2014/12/29 HTML / CSS
意大利折扣和优惠券网站:Groupalia
2019/10/09 全球购物
优秀乡村医生先进事迹材料
2014/08/23 职场文书
结婚当天新郎保证书
2015/05/08 职场文书
校运会广播稿
2015/08/19 职场文书
2016优秀员工先进事迹材料
2016/02/25 职场文书
mysql timestamp比较查询遇到的坑及解决
2021/11/27 MySQL
口袋妖怪冰系十大最强精灵,几何雪花排第七,第六类似北极熊
2022/03/18 日漫
Java 获取Word中所有的插入和删除修订的方法
2022/04/06 Java/Android