Vue函数式组件的应用实例详解


Posted in Javascript onAugust 30, 2019

一、函数式组件和普通组件的区别

  • 渲染快
  • 没有实例,意味着没有(this)
  • 没有生命周期(没有响应式数据)

二、组件函数的使用

1.以局部组件为例,将组件标记为functional=ture;

因为函数式没有实例,因此组件需要的一切都是通过context参数传递,它是一个包括如下字段的对象:

  • props:提供所有 prop 的对象children: VNode 子节点的数组slots: 一个函数,返回了包含所有插槽的对象scopedSlots: (2.6.0+) 一个暴露传入的作用域插槽的对象。也以函数形式暴露普通插槽。data:传递给组件的整个数据对象,作为createElement的第二个参数传入组件parent:对父组件的引用listeners: (2.3.0+) 一个包含了所有父组件为当前组件注册的事件监听器的对象。这是data.on的一个别名。injections: (2.3.0+) 如果使用了inject选项,则该对象包含了应当被注入的属性。

在添加 functional: true 之后,需要更新我们的锚点标题组件的渲染函数,为其增加 context参数,并将 this.$slots.default 更新为 context.children,然后将 this.level 更新为 context.props.level。

因为函数式组件只是函数,所以渲染开销也低很多。

在作为包装组件时它们也同样非常有用。比如,当你需要做这些时:

  • 程序化地在多个组件中选择一个来代为渲染;
  • 在将 children、props、data 传递给子组件之前操作它们。
data() {
    return {
      changer:1
    }
  },
components: {
    MyCmp:{
      functional:true,  //必要的设置
      render: function (createElement, context) {
        function getcomp(cmp){
          console.info(this); //输出为undefined,证明没有实例
          if(cmp==1){
            return comp1; 
          }else{
            return comp2
          }
        }
        return createElement(getcomp(context.props.changer),
        {
          props:{
            cmpData:context.props.data //为子组件传递数据
          }
        }
        );
      },

 2. 定义要渲染的组件

var comp1={
  props:['cmpData'],
  render:function(createElement,context){
    return createElement('el-input',{
      props:{
        type:this.cmpData
      }
    });
  },
  mounted() {
    console.log(this) //这个组件为正常组件
  },
}
var comp2={
  props:['cmpData'],
  render:function(createElement,context){
    return createElement('el-button',{
      props:{
        type:this.cmpData
      }
    });
  },
  mounted() {
    console.log(this) //正常组件
  },
}

三、在父组件中使用

<template>
  <div>
    <el-input v-model="changer" placeholder="子组件"></el-input>
    <my-cmp :changer="changer"></my-cmp>
  </div>
</template>
<script>

四、理解渲染函数的参数

接下来说一下createElement 接受的参数:

第一个参数:可以是  {String | Object | Function}

不管是那种类型,最终返回到都是需要渲染的普通DOM标签,

第二个参数:是一个对象,这个参数是可选的,定义了需要渲染组件的参数,相对于普通HTML标签的属性是一样的。

还可以自定义指令的,Vue特有的东西,只是抽象一些,没有直接用Vue.directive()用起来直观。

第三个参数:子级虚拟节点,如果你这个节点只是单节点,没有嵌套节点,这个参数可以忽略。如果有的你就要使用一个数据数组的值位cerateElement()返回的虚拟节点。套路都是一样的。

// @returns {VNode}
createElement(
 // {String | Object | Function}
 // 一个 HTML 标签名、组件选项对象,或者
 // resolve 了上述任何一种的一个 async 函数。必填项。
 'div',
 // {Object}
 // 一个与模板中属性对应的数据对象。可选。
 {
  // 与 `v-bind:class` 的 API 相同,
  // 接受一个字符串、对象或字符串和对象组成的数组
  'class': {
    foo: true,
    bar: false
  },
  // 与 `v-bind:style` 的 API 相同,
  // 接受一个字符串、对象,或对象组成的数组
  style: {
    color: 'red',
    fontSize: '14px'
  },
  // 普通的 HTML 特性
  attrs: {
    id: 'foo'
  },
  // 组件 prop
  props: {
    myProp: 'bar'
  },
  // DOM 属性
  domProps: {
    innerHTML: 'baz'
  },
  // 事件监听器在 `on` 属性内,
  // 但不再支持如 `v-on:keyup.enter` 这样的修饰器。
  // 需要在处理函数中手动检查 keyCode。
  on: {
    click: this.clickHandler
  },
  // 仅用于组件,用于监听原生事件,而不是组件内部使用
  // `vm.$emit` 触发的事件。
  nativeOn: {
    click: this.nativeClickHandler
 },
 // 自定义指令。注意,你无法对 `binding` 中的 `oldValue`
 // 赋值,因为 Vue 已经自动为你进行了同步。
 directives: [
  {
   name: 'my-custom-directive',
   value: '2',
   expression: '1 + 1',
   arg: 'foo',
   modifiers: {
    bar: true
   }
  }
 ],
 // 作用域插槽的格式为
 // { name: props => VNode | Array<VNode> }
 scopedSlots: {
  default: props => createElement('span', props.text)
 },
 // 如果组件是其它组件的子组件,需为插槽指定名称
 slot: 'name-of-slot',
 // 其它特殊顶层属性
 key: 'myKey',
 ref: 'myRef',
 // 如果你在渲染函数中给多个元素都应用了相同的 ref 名,
 // 那么 `$refs.myRef` 会变成一个数组。
 refInFor: true  
 },
 // {String | Array}
 // 子级虚拟节点 (VNodes),由 `createElement()` 构建而成,
 // 也可以使用字符串来生成“文本虚拟节点”。可选。
 [
  '先写一些文字',
  createElement('h1', '一则头条'),
  createElement(MyComponent, {
   props: {
    someProp: 'foobar'
   }
  })
 ]
)

总结

以上所述是小编给大家介绍的Vue函数式组件的应用实例详解,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Javascript 相关文章推荐
通过MSXML2自动获取QQ个人头像及在线情况(给初学者)
Jan 22 Javascript
纯JavaScript实现的完美渐变弹出层效果代码
Apr 02 Javascript
Javascript selection的兼容性写法介绍
Dec 20 Javascript
jQuery实现模拟marquee标签效果
Jul 14 Javascript
js实现温度计时间样式代码分享
Aug 21 Javascript
jquery dataTable 后台加载数据并分页实例代码
Jun 07 jQuery
JavaScript 高性能数组去重的方法
Sep 20 Javascript
微信小程序websocket聊天室的实现示例代码
Feb 12 Javascript
layui button 按钮弹出提示窗口,确定才进行的方法
Sep 06 Javascript
JS实现横向轮播图(初级版)
Jun 24 Javascript
jquery实现垂直手风琴菜单
Mar 04 jQuery
Vue按时间段查询数据组件使用详解
Aug 21 Javascript
详解elementui之el-image-viewer(图片查看器)
Aug 30 #Javascript
vue+koa2实现session、token登陆状态验证的示例
Aug 30 #Javascript
js利用递归与promise 按顺序请求数据的方法
Aug 30 #Javascript
Vue-CLI 项目在pycharm中配置方法
Aug 30 #Javascript
JS实现页面跳转与刷新的方法汇总
Aug 30 #Javascript
Vue 动态组件components和v-once指令的实现
Aug 30 #Javascript
java实现单链表增删改查的实例代码详解
Aug 30 #Javascript
You might like
解析PHP自带的进位制之间的转换函数
2013/06/08 PHP
ThinkPHP CURD方法之limit方法详解
2014/06/18 PHP
php使用CURL伪造IP和来源实例详解
2015/01/15 PHP
Laravel模板引擎Blade中section的一些标签的区别介绍
2015/02/10 PHP
用JS判别浏览器种类以及IE版本的几种方法小结
2011/08/02 Javascript
获取客户端网卡MAC地址和IP地址实现JS代码
2013/03/17 Javascript
让低版本浏览器支持input的placeholder属性(js方法)
2013/04/03 Javascript
js实现弹窗插件功能实例代码分享
2013/12/12 Javascript
对new functionName()定义一个函数的理解
2014/05/22 Javascript
一个支付页面DEMO附截图
2014/07/22 Javascript
JavaScript运行机制之事件循环(Event Loop)详解
2014/10/10 Javascript
js实现多选项切换导航菜单的方法
2015/02/06 Javascript
jquery实现LED广告牌旋转系统图片切换效果代码分享
2015/08/26 Javascript
js获取所有checkbox的值的简单实例
2016/05/30 Javascript
Vue-cli-webpack搭建斗鱼直播步骤详解
2017/11/17 Javascript
vue中element组件样式修改无效的解决方法
2018/02/03 Javascript
vue axios请求超时的正确处理方法
2018/04/02 Javascript
详解Vue、element-ui、axios实现省市区三级联动
2019/05/07 Javascript
JS 5种遍历对象的方式
2020/06/16 Javascript
在vue项目中引用Antv G2,以饼图为例讲解
2020/10/28 Javascript
python 二分查找和快速排序实例详解
2017/10/13 Python
快速了解Python开发中的cookie及简单代码示例
2018/01/17 Python
Django进阶之CSRF的解决
2018/08/01 Python
tf.concat中axis的含义与使用详解
2020/02/07 Python
python实现拼接图片
2020/03/23 Python
一些常用的HTML5模式(pattern) 总结
2015/07/14 HTML / CSS
英国高端食品和葡萄酒超市:Waitrose
2016/08/23 全球购物
澳大利亚在线购买葡萄酒:The Wine Collective
2020/02/20 全球购物
个性大学生自我评价
2013/12/04 职场文书
机电一体化自荐信
2013/12/10 职场文书
分公司总经理岗位职责
2014/07/30 职场文书
处级干部反四风个人对照检查材料思想汇报
2014/09/27 职场文书
单位委托书格式范本
2014/09/29 职场文书
解除租房协议书
2014/12/03 职场文书
跟班学习心得体会(共6篇)
2016/01/23 职场文书
2019求职信大礼包
2019/05/15 职场文书