浅谈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 相关文章推荐
JavaScript加密解密7种方法总结分析
Oct 07 Javascript
关于jquery性能最佳实践的讨论,与求教
Mar 30 Javascript
你必须知道的JavaScript 中字符串连接的性能的一些问题
May 07 Javascript
JavaScript中的this关键字介绍与使用实例
Jun 21 Javascript
浏览器窗口加载和大小改变事件示例
Feb 27 Javascript
通过JS判断联网类型和连接状态的实现代码
Apr 01 Javascript
JavaScript File API实现文件上传预览
Feb 02 Javascript
利用js获取下拉框中所选的值
Dec 01 Javascript
基于JQuery实现的跑马灯效果(文字无缝向上翻动)
Dec 02 Javascript
Bootstrap模态框插入视频的实现代码
Jun 25 Javascript
javascript触发模拟鼠标点击事件
Jun 26 Javascript
layerui代码控制tab选项卡,添加,关闭的实例
Sep 04 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
xml+php动态载入与分页
2006/10/09 PHP
php伪静态之APACHE篇
2014/06/02 PHP
浅析php设计模式之数据对象映射模式
2016/03/03 PHP
PHP从数组中删除元素的四种方法实例
2017/05/12 PHP
PHP中的日期时间处理利器实例(Carbon)
2017/06/09 PHP
PHP使用zlib扩展实现GZIP压缩输出的方法详解
2018/04/09 PHP
浅谈laravel中的关联查询with的问题
2019/10/10 PHP
js拦截alert对话框另类应用
2013/01/16 Javascript
JQuery slideshow的一个小问题(如何发现及解决过程)
2013/02/06 Javascript
网站如何做到完全不需要jQuery也可以满足简单需求
2013/06/27 Javascript
js 单击式的下拉菜单效果实例
2013/08/13 Javascript
jqgrid 表格数据导出实例
2013/11/21 Javascript
javascript实现 百度翻译 可折叠的分享按钮列表
2015/03/12 Javascript
Bootstrap源码解读导航(6)
2016/12/23 Javascript
原生js编写2048小游戏
2017/03/17 Javascript
JavaScript选取(picking)和反选(rejecting)对象的属性方法
2017/08/16 Javascript
微信公众号H5之微信分享常见错误和问题(小结)
2019/11/14 Javascript
Vue.js中的高级面试题及答案
2020/01/13 Javascript
JQuery基于FormData异步提交数据文件
2020/09/01 jQuery
Python输出由1,2,3,4组成的互不相同且无重复的三位数
2018/02/01 Python
Django框架模板注入操作示例【变量传递到模板】
2018/12/19 Python
Python多进程方式抓取基金网站内容的方法分析
2019/06/03 Python
Django CBV类的用法详解
2019/07/26 Python
Python实现Singleton模式的方式详解
2019/08/08 Python
python实现视频读取和转化图片
2019/12/10 Python
python爬取天气数据的实例详解
2020/11/20 Python
python 解决函数返回return的问题
2020/12/05 Python
用python监控服务器的cpu,磁盘空间,内存,超过邮件报警
2021/01/29 Python
CSS3的颜色渐变效果的示例代码
2017/09/29 HTML / CSS
开朗女孩的自我评价
2014/02/10 职场文书
小城镇建设汇报材料
2014/08/16 职场文书
2016年寒假社会实践活动总结
2015/10/10 职场文书
2016大学生优秀志愿者事迹材料
2016/02/25 职场文书
用Python制作灯光秀短视频的思路详解
2021/04/13 Python
小程序实现文字循环滚动动画
2021/06/14 Javascript
简单总结SpringMVC拦截器的使用方法
2021/06/28 Java/Android