render函数详解
Vue中的Render函数中有一个参数,这个参数是一个函数通常我们叫做h。其实这个h叫做createElement。Render函数将createElement的返回值放到了HTML中
createElement这个函数中有3个参数
第一个参数(必要参数):主要用于提供DOM的html内容,类型可以是字符串、对象或函数
第二个参数(类型是对象,可选):用于设置这个DOM的一些样式、属性、传的组件的参数、绑定事件之类
第三个参数(类型是数组,数组元素类型是VNode,可选):主要是指该结点下还有其他结点,用于设置分发的内容,包括新增的其他组件。注意,组件树中的所有VNode必须是唯一的
// @return {VNode} createElement( // {String | Object | Function} // 一个HTML标签字符串,组件选项对象,或者一个返回值类型为String/Object的函数。该参数是必须的 'div', // {Object} // 一个包含模板相关属性的数据对象,这样我们可以在template中使用这些属性,该参数是可选的。 { attrs: { name: headingId, href: '#'+headingId }, style: { color: 'red', fontSize: '20px' }, 'class': { foo: true, bar: false }, // DOM属性 domProps: { innerHTML: 'baz' }, // 组件props props: { myProp: 'bar' }, // 事件监听基于 'on' // 所以不再支持如 'v-on:keyup.enter' 修饰语 // 需要手动匹配 KeyCode on: { click: function(event) { event.preventDefault(); console.log(111); } } } // {String | Array} // 子节点(VNodes)由 createElement() 构建而成。可选参数 // 或简单的使用字符串来生成的 "文本节点"。 [ 'xxxx', createElement('h1', '一则头条'), createElement(MyComponent, { props: { someProp: 'xxx' } }), this.$slots.default ] )
什么时候用render函数?
假设我们要封装一套按钮组件,按钮有四个样式(success、error、warning、default)。首先,你可能会想到如下实现
<template> <divclass="btn btn-success"v-if="type === 'success'">{{ text }}</div> <divclass="btn btn-danger"v-else-if="type === 'danger'">{{ text }}</div> <divclass="btn btn-warning"v-else-if="type === 'warning'">{{ text }}</div> </template>
虽然我们这样实现没有问题,但是如果现在有十几个样式的情况下我们就需要写N多个判断,如果遇到了这种情况我们就可以选择使用render函数。
其实简单的来说就是template适合简单的组件封装,然后render函数适合复杂的组件封装
<script> Vue.component("A-button", { props: { type: { type: String, default: 'default' }, text: { type: String, default: '按钮' } }, computed: { tag() { switch(this.type) { case'success': return1; case'danger': return2; case'warning': return3; default: return1; } } }, render(h) { returnh('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 } }, this.$slots.default ); }, methods: { handleClick() { console.log('-----------------------'); console.log('li'); } } }) letvm=newVue({ el: "#app" }) </script>
template与render函数对比
template----html的方式做渲染
render----js的方式做渲染
render(提供)是一种编译方式
render里有一个函数h,这个h的作用是将单文件组件进行虚拟DOM的创建,然后再通过render进行解析。
h就是createElement()方法:createElement(标签名称,属性配置,children)
template也是一种编译方式,但是template最终还是要通过render的方式再次进行编译。
区别:
1、render渲染方式可以让我们将js发挥到极致,因为render的方式其实是通过createElement()进行虚拟DOM的创建。逻辑性比较强,适合复杂的组件封装。
2、template是类似于html一样的模板来进行组件的封装。
3、render的性能比template的性能好很多
4、render函数优先级大于template
案例一:template和render的方式渲染标题标签:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> </head> <body> <div id="app"> <h-title level="1">标题</h-title> <h-title level="2">标题</h-title> <h-title level="3">标题</h-title> </div> <script src="/UploadFiles/2021-04-02/vue.js">案例二:render方式模拟button:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <style> *{margin: 0;padding: 0;} .btn{ width: 80px; line-height: 40px; text-align: center; color:#fff; border-radius: 5px; background-color: #ccc; } .success{background-color: green;} .error{background-color: red;} .info{background-color: pink;} </style> </head> <body> <div id="app"> <wql-button type="success">成功</wql-button> <wql-button type="info">提示</wql-button> <wql-button type="error">报错</wql-button> <wql-button>默认</wql-button> </div> <script src="/UploadFiles/2021-04-02/vue.js">
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。
更新动态
- 小骆驼-《草原狼2(蓝光CD)》[原抓WAV+CUE]
- 群星《欢迎来到我身边 电影原声专辑》[320K/MP3][105.02MB]
- 群星《欢迎来到我身边 电影原声专辑》[FLAC/分轨][480.9MB]
- 雷婷《梦里蓝天HQⅡ》 2023头版限量编号低速原抓[WAV+CUE][463M]
- 群星《2024好听新歌42》AI调整音效【WAV分轨】
- 王思雨-《思念陪着鸿雁飞》WAV
- 王思雨《喜马拉雅HQ》头版限量编号[WAV+CUE]
- 李健《无时无刻》[WAV+CUE][590M]
- 陈奕迅《酝酿》[WAV分轨][502M]
- 卓依婷《化蝶》2CD[WAV+CUE][1.1G]
- 群星《吉他王(黑胶CD)》[WAV+CUE]
- 齐秦《穿乐(穿越)》[WAV+CUE]
- 发烧珍品《数位CD音响测试-动向效果(九)》【WAV+CUE】
- 邝美云《邝美云精装歌集》[DSF][1.6G]
- 吕方《爱一回伤一回》[WAV+CUE][454M]