说说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 相关文章推荐
通过js获取div的background-image属性
Oct 15 Javascript
qq悬浮代码(兼容各个浏览器)
Jan 29 Javascript
js选择并转移导航菜单示例代码
Aug 19 Javascript
ECMAScript6新增值比较函数Object.is
Jun 12 Javascript
JavaScript实现模仿桌面窗口的方法
Jul 18 Javascript
javascript实现添加附件功能的方法
Nov 18 Javascript
BootStrap中Datepicker控件带中文的js文件
Aug 10 Javascript
JSON中key动态设置及JSON.parse和JSON.stringify()的区别
Dec 29 Javascript
整理关于Bootstrap模态弹出框的慕课笔记
Mar 29 Javascript
vue中mint-ui环境搭建详细介绍
Apr 06 Javascript
使用Vue.js 和Chart.js制作绚丽多彩的图表
Jun 15 Javascript
javascript实现下拉菜单效果
Feb 09 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 file_get_contents函数轻松采集html数据
2010/04/22 PHP
PHP取二进制文件头快速判断文件类型的实现代码
2013/08/05 PHP
yii2.0之GridView自定义按钮和链接用法
2014/12/15 PHP
php对文件夹进行相关操作(遍历、计算大小)
2015/11/04 PHP
关于jQuery $.isNumeric vs. $.isNaN vs. isNaN
2013/04/15 Javascript
改变隐藏的input中value的值代码
2013/12/30 Javascript
js改变鼠标的形状和样式的方法
2014/03/31 Javascript
jQuery Mobile操作HTML5的常用函数总结
2016/05/17 Javascript
vue-resourse将json数据输出实例
2017/03/08 Javascript
AngularJS实现根据不同条件显示不同控件
2017/04/20 Javascript
React复制到剪贴板的示例代码
2017/08/22 Javascript
Vue全局loading及错误提示的思路与实现
2019/08/09 Javascript
Vue SPA 初次进入加载动画实现代码
2019/11/14 Javascript
详解在IDEA中将Echarts引入web两种方式(使用js文件和maven的依赖导入)
2020/07/11 Javascript
[14:03]2017DOTA2亚洲邀请赛开幕式:12神兵演绎水墨中华
2017/04/01 DOTA
[33:23]VG vs Pain 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
详解Python Socket网络编程
2016/01/05 Python
简单谈谈Python中的闭包
2016/11/30 Python
python实现简单多人聊天室
2018/12/11 Python
详解django中Template语言
2020/02/22 Python
Python 捕获代码中所有异常的方法
2020/08/03 Python
python3 kubernetes api的使用示例
2021/01/12 Python
css图标制作教程制作云图标
2014/01/19 HTML / CSS
皇马官方商城:Real Madrid Store
2016/09/02 全球购物
BookOutlet加拿大:在网上书店购买廉价折扣图书和小说
2018/10/05 全球购物
土耳其玩具商店:Toyzz Shop
2019/08/02 全球购物
俄罗斯厨房产品购物网站:COOK HOUSE
2021/03/15 全球购物
高中毕业生自我鉴定例文
2013/12/29 职场文书
运动会稿件50字
2014/02/17 职场文书
预备党员表决心书
2014/03/11 职场文书
公司要求试用期员工提交“述职报告”,该怎么写?
2019/07/17 职场文书
python文本处理的方案(结巴分词并去除符号)
2021/05/26 Python
Java输出Hello World完美过程解析
2021/06/13 Java/Android
Python将CSV文件转化为HTML文件的操作方法
2021/06/30 Python
SpringBoot系列之MongoDB Aggregations用法详解
2022/02/12 MongoDB
Vue OpenLayer 为地图绘制风场效果
2022/04/24 Vue.js