说说Vue.js中的functional函数化组件的使用


Posted in Javascript onFebruary 12, 2019

Vue.js 组件提供了一个 functional  开关,设置为 true 后,就可以让组件变为无状态、无实例的函数化组件。因为只是函数,所以渲染的开销相对来说,较小。

函数化的组件中的 Render 函数,提供了第二个参数 context 作为上下文,data、props、slots、children 以及 parent 都可以通过 context 来访问。

1 示例

这里,我们用  functional 函数化组件来实现一个智能组件。

html:

<div id="app">
  <smart-component :data="data"></smart-component>
  <button @click="change('img')">图片组件</button>
  <button @click="change('video')">视频组件</button>
  <button @click="change('text')">文本组件</button>
</div>

js:

//图片组件设置
var imgOptions = {
  props: ['data'],
  render: function (createElement) {
    return createElement('div', [
      createElement('p', '图片组件'),
      createElement('img', {
        attrs: {
          src: this.data.url,
          height: 300,
          weight: 400

        }
      })
    ]);
  }
};

//视频组件设置
var videoOptions = {
  props: ['data'],
  render: function (createElement) {
    return createElement('div', [
      createElement('p', '视频组件'),
      createElement('video', {
        attrs: {
          src: this.data.url,
          controls: 'controls',
          autoplay: 'autoplay'
        }
      })
    ]);
  }
};

//文本组件设置
var textOptions = {
  props: ['data'],
  render: function (createElement) {
    return createElement('div', [
      createElement('p', '文本组件'),
      createElement('p', this.data.content)
    ]);
  }
};

Vue.component('smart-component', {
  //设置为函数化组件
  functional: true,
  render: function (createElement, context) {
    function get() {
      var data = context.props.data;

      console.log("smart-component/type:" + data.type);
      //判断是哪一种类型的组件
      switch (data.type) {
        case 'img':
          return imgOptions;
        case 'video':
          return videoOptions;
        case 'text':
          return textOptions;
        default:
          console.log("data 类型不合法:" + data.type);
      }
    }

    return createElement(
      get(),
      {
        props: {
          data: context.props.data
        }
      },
      context.children
    )
  },
  props: {
    data: {
      type: Object,
      required: true
    }
  }
})

var app = new Vue({
  el: '#app',
  data: {
    data: {}
  },
  methods: {
    change: function (type) {
      console.log("输入类型:" + type);
      switch (type) {
        case 'img':
          this.data = {
            type: 'img',
            url: 'http://pic-bucket.ws.126.net/photo/0001/2019-02-07/E7D8PON900AO0001NOS.jpg'
          }
          break;
        case 'video':
          this.data = {
            type: 'video',
            url: 'http://wxapp.cp31.ott.cibntv.net/6773887A7F94A71DF718E212C/03002002005B836E73A0C5708529E09C1952A1-1FCF-4289-875D-AEE23D77530D.mp4?ccode=0517&duration=393&expire=18000&psid=bbd36054f9dd2b21efc4121e320f05a0&ups_client_netip=65600b48&ups_ts=1549519607&ups_userid=21780671&utid=eWrCEmi2cFsCAWoLI41wnWhW&vid=XMzc5OTM0OTAyMA&vkey=A1b479ba34ca90bcc61e3d6c3b2da5a8e&iv=1&sp='
          }
          break;
        case 'text':
          this.data = {
            type: 'text',
            content: '《流浪地球》中的科学:太阳何时吞并地球?科学家已经给出时间表'
          }
          break;
        default:
          console.log("data 类型不合法:" + type);
      }

    }
  },
  created: function () {
    //默认为图片组件
    this.change('img');
  }

});

效果:

说说Vue.js中的functional函数化组件的使用

  • 首先定义了图片组件设置对象、视频组件设置对象以及文本组件设置对象,它们都以 data 作为入参。
  • 函数化组件 smart-component,也以  data 作为入参。内部根据 get() 函数来判断需要渲染的组件类型。
  • 函数化组件 smart-component 的 render 函数,以 get() 作为第一个参数;以 smart-component 所传入的 data,作为第二个参数:
return createElement(
  get(),
  {
    props: {
      data: context.props.data
    }
  },
  context.children
)

根实例 app 的 change 方法,根据输入的类型,来切换不同的组件所需要的数据。

2 应用场景

函数化组件不常用,它应该应用于以下场景:

  • 需要通过编程实现在多种组件中选择一种。
  • children、props 或者 data 在传递给子组件之前,处理它们。

本文示例代码

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
用javascript来实现动画导航效果的代码
Dec 16 Javascript
JavaScript和CSS交互的方法汇总
Dec 02 Javascript
jquery实现简单的无缝滚动
Apr 15 Javascript
Bootstrap实现下拉菜单效果
Apr 29 Javascript
使用do...while的方法输入一个月中所有的周日(实例代码)
Jul 22 Javascript
JS实现“隐藏与显示”功能(多种方法)
Nov 24 Javascript
JS简单实现查看文档创建日期、修改日期和文档大小的方法示例
Apr 08 Javascript
JavaScript使用indexOf()实现数组去重的方法分析
Sep 04 Javascript
微信小程序日历效果
Dec 29 Javascript
vue.js多页面开发环境搭建过程
Apr 24 Javascript
jQuery+ajax实现批量删除功能完整示例
Jun 06 jQuery
微信小程序实现二维码签到考勤系统
Jan 16 Javascript
详解Vue用cmd创建项目
Feb 12 #Javascript
谈谈JavaScript中super(props)的重要性
Feb 12 #Javascript
微信小程序实现的自定义分享功能示例
Feb 12 #Javascript
图文讲解用vue-cli脚手架创建vue项目步骤
Feb 12 #Javascript
实例分析编写vue组件方法
Feb 12 #Javascript
详解vue引入子组件方法
Feb 12 #Javascript
vue组件之间数据传递的方法实例分析
Feb 12 #Javascript
You might like
Zend引擎的发展 [15]
2006/10/09 PHP
php学习 函数 课件
2008/06/15 PHP
laravel5.2表单验证,并显示错误信息的实例
2019/09/29 PHP
jquery 查找新建元素代码
2010/07/06 Javascript
jQuery.validate 常用方法及需要注意的问题
2013/03/20 Javascript
如何用JavaScript动态呼叫函数(两种方式)
2013/05/03 Javascript
JS操作CSS随机改变网页背景实现思路
2014/03/10 Javascript
Javascript封装DOMContentLoaded事件实例
2014/06/12 Javascript
jquery 插件实现多行文本框[textarea]自动高度
2015/03/04 Javascript
JavaScript中var关键字的使用详解
2015/08/14 Javascript
微信小程序 限制1M的瘦身技巧与方法详解
2017/01/06 Javascript
详解webpack+es6+angular1.x项目构建
2017/05/02 Javascript
详解ElementUI之表单验证、数据绑定、路由跳转
2017/06/21 Javascript
Js 利用正则表达式和replace函数获取string中所有被匹配到的文本(推荐)
2018/10/28 Javascript
解决Layui当中的导航条动态添加后渲染失败的问题
2019/09/25 Javascript
JS中FileReader类实现文件上传及时预览功能
2020/03/27 Javascript
nuxt.js 在middleware(中间件)中实现路由鉴权操作
2020/11/06 Javascript
JavaScript缓动动画函数的封装方法
2020/11/25 Javascript
Python实现ssh批量登录并执行命令
2016/10/25 Python
Python有序字典简单实现方法示例
2017/09/28 Python
Python cookbook(数据结构与算法)实现优先级队列的方法示例
2018/02/18 Python
python使用wxpy轻松实现微信防撤回的方法
2019/02/21 Python
Python字符串和正则表达式中的反斜杠('\')问题详解
2019/09/03 Python
numpy创建单位矩阵和对角矩阵的实例
2019/11/29 Python
python虚拟环境模块venv使用及示例
2020/03/04 Python
Python基于当前时间批量创建文件
2020/05/07 Python
德国传统玻璃制造商:Cristalica
2018/04/23 全球购物
Michael Kors英国官网:美国奢侈品品牌
2019/11/13 全球购物
大门门卫岗位职责
2013/11/30 职场文书
医学专业毕业生个人求职信
2013/12/25 职场文书
2015年餐厅服务员工作总结
2015/04/23 职场文书
简单的辞职信范文(2016最新版)
2015/05/12 职场文书
旗帜观后感
2015/06/08 职场文书
幼儿园春季开学通知
2015/07/16 职场文书
详解java如何集成swagger组件
2021/06/21 Java/Android
Java实现HTML转为Word的示例代码
2022/06/28 Java/Android