Vue中render函数的使用方法

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])

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

您可能感兴趣的文章:

  • 如何理解Vue的render函数的具体用法
  • 深入理解vue Render函数
  • 了解VUE的render函数的使用
  • Vue2.x中的Render函数详解
(0)

相关推荐

  • 了解VUE的render函数的使用

    Vue 推荐在绝大多数情况下使用 template 来创建你的 HTML.然而在一些场景中,你真的需要 JavaScript 的完全编程的能力,这就是 render 函数,它比 template 更接近编译器. 在 HTML 层, 我们决定这样定义组件接口:通过传入不同的level 1-6 生成h1-h6标签,和使用slot生成内容 <div id="div1"> <child :level="1">Hello world!</chil

  • 如何理解Vue的render函数的具体用法

    本文介绍了如何理解Vue的render函数的具体用法,分享给大家,具体如下: 第一个参数(必须) - {String | Object | Function} <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>render</title> <script src="https://cdn.b

  • 深入理解vue Render函数

    最近在学习vue,正好今日留个笔记,我自己还在摸索学习中,现整理出来以作记录. 会使用基本的Render函数后,就会想,这怎么用 v-for/v-if/v-model;我写个vue Render函数进阶 首先是v-if 的转化使用全局组件的v 值决定组件渲染的状态,对实例中传递的props的"nnum"值得控制可以自如的切换两种状态显示.这样就是和v-if 一样使用组件了 <div id="app"> <mycom :v="nnum&qu

  • Vue2.x中的Render函数详解

    Render函数是Vue2.x版本新增的一个函数:使用虚拟dom来渲染节点提升性能,因为它是基于JavaScript计算.通过使用createElement(h)来创建dom节点.createElement是render的核心方法.其Vue编译的时候会把template里面的节点解析成虚拟dom: 什么是虚拟dom? 虚拟dom不同于真正的dom,它是一个JavaScript对象.当状态发生变化的时候虚拟dom会进行一个diff判断/运算:然后判断哪些dom是需要被替换的而不是全部重绘,所以性能

  • Vue中render函数的使用方法

    render函数 vue通过 template 来创建你的 HTML.但是,在特殊情况下,这种写死的模式无法满足需求,必须需要js的编程能力.此时,需要用render来创建HTML. 什么情况下适合使用render函数 在一次封装一套通用按钮组件的工作中,按钮有四个样式(default success error ).首先,你可能会想到如下实现 <div v-if="type === 'success'">success</div> <div v-else

  • 详解Django中 render() 函数的使用方法

    render() 函数 在讲 render() 函数之前,我们在 Django 项目 index 文件夹的 urls.py 和 views.py 中编写如下功能代码:(不难,望读者细心阅之) # index的 urls.py from django.urls import path form . import views urlpatterns = [ # 定义首页的路由 path(' ', views.index, name='index'), ] # index的views.py from

  • 简单谈一谈Vue中render函数

    目录 那如何证明? 如何解决? 那我们为什么不采用报错提示中的第二种方式引入完整的vue呢? 补充:vue2 小例子 总结: 首先我们引入的vue并不是一个完整的,而是残缺版的vue(没有模板解析器) 那如何证明? 翻译如下: 大概意思是说功能不全,没有模板解析器.并且提供建议给你:1.使用render函数 2.引入带有模板解析器的vue(完整的vue),那意思就是说vue并没有引入完整?为什么? 我们就需要去依赖的地方看看到底有没有完整引入.由于我们在引入的时候,地址直接写的就是vue,但是v

  • vue中render函数的使用详解

    render函数 vue通过 template 来创建你的 HTML.但是,在特殊情况下,这种写死的模式无法满足需求,必须需要js的编程能力.此时,需要用render来创建HTML. render方法的实质就是生成template模板: 通过调用一个方法来生成,而这个方法是通过render方法的参数传递给他的: 通过这三个参数,可以生成一个完整的模板 官网实例 //未使用render函数 Vue.component('anchored-heading', { template: '#anchor

  • vue iview组件表格 render函数的使用方法详解

    如果要在标签中加入属性,例如img 中src属性   a标签中href属性  此时需要用到 attrs 来加入而不是props { title: '操作', key: 'action', align: 'center', render: function (h, params) { return h('div', [ h('Button', { props: { type: 'primary', size: 'small' }, style: { marginRight: '8px' }, on

  • 浅谈Vue中render中的h箭头函数

    vue2.0新增了render方法,官方案例写的是: render: h=>h(app) 其中h是由createElement方法演变而来 render: function(createElement){ return createElement(app) } 用es6的写法就是:(只有一个个return语句,可以省略return和{}) render: createElement=>createElement(app) 将createElement改成 h 就是官方写法. 使用 h 的理由,

  • Vue 中使用 CSS Modules优雅方法

    CSS Modules:局部作用域 & 模块化 CSS Modules 为每一个局部类赋予全局唯一的类名,这样组件样式间就不会相互影响了.如: /* button.css */ .button { font-size: 16px; } .mini { font-size: 12px; } 它会被转换为类似这样: /* button.css */ .button__button--d8fj3 { font-size: 16px; } .button__mini--f90jc { font-size

  • vue 的 Render 函数

    目录 一.节点.树以及虚拟 DOM 二.虚拟 DOM 2.1 深入数据对象 2.2 约束 三.在Render函数中的模板功能 3.1 v-if 和 v-for 3.2 v-model 3.3 事件 & 按键修饰符 3.4 插槽 3.5 例子 一.节点.树以及虚拟 DOM <div> <h1>My title</h1> Some text content <!-- TODO: Add tagline --> </div> 每个元素都是一个节

  • vue中的使用token的方法示例

    初始于登录页面 Home.vue <template> <div class="home"> </div> </template> <script> // @ is an alias to /src import HelloWorld from '@/components/HelloWorld.vue' import axios from 'axios'; export default { name: 'home', comp

  • Vue中引入样式文件的方法

    一.在vue中使用scss 首先进行安装如下依赖: cnpm i sass-loader node-sass -D 二.vue中引入样式文件 1)在index.html模板html文件中引入,这种方式引入的原样编译在生成的html文件中,如果想要通过link引入外部的样式文件,建议使用这种方式: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>2imis&

随机推荐