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 相关文章推荐
一个js拖拽的效果类和dom-drag.js浅析
Jul 17 Javascript
为EasyUI的Tab标签添加右键菜单的方法
Jul 14 Javascript
JavaScript中的包装对象介绍
Jan 27 Javascript
Bootstrap每天必学之轮播(Carousel)插件
Apr 25 Javascript
KnockoutJs快速入门教程
May 16 Javascript
谈谈JavaScript中浏览器兼容问题的写法小议
Dec 17 Javascript
JS模拟超市简易收银台小程序代码解析
Aug 18 Javascript
react 组件传值的三种方法
Jun 03 Javascript
微信小程序发布新版本时自动提示用户更新的方法
Jun 07 Javascript
node实现简单的增删改查接口实例代码
Aug 22 Javascript
微信小程序实现锚点功能
Nov 20 Javascript
javascript实现的图片预览和上传功能示例【兼容IE 9】
May 01 Javascript
微信小程序图片轮播组件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
基于pear auth实现登录验证
2010/02/26 PHP
PHP操作xml代码
2010/06/17 PHP
php 大数据量及海量数据处理算法总结
2011/05/07 PHP
php实现的mysqldb读写分离操作类示例
2017/02/07 PHP
JCalendar 日历控件 v1.0 beta[兼容IE&amp;Firefox] 有文档和例子
2007/05/30 Javascript
浅析JS中document对象的一些重要属性
2014/03/06 Javascript
基于豆瓣API+Angular开发的web App
2015/01/02 Javascript
JavaScript获取伪元素(Pseudo-Element)属性的方法技巧
2015/03/13 Javascript
简介JavaScript中的getUTCFullYear()方法的使用
2015/06/10 Javascript
JS实现状态栏跑马灯文字效果代码
2015/10/24 Javascript
JS中substring与substr的用法
2016/11/16 Javascript
利用js的闭包原理做对象封装及调用方法
2017/04/07 Javascript
JS中的数组转变成JSON格式字符串的方法
2017/05/09 Javascript
微信小程序商品到详情的实现
2017/06/27 Javascript
JS简单添加元素新节点的方法示例
2018/02/10 Javascript
关于vue编译版本引入的问题的解决
2018/09/17 Javascript
利用weixin-java-miniapp生成小程序码并直接返回图片文件流的方法
2019/03/29 Javascript
Python的time模块中的常用方法整理
2015/06/18 Python
Python调用C语言的实现
2019/07/26 Python
Tensorflow中tf.ConfigProto()的用法详解
2020/02/06 Python
浅谈在django中使用redirect重定向数据传输的问题
2020/03/13 Python
Python使用configparser读取ini配置文件
2020/05/25 Python
Python使用shutil模块实现文件拷贝
2020/07/31 Python
澳大利亚电子产品购物网站:Dick Smith
2017/02/02 全球购物
碧欧泉法国官网:Biotherm法国
2019/10/23 全球购物
计算机网络毕业生自荐信
2013/10/01 职场文书
英语系毕业生自荐信
2013/10/31 职场文书
会计主管岗位职责范文
2013/11/08 职场文书
实习生自我评价
2014/01/18 职场文书
海洋科学专业求职信
2014/08/10 职场文书
最新离婚协议书范本
2014/08/19 职场文书
专业见习报告范文
2014/11/03 职场文书
酒店财务部岗位职责
2015/04/14 职场文书
JS实现简单控制视频播放倍速的实例代码
2021/04/18 Javascript
聊聊pytorch测试的时候为何要加上model.eval()
2021/05/23 Python
Python万能模板案例之matplotlib绘制甘特图
2022/04/13 Python