说说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 相关文章推荐
Ajax 数据请求的简单分析
Apr 05 Javascript
使用js正则控制input标签只允许输入的值
Jul 29 Javascript
JavaScript中的Math 使用介绍
Apr 21 Javascript
jquery实现全选和全不选功能效果的实现代码【推荐】
May 05 Javascript
EXT中单击button按钮grid添加一行(光标位置可设置)的实例代码
Jun 02 Javascript
ng2学习笔记之bootstrap中的component使用教程
Mar 09 Javascript
angularjs封装$http为factory的方法
May 18 Javascript
浅析node Async异步处理模块用例分析及常用方法介绍
Nov 17 Javascript
基于vue开发的在线付费课程应用过程
Jan 25 Javascript
基于Vue2x实现响应式自适应轮播组件插件VueSliderShow功能
May 16 Javascript
Vue 修改网站图标的方法
Dec 31 Vue.js
详解实现vue的数据响应式原理
Jan 20 Vue.js
详解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
PHP的autoload机制的实现解析
2012/09/15 PHP
基于PHP字符串的比较函数strcmp()与strcasecmp()的使用详解
2013/05/15 PHP
用PHP代替JS玩转DOM的思路及示例代码
2014/06/15 PHP
php中序列化与反序列化详解
2017/02/13 PHP
jQuery+PHP实现图片上传并提交功能
2020/07/27 PHP
ajax无刷新动态调用股票信息(改良版)
2008/11/01 Javascript
JSON扫盲帖 JSON.as类教程
2009/02/16 Javascript
yepnope.js 异步加载资源文件
2011/09/08 Javascript
jquery库或JS文件在eclipse下报错问题解决方法
2014/04/17 Javascript
jquery通过load获取文件的内容并跳到锚点的方法
2015/01/29 Javascript
Javascript中的匿名函数与封装介绍
2015/03/15 Javascript
JavaScript自定义等待wait函数实例分析
2015/03/23 Javascript
跟我学习javascript的定时器
2015/11/19 Javascript
JS刷新父窗口的几种方式小结(推荐)
2016/11/09 Javascript
jQuery 插件封装的方法
2016/11/16 Javascript
jQuery EasyUI Accordion可伸缩面板组件使用详解
2017/02/28 Javascript
NodeJs中express框架的send()方法简介
2017/06/20 NodeJs
vue获取DOM元素并设置属性的两种实现方法
2017/09/30 Javascript
webpack4打包vue前端多页面项目
2018/09/17 Javascript
vue elementUI table 自定义表头和行合并的实例代码
2019/05/22 Javascript
Vue+Node实现的商城用户管理功能示例
2019/12/23 Javascript
Vue+ElementUI 中级联选择器Bug问题的解决
2020/07/31 Javascript
将Django使用的数据库从MySQL迁移到PostgreSQL的教程
2015/04/11 Python
Python实现模拟分割大文件及多线程处理的方法
2017/10/10 Python
Python 实现一行输入多个值的方法
2018/04/21 Python
Python实现 版本号对比功能的实例代码
2019/04/18 Python
python实现抠图给证件照换背景源码
2019/08/20 Python
使用canvas对多图片拼合并导出图片的方法
2018/08/28 HTML / CSS
美国羽绒床上用品第一品牌:Pacific Coast
2018/08/25 全球购物
关于抽烟的检讨书
2014/02/25 职场文书
防灾减灾日活动总结
2014/08/26 职场文书
史上最牛的辞职信
2015/02/28 职场文书
会议主持词开场白
2015/05/28 职场文书
thinkphp 获取控制器及控制器方法
2021/04/16 PHP
MySQL表字段时间设置默认值
2021/05/13 MySQL
Python+腾讯云服务器实现每日自动健康打卡
2021/12/06 Python