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. spring学习(2)

    理解反向控制(IOC) 依赖注入(di):比IOC更好地名字.获得依赖对象的方式反转了. IOC应用 IOC或者di,还可以达到解耦的目的. spring开发提倡接口编程,配合di技术,可以更好地达到 ...

  2. 前端框架之VUE

    vue学习[第1篇]:vue之指令 vue学习[第2篇]:es6简单介绍 vue学习[第3篇]:vue之node.js的简单介绍 vue学习[第4篇]:vue 之webpack打包工具的使用 vue学 ...

  3. php设计模式课程---4、观察者模式的好处是什么

    php设计模式课程---4.观察者模式的好处是什么 一.总结 一句话总结: 方便选择之后去控制监听的板块数:比如选择男士之后,我可以决定监听广告里面的第二和第三板块. 1.为什么有观察者模式? 错误理 ...

  4. DFS的简单应用(zoj2110,poj1562)

    zoj2110 简单的dfs应用,注意have数组的处理 #include<iostream> #include<cstdio> #include<cstdlib> ...

  5. google android sdk下载hoosts

    203.208.46.146 www.google.com #这行是为了方便打开Android开发官网 现在好像不VPN也可以打开 74.125.113.121 developer.android.c ...

  6. Gson小记

    Gson过滤字段,只要在字段前面添加“transient”关键字即可:之前就是因为Channel字段序列化的时候导致了stack over异常.

  7. Dockerfile创建MySQL容器

    本文目的是创建一个MySQL的image,并且在新创建出来的容器里自动启动mysql服务接受外部连接 步骤: 1. 首先创建一个目录并在目录下创建一个Dockerfile,文件内容如下 FROM ce ...

  8. 如何使用ODB(How to use odb On windows)

    1.下载ODB library:ODB Compiler,Common Runtime Library,Database Runtime Library. http://www.codesynthes ...

  9. POJ3468(树状数组区间维护)

    A Simple Problem with Integers Time Limit: 5000MS   Memory Limit: 131072K Total Submissions: 89818   ...

  10. phpMailer在CentOS 6.5下无法发送邮件的解决办法

    作者:ffsystem 网站在Windows平台上开发测试,完成了后同步到CentOS6.5 Nigix运行.发现phpMailer组件无法与SMTP服务器建立连接,导致无法发送邮件. 错误代码: p ...