说说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评估用户输入密码的强度实现代码
Nov 30 Javascript
JQuery为textarea添加maxlength属性并且兼容IE
Apr 25 Javascript
Jquery在指定DIV加载HTML示例代码
Feb 17 Javascript
jquery 为a标签绑定click事件示例代码
Jun 23 Javascript
jQuery的ajax和遍历数组json实例代码
Aug 01 Javascript
Bootstrap表单控件使用方法详解
Jan 11 Javascript
详解如何在vue项目中使用lodop打印插件
Sep 27 Javascript
微信小程序实现文字从右向左无限滚动
Nov 18 Javascript
JS实现checkbox互斥(单选)功能示例
May 04 Javascript
浅谈vue 组件中的setInterval方法和window的不同
Jul 30 Javascript
vue自定义树状结构图的实现方法
Oct 18 Javascript
Vue2.x和Vue3.x的双向绑定原理详解
Nov 05 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
php不用正则验证真假身份证
2013/11/06 PHP
ThinkPHP之getField详解
2014/06/20 PHP
Laravel 5框架学习之子视图和表单复用
2015/04/09 PHP
基于PHP微信红包的算法探讨
2016/07/21 PHP
php实现微信发红包功能
2018/07/13 PHP
jquery 双色表格实现代码
2009/12/08 Javascript
Node.js编码规范
2014/07/14 Javascript
JavaScript中的setUTCDate()方法使用详解
2015/06/11 Javascript
全面解析bootstrap格子布局
2016/05/22 Javascript
js实现hashtable的赋值、取值、遍历操作实例详解
2016/12/25 Javascript
angularjs点击图片放大实现上传图片预览
2017/02/24 Javascript
Vue.js实现微信过渡动画左右切换效果
2017/06/13 Javascript
BootStrap Validator 根据条件在JS中添加或移除校验操作
2017/10/12 Javascript
Vue+element-ui 实现表格的分页功能示例
2018/08/18 Javascript
详解Node.js一行命令上传本地文件到服务器
2019/04/22 Javascript
浅谈javascript错误处理
2019/08/11 Javascript
vue中实现动态生成二维码的方法
2020/02/21 Javascript
JS实现audio音频剪裁剪切复制播放与上传(步骤详解)
2020/07/28 Javascript
玩转python爬虫之cookie使用方法
2016/02/17 Python
详解Python中的__new__、__init__、__call__三个特殊方法
2016/06/02 Python
python 写入csv乱码问题解决方法
2016/10/23 Python
浅谈Python处理PDF的方法
2017/11/10 Python
python画一个玫瑰和一个爱心
2020/08/18 Python
Django之提交表单与前后端交互的方法
2019/07/19 Python
PyTorch之图像和Tensor填充的实例
2019/08/18 Python
win10安装tensorflow-gpu1.8.0详细完整步骤
2020/01/20 Python
django中的数据库迁移的实现
2020/03/16 Python
台湾东南旅游社网站:东南旅游
2019/02/11 全球购物
瑞士最大的图书贸易公司:Orell Füssli
2019/12/28 全球购物
PatPat香港:婴童服饰和亲子全家装在线购物
2020/09/27 全球购物
PHP解析URL是哪个函数?怎么用?
2013/05/09 面试题
JAVA和C++的区别
2013/10/06 面试题
实习自荐信
2013/10/13 职场文书
副乡长群众路线教育实践活动个人对照检查材料
2014/09/19 职场文书
英语投诉信范文
2015/07/03 职场文书
导游词之天津盘山
2019/11/01 职场文书