vue在绝大多数使用template是没问题的,但在某些场合下,使用render更适合。

一、render函数

1.createElement 参数

createElement 可接受三个参数

1){String | Object | Function},一个 HTML 标签字符串,组件选项对象,或者函数,必选参数

2){Object},一个包含模板相关属性的数据对象可以在 template 中使用这些特性。可选参数

3){String | Array},子虚拟节点 (VNodes),由 `createElement()` 构建而成,也可以使用字符串来生成“文本虚拟节点”。可选参数

2.深入data对象

{
// 和`v-bind:class`一样的 API
// 接收一个字符串、对象或字符串和对象组成的数组
'class': {
foo: true,
bar: false
},
// 和`v-bind:style`一样的 API
// 接收一个字符串、对象或对象组成的数组
style: {
color: 'red',
fontSize: '14px'
},
// 普通的 HTML 特性
attrs: {
id: 'foo'
},
// 组件 props
props: {
myProp: 'bar'
},
// DOM 属性
domProps: {
innerHTML: 'baz'
},
// 事件监听器基于 `on`
// 所以不再支持如 `v-on:keyup.enter` 修饰器
// 需要手动匹配 keyCode。
on: {
click: this.clickHandler
},
// 仅用于组件,用于监听原生事件,而不是组件内部使用
// `vm.$emit` 触发的事件。
nativeOn: {
click: this.nativeClickHandler
},
// 作用域插槽格式
// { name: props => VNode | Array<VNode> }
scopedSlots: {
default: props => createElement('span', props.text)
},
// 如果组件是其他组件的子组件,需为插槽指定名称
slot: 'name-of-slot',
// 其他特殊顶层属性
key: 'myKey',
ref: 'myRef',
}

下面两段代码是一样的:

template代码

    <div>
<h1 class="myClass" title="学习render函数">学习render函数</h1>
<i style="color: #666">//</i>
</div>

render函数

render: function(createElement) {
return createElement('div', null, [
createElement('h1', {
class: 'myClass',
attrs: {
title: '学习render函数'
}
}, '学习render函数'),
createElement('i', {
style: 'color: #666'
}, '2019/02/15'),
]);
}

二、函数化组件

函数化组件是没有状态(响应式数据),没有实例(没有this,没有钩子函数)。函数式组件只是一个函数,所以渲染开销也低很多。

Vue.component('my-component', {
functional: true,
// Props 可选
props: {
// ...
},
// 为了弥补缺少的实例,提供第二个参数作为上下文
render: function (createElement, context) {
// ...
}
})

context包含以下属性

props:提供所有 prop 的对象
children: VNode 子节点的数组
slots: 返回所有插槽的对象的函数
data:传递给组件的数据对象,作为 createElement 的第二个参数传入组件
parent:父组件
listeners: (2.3.0+) 一个包含了所有在父组件上注册的事件侦听器的对象。这只是一个指向 data.on 的别名。
injections: (2.3.0+) 如果使用了 inject 选项,则该对象包含了应当被注入的属性。

例子:

export default {
functional: true,
props: {
foo: {
type: String,
default: 'foo'
}
},
render: function(createElement, context) {
return createElement('div', context.props.foo)
}
}

三、JSX语法和使用

用JSX语法写要比render函数简便,JSX 是一个看起来很像 XML 的 JavaScript 语法扩展。

1.表达式

JSX是支持表达式的,你需要将表达式写到{}内即可

<p>{ < ? 'true' : 'false'}</p>

2.指令

<input vModel="newTodoText" />
//有修饰符的指令
<input vOn:click_stop_prevent="newTodoText" />

3.组件

<MyComponent>hello</MyComponent>

4.属性

  return <input type="email" />

    //动态绑定
return <input
type="email"
placeholder={this.placeholderText}
/> const inputAttrs = {
type: 'email',
placeholder: 'Enter your email'
}
return <input {...{ attrs: inputAttrs }} />

5.class、style

可以是字符串、数组、对象,由花括号包裹着

//class
class={'myclass'}
class={['myclass']}
class={{'myclass': true}}
//style
style={{color: '#666'}}
style={[{color: '#666'}]}
style={'color: #333'}

6.数组

JSX 允许在模板中插入数组,数组会自动展开所有成员

        var arr = [
<p>p标签</p>,
<h1>h1标签</h1>
]
return (
<div>
{arr}
</div>
)

7.注释

注释需要写在花括号中

{/*注释...*/}

参考:

1.https://cn.vuejs.org/v2/guide/render-function.html

2.https://github.com/vuejs/jsx#installation

3.http://www.runoob.com/react/react-jsx.html

vue render & JSX的更多相关文章

  1. vue render & array of components & vue for & vue-jsx

    vue render & array of components & vue for & vue-jsx https://www.cnblogs.com/xgqfrms/p/1 ...

  2. vue render里面的nativeOn

    vue render里面的nativeOn的解释官方的解释是:// 仅对于组件,用于监听原生事件,而不是组件内部使用 `vm.$emit` 触发的事件. 官方的解释比较抽象 个人理解: 父组件要在子组 ...

  3. vue render function & dataset

    vue render function & dataset https://vuejs.org/v2/guide/render-function.html#The-Data-Object-In ...

  4. vue render function

    vue render function https://vuejs.org/v2/guide/render-function.html { // Same API as `v-bind:class`, ...

  5. vue render 渲染函数

    vue render 渲染函数 经常看到使用render渲染函数的示例,而且在一些特殊情况下,确实更好使用,可以更加有效地细分组件,因而借助vue-element-admin来学习一波 render函 ...

  6. vue render html string

    vue render html string shit element ui render string array relativeShowConvert(data) { // log(`data` ...

  7. vue render函数使用jsx语法 可以使用v-model语法 vuex实现数据持久化

    render函数使用jsx语法: 安装插件  transform-vue-jsx 可以使用v-model语法安装插件 jsx-v-model .babelrc文件配置: vuex实现数据持久化 安装插 ...

  8. Vue render函数 函数时组件 jsx

    常规组件使用 定义组件 components/list/list.vue <template> <ul> <li v-for="(item, index) in ...

  9. vue使用jsx/axios拦截器设置

    最害怕的就是做过的事情,转几天又忘记了:写过的代码,也模模糊糊不知道哪里去了,所以告诉自己最好把每天遇到的问题记录下来,好,开始. 新公司要搭个vue后台框架,所以用了简简单单的 vue+iview+ ...

随机推荐

  1. 分享知识-快乐自己:Liunx-大数据(Hadoop)初始化环境搭建

    大数据初始化环境搭建: 一):大数据(hadoop)初始化环境搭建 二):大数据(hadoop)环境搭建 三):运行wordcount案例 四):揭秘HDFS 五):揭秘MapReduce 六):揭秘 ...

  2. Silk codec的一些资料

    Skype表示它最近将开始向第三方开发人员和硬件制造商提供免版税认证(RF)的Silk宽带音频编码器. Silk下载地址如下 http://developer.skype.com/silk/SILK_ ...

  3. BestCoder Round #93 比赛记录

    机房又迎来了一次BC.大家都沸腾了... BC开场,大家全都瞬间开始 啪啦啪啦啪啦啪啦 都要赶紧水过第一题. 第一题明显直接贪心就好了,用map去重. 本人荣幸地第一个写完,提交 Wa. (崩溃的内心 ...

  4. 如何恢复,迁移,添加, 删除 Voting Disks

    如何恢复,迁移,添加, 删除 Voting Disks恢复流程 在11gR2 之前,我们可以直接直接使用dd命令对voting disk进行备份.DD示例 备份votedisk盘:[root@raw1 ...

  5. BZOJ4003:[JLOI2015]城池攻占

    浅谈左偏树:https://www.cnblogs.com/AKMer/p/10246635.html 题目传送门:https://lydsy.com/JudgeOnline/problem.php? ...

  6. Code:目录

    ylbtech-Code:目录 1.返回顶部 1. https://github.com/   2.返回顶部 1. https://gitee.com 2. 3.返回顶部   4.返回顶部   5.返 ...

  7. css3 利用perspective实现翻页效果和正方体 以及翻转效果

    要点: 1 实现3D效果就需要使用perspective属性 1 页面旋转使用css3的rorate 2 使用backface-visibility 实现正面元素翻转之后背面不可见,显示出反面的元素 ...

  8. qtp重定义数组大小

    a dim arr1() ) a  dim arr() ReDim arr(a) arr arr ) arr For each i in arr     print arr(i) Next

  9. paramiko使用1

  10. inner join ,left join ,right join区别

    inner join ,left join ,right join区别 left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录 right join(右联接) 返回包括右表中 ...