说说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之通用简单的table选项卡实现(二)
May 09 Javascript
jQuery的初始化与对象构建之浅析
Apr 12 Javascript
JS打开新窗口的2种方式
Apr 18 Javascript
jquery实现网页的页面平滑滚动效果代码
Nov 02 Javascript
jQueryUI中的datepicker使用方法详解
May 25 Javascript
canvas实现图像放大镜
Feb 06 Javascript
AngularJS监听路由变化的方法
Mar 07 Javascript
React-Native左右联动List的示例代码
Sep 21 Javascript
利用JS hash制作单页Web应用的方法详解
Oct 10 Javascript
Vue实战教程之仿肯德基宅急送App
Jul 19 Javascript
解决layui使用layui-icon出现默认图标的问题
Sep 11 Javascript
JavaScript对象属性操作实例解析
Feb 04 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脚本的10个技巧(1)
2006/10/09 PHP
PHP中的日期及时间
2006/11/23 PHP
ThinkPHP模板判断输出Defined标签用法详解
2014/06/30 PHP
基于PHP技术开发客服工单系统
2016/01/06 PHP
ASP.NET jQuery 实例7 通过jQuery来获取DropDownList的Text/Value属性值
2012/02/03 Javascript
基于jQuery的计算文本框字数的代码
2012/06/06 Javascript
JavaScript中使用Substring删除字符串最后一个字符
2013/11/03 Javascript
js图片自动轮播代码分享(js图片轮播)
2014/05/06 Javascript
js 获取页面高度和宽度兼容 ie firefox chrome等
2014/05/14 Javascript
JavaScript动态修改弹出窗口大小的方法
2015/04/06 Javascript
谈一谈JS消息机制和事件机制的理解
2016/04/14 Javascript
jquery  实现轮播图详解及实例代码
2016/10/12 Javascript
jquery 实现复选框的全选操作实例代码
2017/01/24 Javascript
利用PM2部署node.js项目的方法教程
2017/05/10 Javascript
jquery 输入框查找关键字并提亮颜色的实例代码
2018/01/23 jQuery
JavaScript实现JSON合并操作示例【递归深度合并】
2018/09/07 Javascript
浅谈Layui的eleTree树式选择器使用方法
2019/09/25 Javascript
Node使用koa2实现一个简单JWT鉴权的方法
2021/01/26 Javascript
python列表操作之extend和append的区别实例分析
2015/07/28 Python
Python实现使用卷积提取图片轮廓功能示例
2018/05/12 Python
快速解决PyCharm无法引用matplotlib的问题
2018/05/24 Python
python 将列表中的字符串连接成一个长路径的方法
2018/10/23 Python
Python图像滤波处理操作示例【基于ImageFilter类】
2019/01/03 Python
python安装scipy的步骤解析
2019/09/28 Python
Python之Django自动实现html代码(下拉框,数据选择)
2020/03/13 Python
解决numpy矩阵相减出现的负值自动转正值的问题
2020/06/03 Python
使用Python构造hive insert语句说明
2020/06/06 Python
美国领先的户外服装与装备用品店:Moosejaw
2016/08/25 全球购物
MCAKE蛋糕官方网站:一直都是巴黎的味道
2018/02/06 全球购物
卫生标语大全
2014/06/21 职场文书
纪检干部对照检查材料
2014/08/22 职场文书
2014年企业员工工作总结
2014/12/09 职场文书
教师教育心得体会
2016/01/19 职场文书
2019年暑期安全广播稿!
2019/07/03 职场文书
感恩信:写给爸爸妈妈的一封感谢信
2019/09/12 职场文书
创业计划书之牛肉汤快餐店
2019/10/08 职场文书