vue render & JSX
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的更多相关文章
- 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 ...
- vue render里面的nativeOn
vue render里面的nativeOn的解释官方的解释是:// 仅对于组件,用于监听原生事件,而不是组件内部使用 `vm.$emit` 触发的事件. 官方的解释比较抽象 个人理解: 父组件要在子组 ...
- vue render function & dataset
vue render function & dataset https://vuejs.org/v2/guide/render-function.html#The-Data-Object-In ...
- vue render function
vue render function https://vuejs.org/v2/guide/render-function.html { // Same API as `v-bind:class`, ...
- vue render 渲染函数
vue render 渲染函数 经常看到使用render渲染函数的示例,而且在一些特殊情况下,确实更好使用,可以更加有效地细分组件,因而借助vue-element-admin来学习一波 render函 ...
- vue render html string
vue render html string shit element ui render string array relativeShowConvert(data) { // log(`data` ...
- vue render函数使用jsx语法 可以使用v-model语法 vuex实现数据持久化
render函数使用jsx语法: 安装插件 transform-vue-jsx 可以使用v-model语法安装插件 jsx-v-model .babelrc文件配置: vuex实现数据持久化 安装插 ...
- Vue render函数 函数时组件 jsx
常规组件使用 定义组件 components/list/list.vue <template> <ul> <li v-for="(item, index) in ...
- vue使用jsx/axios拦截器设置
最害怕的就是做过的事情,转几天又忘记了:写过的代码,也模模糊糊不知道哪里去了,所以告诉自己最好把每天遇到的问题记录下来,好,开始. 新公司要搭个vue后台框架,所以用了简简单单的 vue+iview+ ...
随机推荐
- maven建ssh项目的pom文件
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/20 ...
- 负载均衡之IP
文章出自:http://blog.csdn.net/cywosp/article/details/38036537 首先让我们来看看下面这张大家都非常熟悉的TCP/IP协议族的分层图: ...
- Php处理大文件-分割和合并
分割文件 /* * 分割文件 * 默认大小 2M=10485760/5 */ function file_split($file,$block_size=10485760/5) { $block_in ...
- python-socket1
如何理解socket编程 就是两个进程,跨计算机,他俩需要通讯的话,需要通过网络对接起来.这就是 socket 的作用.打个比方吧,两个进程在两个计算机上,需要有一个进程做被动方,叫做服务器.另一个做 ...
- struts2--Basic(一)
Struts是流行和成熟的基于MVC设计模式的WEB应用程序框架. 帮助我们减少在运用MVC设计模式来开发Web应用的时间. 1.下载添加jar包 2. 准备配置文件 web.xml <filt ...
- L104
marsh:It was like my own marsh country, flat and monotonous.The government will take more measures t ...
- 07 - Django应用第四步
知识点 1) 表单的编写 CSRF问题 forloop.counter 2) 视图函数的知识 GET和POST HttpResponseRedirect的使用 reverse的使用 3) 通用视图 C ...
- python suds 调用webservice 缓存
在linux系统中 如果webservice更新了字段 suds调用有可能缓存以前的字段或方法,对新的字段报找不到类型 TypeNotFound,或者对 新加的方法找不到该方法的错误. 当更新或添加w ...
- 趣味Shell
Richard M. Stallman大神是谁就不用说了,一时来了兴趣,想看看Linux系统下有多少程序有这位大神参与编写的. 先把所有命令导出到文件中,遍历所有命令,用man手册查一下并过滤Stal ...
- 不要试图用msvc来编译ffmpeg
出于学习目的,想建一个vs2010工程来编译ffmpeg(http://www.ffmpeg.org/),但是由于意义不大,并且工作量太大放弃了.原因如下: 1.一些unix平台相关的头文件.库的依赖 ...