浅谈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 相关文章推荐
线路分流自动跳转代码;希望对大家有用!
Dec 02 Javascript
jquery连缀语法如何实现
Nov 29 Javascript
使用Node.js实现一个简单的FastCGI服务器实例
Jun 09 Javascript
jQuery编程中的一些核心方法简介
Aug 14 Javascript
基于replaceChild制作简单的吞噬特效
Sep 21 Javascript
jQuery下拉菜单的实现代码
Nov 03 Javascript
支持移动端原生js轮播图
Feb 16 Javascript
easyui下拉框动态级联加载的示例代码
Nov 29 Javascript
vue cli升级webapck4总结
Apr 04 Javascript
移动端 Vue+Vant 的Uploader 实现上传、压缩、旋转图片功能
Jun 10 Javascript
JavaScript实现的联动菜单特效示例
Jul 08 Javascript
js 解析 JSON 数据简单示例
Apr 21 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
关于Appserv无法打开localhost问题的解决方法
2009/10/16 PHP
PHP技术开发技巧分享
2010/03/23 PHP
php生成静态文件的多种方法分享
2012/07/17 PHP
用PHP代码给图片加水印
2015/07/01 PHP
PHP编写RESTful接口
2016/02/23 PHP
Zend Framework教程之响应对象的封装Zend_Controller_Response实例详解
2016/03/07 PHP
Zend Framework入门应用实例详解
2016/12/11 PHP
PHP多个图片压缩成ZIP的方法
2020/08/18 PHP
实现连缀调用的map方法(prototype)
2009/08/05 Javascript
javascript使用isNaN()函数判断变量是否为数字
2013/09/21 Javascript
JQuery each()嵌套使用小结
2014/04/18 Javascript
js创建对象的区别示例介绍
2014/07/24 Javascript
浅析javascript中函数声明和函数表达式的区别
2015/02/15 Javascript
JavaScript缓冲运动实现方法(2则示例)
2016/01/08 Javascript
javascript基础知识讲解
2017/01/11 Javascript
详谈jQuery unbind 删除绑定事件 / 移除标签方法
2017/03/02 Javascript
分享一款超好用的JavaScript 打包压缩工具
2020/04/26 Javascript
小程序实现图片移动缩放效果
2020/05/26 Javascript
vue接通后端api以及部署到服务器操作
2020/08/13 Javascript
如何利用JS将手机号中间四位变成*号
2020/09/29 Javascript
python实现用于测试网站访问速率的方法
2015/05/26 Python
python实现中文转换url编码的方法
2016/06/14 Python
python递归删除指定目录及其所有内容的方法
2017/01/13 Python
python 用opencv调用训练好的模型进行识别的方法
2018/12/07 Python
Django模板导入母版继承和自定义返回Html片段过程解析
2019/09/18 Python
python对输出的奇数偶数排序实例代码
2020/12/04 Python
Django与AJAX实现网页动态数据显示的示例代码
2021/02/24 Python
Steiff台湾官网:德国金耳釦泰迪熊
2019/12/26 全球购物
高级3D打印市场:Gambody
2019/12/26 全球购物
电子商务网站的创业计划书
2014/01/05 职场文书
技校毕业生个人学习的自我评价
2014/02/21 职场文书
购房意向书范本
2014/04/01 职场文书
2015年银行信贷员工作总结
2015/05/19 职场文书
python学习之panda数据分析核心支持库
2021/05/07 Python
Pygame Event事件模块的详细示例
2021/11/17 Python
详解在SQLPlus中实现上下键翻查历史命令的功能
2022/03/18 SQL Server