VUE中的render函数

vue通过 template 来创建你的 HTML。但是,在特殊情况下,这种写死的模式无法满足需求,必须需要js的编程能力。此时,需要用render来创建HTML。
render方法的实质就是生成template模板;
通过调用一个方法来生成,而这个方法是通过render方法的参数传递给他的;
通过这三个参数,可以生成一个完整的模板
官网实例

//未使用render函数
Vue.component('anchored-heading', {
 template: '#anchored-heading-template',
 props: {
  level: {
   type: Number,
   required: true
  }
 }
})
 
//使用render函数
Vue.component('anchored-heading', {
 render: function (createElement) {
  return createElement(
   'h' + this.level,  // tag name 标签名称
   this.$slots.default // 子组件中的阵列
  )
 },
 props: {
  level: {
   type: Number,
   required: true
  }
 }
})

区别:

  • 没有显示的模板内容,而是通过render方法生成
  • 使用了createElement方法

createElement方法,通过render函数的参数传递进来,有三个参数

  • 第一个参数(必要参数):主要用于提供DOM的html内容,类型可以是字符串、对象或函数
  • 第二个参数(类型是对象,可选):用于设置这个DOM的一些样式、属性、传的组件的参数、绑定事件之类
  • 第三个参数(类型是数组,数组元素类型是VNode,可选):主要是指该结点下还有其他结点,用于设置分发的内容,包括新增的其他组件。注意,组件树中的所有VNode必须是唯一的

什么情况下适合使用render函数
在一次封装一套通用按钮组件的工作中,按钮有四个样式(success、error、warning、default)。首先,你可能会想到如下实现

<div class="btn btn-success" v-if="type === 'success'">{{ text }}</div>
<div class="btn btn-danger" v-else-if="type === 'danger'">{{ text }}</div>
<div class="btn btn-warning" v-else-if="type === 'warning'">{{ text }}</div>

这样写在按钮样式少的时候完全没有问题,但是试想,如果需要的按钮样式有十多个。那么template写死的方式就显得很无力了。遇上类似这样的情况,使用render函数可以说最优选择了。
首先render函数生成的内容相当于template的内容,故使用render函数时,在.vue文件中需要先把template标签去掉。只保留逻辑层。

export default {
 props: {
  type: {
   type: String,
   default: 'normal'
  },
  text: {
   type: String,
   default: 'normal'
  }
 },
 computed: {
  tag() {
   switch (this.type) {
    case 'success':
     return 1;
    case 'danger':
     return 2;
    case 'warning':
     return 3;
    default:
     return 1;
   }
  }
 },
 render(h) {
  return h('div', {
   class: {
    btn: true,
    'btn-success': this.type === 'success',
    'btn-danger': this.type === 'danger',
    'btn-warning': this.type === 'warning'
   },
   domProps: {
    innerText: this.text
   },
   on: {
    click: this.handleClick
   }
  });
 },
 methods: {
  handleClick() {
   console.log('-----------------------');
   console.log('do something');
  }
 }
};

使用jsx

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

render() {
 return (
  <div
   class={{
    btn: true,
    'btn-success': this.type === 'success',
    'btn-danger': this.type === 'danger',
    'btn-warning': this.type === 'warning'
   }}
   onClick={this.handleClick}>
   {this.text}
  </div>
 );
},
Vuerender 函数Vue 组件渲染的核心,通过 render 函数可以实现更加灵活的组件编写方式。下面是关于 Vuerender 函数的详细介绍: 1. 概念定义: Vuerender 函数是一个纯 JavaScript 函数,它接收一个 createElement 函数作为参数,用于生成虚拟 DOM,最终将组件渲染成 HTML。在 Vue 组件中,可以使用 render 函数来代替 template,这样可以更加灵活地渲染组件。 2. createElement 函数: createElement 函数Vue 中的一个工厂函数,用于快速创建虚拟 DOM 元素。createElement 函数接收三个参数,第一个参数是标签名或组件,第二个参数是属性对象,第三个参数是子节点。 使用 createElement 函数可以快速创建虚拟 DOM 元素,例如: ```javascript // 创建一个 div 元素 createElement('div', { class: 'wrapper' }, [ createElement('h1', {}, 'Hello Vue') ]) ``` 3. Vue 组件的 render 函数Vue 组件的 render 函数接收一个 createElement 函数作为参数,通过该函数创建虚拟 DOM 元素。在 render 函数中,通过编写 JavaScript 代码来生成 DOM 元素,可以使用条件判断、循环语句等,从而实现更加灵活的组件渲染。 例如,下面是一个简单的 render 函数: ```javascript render (createElement) { return createElement('div', { class: 'wrapper' }, [ createElement('h1', {}, 'Hello Vue') ]) } ``` 4. render 函数与 template 的对比: 相对于 template,render 函数的优点在于:可以使用 JavaScript 代码生成 DOM 元素,可以进行条件判断、循环语句等;可以实现更加灵活的组件开发;可以更好地控制组件的渲染流程。 相对于 template,render 函数的缺点在于:需要熟悉 JavaScript 语法和 createElement 函数;在实现复杂组件时,需要编写更多的代码。 5. render 函数和 JSX: JSX 是 Facebook 出品的一种语法扩展,可以在 JavaScript 中编写类似 HTML 的语言。与 render 函数类似,JSX 也是将组件编写成 JavaScript 代码的方式。 Vue 也支持 JSX 语法,Vue 的 JSX 实现是通过 Babel 插件实现的。使用 JSX 可以更加直观地编写组件,但需要熟悉 JSX 语法和相关工具的使用。 6. 总结: render 函数Vue 组件的核心,它通过 createElement 函数创建虚拟 DOM 元素,最终将组件渲染成 HTML。相对于 template,render 函数可以实现更加灵活的组件开发,但需要熟悉 JavaScript 语法和 createElement 函数。同时,Vue 也支持 JSX 语法,可以更加直观地编写组件。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值