说说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 相关文章推荐
jquery中对表单的基本操作代码
Jul 29 Javascript
使用JavaScript检测Firefox浏览器是否启用了Firebug的代码
Dec 28 Javascript
面向对象Javascript核心支持代码分享
May 23 Javascript
父元素与子iframe相互获取变量和元素对象的具体实现
Oct 15 Javascript
Javascript的表单验证长度
Mar 16 Javascript
JavaScript实现弹窗效果代码分析
Mar 09 Javascript
jQuery 添加样式属性的优先级别方法(推荐)
Jun 08 jQuery
jQuery层级选择器_动力节点节点Java学院整理
Jul 04 jQuery
详谈构造函数加括号与不加括号的区别
Oct 26 Javascript
使用Vue组件实现一个简单弹窗效果
Apr 23 Javascript
vue elementUI tree树形控件获取父节点ID的实例
Sep 12 Javascript
使用p5.js临摹动态图形
Oct 23 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/10/25 PHP
PHP智能识别收货地址信息实例
2019/01/05 PHP
JavaScript 联动的无限级封装类,数据采用非Ajax方式,随意添加联动
2010/06/29 Javascript
js setTimeout()函数介绍及应用以倒计时为例
2013/12/12 Javascript
Jquery中ajax方法data参数的用法小结
2014/02/12 Javascript
javascript html5实现表单验证
2016/03/01 Javascript
javascript实现数组去重的多种方法
2016/03/14 Javascript
javascript实现随机生成DIV背景色
2016/06/20 Javascript
每日十条JavaScript经验技巧(一)
2016/06/23 Javascript
Ionic3 UI组件之autocomplete详解
2017/06/08 Javascript
js 简易版滚动条实例(适用于移动端H5开发)
2017/06/26 Javascript
nodeJs实现基于连接池连接mysql的方法示例
2018/02/10 NodeJs
微信小程序实现红包雨功能
2018/07/11 Javascript
Vue.set() this.$set()引发的视图更新思考及注意事项
2018/08/30 Javascript
Node.js实现一个HTTP服务器的方法示例
2019/05/13 Javascript
安装多版本Vue-CLI的实现方法
2020/03/24 Javascript
vue项目实现设置根据路由高亮对应的菜单项操作
2020/08/06 Javascript
python通过装饰器检查函数参数数据类型的方法
2015/03/13 Python
解析Python中的异常处理
2015/04/28 Python
python PyTorch预训练示例
2018/02/11 Python
python实现人脸识别经典算法(一) 特征脸法
2018/03/13 Python
pandas数据框,统计某列数据对应的个数方法
2018/04/11 Python
Python匿名函数及应用示例
2019/04/09 Python
Python中Numpy ndarray的使用详解
2019/05/24 Python
pyqt5 使用cv2 显示图片,摄像头的实例
2019/06/27 Python
Django 中自定义 Admin 样式与功能的实现方法
2019/07/04 Python
pycharm内无法import已安装的模块问题解决
2020/02/12 Python
Stuarts London美国/加拿大:世界领先的独立男装零售商之一
2019/03/18 全球购物
DC Shoes澳大利亚官方网上商店:购买DC鞋子
2019/10/25 全球购物
超市营业员求职简历的自我评价
2013/10/17 职场文书
社区庆八一活动方案
2014/02/02 职场文书
入党思想汇报怎么写
2014/04/03 职场文书
教师见习期自我鉴定
2014/04/28 职场文书
社区爱国卫生月活动总结
2014/06/30 职场文书
食品质量与安全专业毕业生求职信
2014/08/11 职场文书
社区元宵节活动总结
2015/02/06 职场文书