说说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版(约瑟夫环问题)
Aug 05 Javascript
javascript 保存文件到本地实现方法
Nov 29 Javascript
javascript模拟post提交隐藏地址栏的参数
Sep 03 Javascript
js获取json元素数量的方法
Jan 27 Javascript
TypeScript 中接口详解
Jun 19 Javascript
Bootstrap每天必学之滚动监听
Mar 16 Javascript
jQuery编写textarea输入字数限制代码
Mar 23 jQuery
jQuery实现获取及设置CSS样式操作详解
Sep 05 jQuery
jQuery zTree插件使用简单教程
Aug 16 jQuery
简单了解Vue + ElementUI后台管理模板
Apr 07 Javascript
支付宝小程序实现省市区三级联动
Jun 21 Javascript
electron踩坑之dialog中的callback解决
Oct 06 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
CI(CodeIgniter)框架介绍
2014/06/09 PHP
CI框架验证码CAPTCHA辅助函数用法实例
2014/11/05 PHP
Yii2前后台分离及migrate使用(七)
2016/05/04 PHP
Zend Framework入门教程之Zend_Session会话操作详解
2016/12/08 PHP
学习YUI.Ext第五日--做拖放Darg&amp;Drop
2007/03/10 Javascript
jQuery 设置 CSS 属性示例介绍
2014/01/16 Javascript
JQuery 在线引用及测试引用是否成功
2014/06/24 Javascript
javascript基于原型链的继承及call和apply函数用法分析
2016/12/15 Javascript
JS简单获取当前日期和农历日期的方法
2017/04/17 Javascript
20170918 前端开发周报之JS前端开发必看
2017/09/18 Javascript
Angular表格神器ui-grid应用详解
2017/09/29 Javascript
Vue v2.4中新增的$attrs及$listeners属性使用教程
2018/01/08 Javascript
webpack开发环境和生产环境的深入理解
2018/11/08 Javascript
javascript数据类型中的一些小知识点(推荐)
2019/04/18 Javascript
JavaScript实现秒杀时钟倒计时
2019/09/29 Javascript
Vue通过for循环随机生成不同的颜色或随机数的实例
2019/11/09 Javascript
原生javascript的ajax请求及后台PHP响应操作示例
2020/02/24 Javascript
Element-ui upload上传文件限制的解决方法
2021/01/22 Javascript
Python使用pyh生成HTML文档的方法示例
2018/03/10 Python
pyinstaller打包程序exe踩过的坑
2019/11/19 Python
python爬虫scrapy基本使用超详细教程
2021/02/20 Python
魔声耳机官方网站:Monster是世界第一品牌的高性能耳机
2016/10/26 全球购物
Nayomi官网:沙特阿拉伯王国睡衣和内衣品牌
2020/12/19 全球购物
adidas马来西亚官网:adidas MY
2020/09/12 全球购物
新加坡鲜花速递/新加坡网上花店:Ferns N Petals
2020/08/29 全球购物
char型变量中能不能存贮一个中文汉字
2015/07/08 面试题
公司前台接待岗位职责
2013/12/03 职场文书
领导调研接待方案
2014/02/27 职场文书
2014年国庆节寄语
2014/09/19 职场文书
公司人事任命通知
2015/04/20 职场文书
项目验收申请报告
2015/05/15 职场文书
会议主持词开场白
2015/05/28 职场文书
运动员代表致辞
2015/07/29 职场文书
在前女友婚礼上,用Python破解了现场的WIFI还把名称改成了
2021/05/28 Python
Golang中异常处理机制详解
2021/06/08 Golang
python高温预警数据获取实例
2022/07/23 Python