浅谈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 相关文章推荐
仿猪八戒网左下角的文字滚动效果
Oct 28 Javascript
异步动态加载js与css文件的js代码
Sep 15 Javascript
css结合js制作下拉菜单示例代码
Feb 27 Javascript
全面理解JavaScript中的闭包
May 12 Javascript
JS从数组中随机取出几个数组元素的方法
Aug 02 Javascript
angular双向绑定模拟探索
Dec 26 Javascript
微信小程序 Buffer缓冲区的详解
Jul 06 Javascript
fetch 如何实现请求数据
Dec 20 Javascript
js实现图片放大并跟随鼠标移动特效
Jan 18 Javascript
使用js在layui中实现上传图片压缩
Jun 18 Javascript
js实现选项卡效果
Mar 07 Javascript
vue3.0 项目搭建和使用流程
Mar 04 Vue.js
原生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的cURL库简介及使用示例
2015/02/06 PHP
FireFox下XML对象转化成字符串的解决方法
2011/12/09 Javascript
Textarea根据内容自适应高度
2013/10/28 Javascript
node-http-proxy修改响应结果实例代码
2016/06/06 Javascript
使用开源工具制作网页验证码的方法
2016/10/17 Javascript
js中通过getElementsByName访问name集合对象的方法
2016/10/31 Javascript
js实现简单的二级联动效果
2017/03/09 Javascript
JavaScript基于扩展String实现替换字符串中index处字符的方法
2017/06/13 Javascript
nodejs 子进程正确的打开方式
2017/07/03 NodeJs
webpack分离css单独打包的方法
2018/06/12 Javascript
从Vuex中取出数组赋值给新的数组,新数组push时报错的解决方法
2018/09/18 Javascript
利用JS动态生成隔行换色HTML表格的两种方法
2018/10/09 Javascript
webpack 最佳配置指北(推荐)
2020/01/07 Javascript
Python实现的视频播放器功能完整示例
2018/02/01 Python
使用anaconda的pip安装第三方python包的操作步骤
2018/06/11 Python
python调用百度语音识别api
2018/08/30 Python
Python3爬虫全国地址信息
2019/01/05 Python
详解Django中CBV(Class Base Views)模型源码分析
2019/02/25 Python
Django rstful登陆认证并检查session是否过期代码实例
2019/08/13 Python
django自定义非主键自增字段类型详解(auto increment field)
2020/03/30 Python
Python如何使用27行代码绘制星星图
2020/07/20 Python
如何完美的建立一个python项目
2020/10/09 Python
python中@property的作用和getter setter的解释
2020/12/22 Python
HTML5 history新特性pushState、replaceState及两者的区别
2015/12/26 HTML / CSS
HTC VIVE美国官网:VR虚拟现实眼镜
2018/02/13 全球购物
eDreams加拿大:廉价航班、酒店和度假
2019/03/29 全球购物
美国最佳选择产品网站:Best Choice Products
2019/05/27 全球购物
美国折扣地毯销售网站:Rugs.com
2020/03/27 全球购物
大学毕业自我评价
2014/02/02 职场文书
市场营销专业毕业生求职信
2014/03/26 职场文书
小学优秀教师先进事迹材料
2014/12/16 职场文书
会计工作总结范文2014
2014/12/23 职场文书
初中运动会前导词
2015/07/20 职场文书
2015年新农村建设指导员工作总结
2015/07/24 职场文书
企业财务管理制度范本
2015/08/04 职场文书
mysql 带多个条件的查询方式
2021/06/05 MySQL