浅谈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 Function类型
Dec 04 Javascript
js下拉框二级关联菜单效果代码具体实现
Aug 03 Javascript
JQuery性能优化的几点建议
May 14 Javascript
jQuery中:text选择器用法实例
Jan 03 Javascript
jQuery选择器用法实例详解
Dec 17 Javascript
javascript 四十条常用技巧大全
Sep 09 Javascript
vue-resource调用promise取数据方式详解
Jul 21 Javascript
vue使用vue-i18n实现国际化的实现代码
Apr 08 Javascript
使用Javascript简单计算器
Nov 17 Javascript
Vue CLI3.0中使用jQuery和Bootstrap的方法
Feb 28 jQuery
javascript中如何判断类型汇总
May 14 Javascript
vue-cli配置flexible过程详解
Jul 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
【星际争霸1】人族1v7家ZBath
2020/03/04 星际争霸
PHP的面向对象编程
2006/10/09 PHP
使用php发送有附件的电子邮件-(PHPMailer使用的实例分析)
2013/04/26 PHP
解析php类的注册与自动加载
2013/07/05 PHP
CI框架入门之MVC简单示例
2016/11/21 PHP
thinkPHP5.0框架API优化后的友好性分析
2017/03/17 PHP
PHP数据分析引擎计算余弦相似度算法示例
2017/08/08 PHP
PHP基于自定义函数实现的汉字转拼音功能实例
2017/09/30 PHP
laravel框架模型、视图与控制器简单操作示例
2019/10/10 PHP
jQuery的一些注意
2006/12/06 Javascript
javascript据option的value值快速设定初始的selected选项
2007/08/13 Javascript
DOM基础教程之使用DOM控制表单
2015/01/20 Javascript
jQuery prototype冲突的2种解决方法(附demo示例下载)
2016/01/21 Javascript
Angularjs手动解析表达式($parse)
2016/10/12 Javascript
Vue.js使用v-show和v-if的注意事项
2016/12/13 Javascript
Vue.js学习笔记之修饰符详解
2017/07/25 Javascript
关于Promise 异步编程的实例讲解
2017/09/01 Javascript
Python实现扫描局域网活动ip(扫描在线电脑)
2015/04/28 Python
Python求两个文本文件以行为单位的交集、并集与差集的方法
2015/06/17 Python
将Python的Django框架与认证系统整合的方法
2015/07/24 Python
单链表反转python实现代码示例
2018/02/08 Python
解决Python2.7读写文件中的中文乱码问题
2018/04/12 Python
flask中的wtforms使用方法
2018/07/21 Python
对sklearn的使用之数据集的拆分与训练详解(python3.6)
2018/12/14 Python
Django操作session 的方法
2020/03/09 Python
Python文本文件的合并操作方法代码实例
2020/03/31 Python
Python如何对XML 解析
2020/06/28 Python
使用数据结构给女朋友写个Html5走迷宫游戏
2019/11/26 HTML / CSS
质检员的岗位职责
2013/11/15 职场文书
五年级语文教学反思
2014/01/30 职场文书
2015年妇幼保健工作总结
2015/05/19 职场文书
幼儿园中班班级总结
2015/08/10 职场文书
当你焦虑迷茫时,请读读这6句话
2019/07/24 职场文书
在redisCluster中模糊获取key方式
2021/07/09 Redis
Python可视化学习之seaborn调色盘
2022/02/24 Python
MongoDB修改oplog大小的四种方法
2022/04/11 MongoDB