说说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 相关文章推荐
对采用动态原型方式无法展示继承机制得思考
Dec 04 Javascript
超级24小时弹窗代码 24小时退出弹窗代码 100%弹窗代码(IE only)
Jun 11 Javascript
Json字符串转换为JS对象的高效方法实例
May 01 Javascript
jQuery制作仿腾讯web qq用户体验桌面
Aug 20 Javascript
JS实现带缓冲效果打开、关闭、移动一个层的方法
May 09 Javascript
jquery验证邮箱格式是否正确实例讲解
Nov 16 Javascript
Bootstrap所支持的表单控件实例详解
May 16 Javascript
jquery删除table当前行的实例代码
Oct 07 Javascript
AngularJS深入探讨scope,继承结构,事件系统和生命周期
Nov 02 Javascript
BootStrap selectpicker后台动态绑定数据
Jun 01 Javascript
浅谈pc端rem字体设置的问题
Aug 03 Javascript
微信小程序后端(java)开发流程的详细步骤
Nov 13 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
Thinkphp中的volist标签用法简介
2014/06/18 PHP
PHP连接SQLServer2005的方法
2015/01/27 PHP
php对象在内存中的存在形式分析
2015/02/03 PHP
Laravel如何使用Redis共享Session
2018/02/23 PHP
PHP使Laravel为JSON REST API返回自定义错误的问题
2018/10/16 PHP
JS延迟加载加快页面打开速度示例代码
2013/12/30 Javascript
调整小数的格式保留小数点后两位
2014/05/14 Javascript
JS小游戏之仙剑翻牌源码详解
2014/09/25 Javascript
javascript实现切换td中的值
2014/12/05 Javascript
node.js中的fs.fchmod方法使用说明
2014/12/16 Javascript
javascript实现网页端解压并查看zip文件
2015/12/15 Javascript
Bootstrap学习系列之使用 Bootstrap Typeahead 组件实现百度下拉效果
2016/07/07 Javascript
AngularJs ng-repeat 嵌套如何获取外层$index
2016/09/21 Javascript
jquery实现页面加载效果
2017/02/21 Javascript
谈谈VUE种methods watch和compute的区别和联系
2017/08/01 Javascript
VueJs 将接口用webpack代理到本地的方法
2017/11/27 Javascript
bootstrap3中container与container_fluid外层容器的区别讲解
2017/12/04 Javascript
mint-ui在vue中的使用示例
2018/04/05 Javascript
详解小程序rich-text对富文本支持方案
2018/11/28 Javascript
JavaScript键盘事件响应顺序详解
2019/09/30 Javascript
Layui数据表格判断编辑输入的值,是否为我需要的类型详解
2019/10/26 Javascript
JS实现网站吸顶条
2020/01/08 Javascript
Python实现的对一个数进行因式分解操作示例
2019/06/27 Python
Python线程障碍对象Barrier原理详解
2019/12/02 Python
python中resample函数实现重采样和降采样代码
2020/02/25 Python
Expected conditions模块使用方法汇总代码解析
2020/08/13 Python
CSS3打造磨砂玻璃背景效果
2016/09/28 HTML / CSS
Jo Malone美国官网:祖玛珑香水
2017/03/27 全球购物
个人求职信范文分享
2014/01/31 职场文书
中学校庆方案
2014/03/17 职场文书
小学新学期寄语
2014/04/02 职场文书
2016感恩母亲节校园广播稿
2015/12/17 职场文书
发言稿之优秀教师篇
2019/09/26 职场文书
《女娲补天》读后感5篇
2019/12/31 职场文书
go类型转换及与C的类型转换方式
2021/05/05 Golang
HttpClient实现表单提交上传文件
2022/08/14 Java/Android