Vue中render函数的使用方法


Posted in Javascript onJanuary 31, 2018

render函数

vue通过 template 来创建你的 HTML。但是,在特殊情况下,这种写死的模式无法满足需求,必须需要js的编程能力。此时,需要用render来创建HTML。

什么情况下适合使用render函数

在一次封装一套通用按钮组件的工作中,按钮有四个样式(default success error )。首先,你可能会想到如下实现

<div v-if="type === 'success'">success</div>
 <div v-else-if="type === 'error'">error</div>
 <div v-else-if="type === 'warm'">warm</div>
 <div v-else>default</div>

这样写在按钮样式少的时候完全没有问题,但是试想,如果需要的按钮样式有十多个,按钮内的文字根据实际情况而定(如success按钮内的文字可能是OK、GOOD等等)。那么template写死的方式就显得很无力了。遇上类似这样的情况,使用render函数可以说最优选择了。

根据实际情况改写按钮组件

首先render函数生成的内容相当于template的内容,故使用render函数时,在.vue文件中需要先把template标签去掉。只保留逻辑层。

export default {
 render(h) {
  return h('div',{
   'class': {
    btn: true,
    success: this.type === 'success',
    error: this.type === 'error',
    warm: this.type === 'warm',
    default: this.type === 'default'
   },
   domProps: {
    innerHTML: this.$slots.default[0].text
   },
   on: {
    click: this.clickHandle
   }
  })
 },
 methods: {
  clickHandle() {
   // dosomething
  }
 },
 props: {
  type: {
   type: String,
   default: 'default'
  },
  text: {
   type: String,
   default: 'default'
  }
 }
};

根据组件化思维,能抽象出来的东西绝不写死在逻辑上。这里的clickHandle函数可以根据按钮的type类型触发不同的逻辑,就不多叙述了。

然后在父组件调用

<btn
 v-for="(btn, index) in testData"
 :type="btn.type"
 :text="btn.text"
 :key="index">{{btn.text}}
</btn>

使用jsx

是的,要记住每个参数的类型同用法,按序传参实在是太麻烦了。那么其实可以用jsx来优化这个繁琐的过程。

return (
 <div
  class={{
   btn: true,
   success: this.type === 'success',
   error: this.type === 'error',
   warm: this.type === 'warm',
   default: this.type === 'default'
  }}
  onClick={this.clickHandle}>
  {this.$slots.default[0].text}
 </div>
)

示例二:

在遇到写类似的组件的时候需要写很多很长的代码,出于简洁(懒惰使人进步)的角度来说,我们应该找到更合适的方法来实现该效果。

<body> 
    <div id="app"> 
      <mycomment :level="2"> 
        这是h2元素 
      </mycomment> 
    </div> 
  </body> 
  <script type="text/x-template" id="is"> 
 <div> 
  <h1 v-if="level === 1"> 
   <slot></slot> 
  </h1> 
  <h2 v-if="level === 2"> 
    <slot></slot> 
  </h2> 
  <h3 v-if="level === 3"> 
   <slot></slot> 
  </h3> 
  <h4 v-if="level === 4"> 
   <slot></slot> 
  </h4> 
  <h5 v-if="level === 5"> 
   <slot></slot> 
  </h5> 
  <h6 v-if="level === 6"> 
   <slot></slot> 
  </h6> 
 </div> 
</script> 
  <script> 
    Vue.component('mycomment',{ 
      template:'#is', 
      props:{ 
        level:{ 
          type:Number, 
          required:true, 
        } 
      } 
    }) 
    var app =new Vue({ 
      el:'#app', 
    }) 
   </script>

这时候Render 函数就很好的解决了这个问题,先来简单一点额例子,算是有基本的骨架了

<body> 
  <div id="app"> 
    <render-teample :level="4"> 
      render function 
 
    </render-teample> 
  </div> 
 
</body> 
<script> 
Vue.component('render-teample',{ 
  render:function(createElement){ 
    return createElement( 
      'h'+this.level, 
      this.$slots.default 
      ) 
  }, 
   props: { 
  level: { 
   type: Number, 
   required: true 
  } 
} 
  var app=new Vue({ 
    el:"#app", 
 
  }); 
 </script>

然后进一步给你的组件加入你想要的样式需要事件,变得有血有肉

<body> 
    <div id="app"> 
      <render-teample :level="4" > 
 
        <div class="jah" slot="myslot">render function</div> 
      </render-teample> 
    </div> 
 
  </body> 
  <script> 
  Vue.component('render-teample',{ 
    render:function(createElement){ 
      return createElement( 
        'h'+this.level, 
        { 
          'class':{ 
            show:true, 
            hide:false, 
          }, 
          style:{ 
            width:'200px', 
            height:'400px', 
            background:'red', 
          }, 
          attrs:{ 
            name:'h-ex', 
            id:'h-id' 
          }, 
          props:{ 
            myprops:true, 
          }, 
           on: { 
          click: function(event){ 
            alert(this.num) 
          } 
        }, 
          nativeOn:{ 
            click:function(event) { 
 
              alert(1111) 
            } 
          } 
 
        }, 
        [ 
          this.$slots.myslot, 
          createElement('div',{ 
             domProps:{ 
            innerHTML:'holle render' 
          } 
          }) 
        ] 
 
        ) 
    }, 
     props: { 
    level: { 
     type: Number, 
     required: true 
    } 
  } 
});  
    var app=new Vue({ 
      el:"#app", 
      data:{ 
        num:110 
      } 
    }); 
  </script>

注意:约束组件中 VNodes 必须是唯一的。

直接把所有元素写在一个createElement()下是很痛苦的,不利于维护。

所以通常会

var com1= createElement('p','item1');var
com2= createElement('p','item1');

可以使用return createElement('div',[com1,com2])

这种情况是禁止的return createElement('div',[com1,com1])

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JQuery 初体验(建议学习jquery)
Apr 25 Javascript
原生js实现的贪吃蛇网页版游戏完整实例
May 18 Javascript
使用jquery.form.js实现图片上传的方法
May 05 Javascript
使用JSON作为函数的参数的优缺点
Oct 27 Javascript
使用JS代码实现点击按钮下载文件
Nov 12 Javascript
基于JQuery及AJAX实现名人名言随机生成器
Feb 10 Javascript
AngularJS中filter的使用实例详解
Aug 25 Javascript
Vue2.0权限树组件实现代码
Aug 29 Javascript
简单两步使用node发送qq邮件的方法
Mar 01 Javascript
Vue组件实现触底判断
Jun 26 Javascript
vue项目接口域名动态获取操作
Aug 13 Javascript
vue 实现图片懒加载功能
Dec 31 Vue.js
微信小程序图片轮播组件gallery slider使用方法详解
Jan 31 #Javascript
微信小程序scroll-view组件实现滚动动画
Jan 31 #Javascript
微信小程序实现全国机场索引列表
Jan 31 #Javascript
微信小程序radio组件使用详解
Jan 31 #Javascript
微信小程序checkbox组件使用详解
Jan 31 #Javascript
原生JS实现多个小球碰撞反弹效果示例
Jan 31 #Javascript
浅析Angular19 自定义表单控件
Jan 31 #Javascript
You might like
PHP 地址栏信息的获取代码
2009/01/07 PHP
基于php中echo用逗号和用点号的区别详解
2018/01/23 PHP
Thinkphp 在api开发中异常返回依然是html的解决方式
2019/10/16 PHP
php慢查询日志和错误日志使用详解
2021/02/27 PHP
JQuery 表单中textarea字数限制实现代码
2009/12/07 Javascript
关于Mozilla浏览器不支持innerText的解决办法
2011/01/01 Javascript
jQuery基础语法实例入门
2014/12/23 Javascript
jQuery模拟物体自由落体运动(附演示与demo源码下载)
2016/01/21 Javascript
javascript中setAttribute兼容性用法分析
2016/12/12 Javascript
jQuery实现字符串全部替换的方法【推荐】
2017/03/09 Javascript
JavaScript实现的冒泡排序法及统计相邻数交换次数示例
2017/04/26 Javascript
ReactJS实现表单的单选多选和反选的示例
2017/10/13 Javascript
JavaScript模板引擎原理与用法详解
2018/12/24 Javascript
用node撸一个监测复联4开售短信提醒的实现代码
2019/04/10 Javascript
重命名批处理python脚本
2013/04/05 Python
使用go和python递归删除.ds store文件的方法
2014/01/22 Python
详解python发送各类邮件的主要方法
2016/12/22 Python
python2爬取百度贴吧指定关键字和图片代码实例
2019/08/14 Python
使用keras根据层名称来初始化网络
2020/05/21 Python
公认8个效率最高的爬虫框架
2020/07/28 Python
python Gabor滤波器讲解
2020/10/26 Python
使用CSS3中的calc()属性来以算式表达尺寸数值
2016/06/06 HTML / CSS
CSS3点击按钮实现背景渐变动画效果
2016/10/19 HTML / CSS
华为慧通笔试题
2016/04/22 面试题
暑期社会实践方案
2014/02/05 职场文书
小班开学寄语
2014/04/04 职场文书
工作分析计划书
2014/04/30 职场文书
董事长秘书工作职责
2014/06/10 职场文书
保护动物的标语
2014/06/11 职场文书
正风肃纪剖析材料范文
2014/10/10 职场文书
酒店销售经理岗位职责
2015/04/02 职场文书
个人工作违纪检讨书
2015/05/05 职场文书
2015年小学教科研工作总结
2015/07/20 职场文书
2016年大学生社区服务活动总结
2016/04/06 职场文书
2019通用版导游词范本!
2019/08/07 职场文书
搭建zabbix监控以及邮件报警的超级详细教学
2022/07/15 Servers