vue渲染函数&JSX
Vue推荐在绝大多数情况下使用template来创建你的HTML。然而在一些场景中,你真的需要JavaScript的完全编程能力,这时你可以使用render函数,它比template跟接近编译器.
虚拟DOM
在深入渲染函数之前,了解一些浏览器的工作原理很重要。以下面这段HTML为例:
<div>
<h1>My title</h1>
Some text content
<!--TODO:添加标签行-->
</div>
当浏览器读到这些代码时,它会建立一个‘DOM节点树’来保持追踪,如同你会画一张家谱树来追踪家庭成员的发展一样。
HTML的DOM节点树如下图所示:

每个元素都是一个节点。每片文字也是一个节点。甚至注释也都是节点。一个节点就是页面的一个部分。就像家谱树一样,每个节点都可以有孩子节点(也就是说每个部分可以包含其它一些部分)。
高效的更新所有这些节点会是比较困难的,不过所幸你不必再手动完成这个工作了。你只需要告诉Vue你希望页面上的HTML是什么,这可以是在一个模板里:
<h1>{{blogTitle}}</h1>
或则一个渲染函数里:
render:function(createElement){
return createElement('h1',this.blogTitle);
}
在这两种情况下,Vue都会自动保持页面的更新,即便blogTitle发生了改变。
Vue通过建立一个虚拟DOM对真实的DOM发生的变化保持追踪。请仔细看这行代码:
return createElement('h1',this.blogTitle)
createElement到底返回什么呢?其实不是一个实际的Dom元素。它更准确的名字可能是createNodeDescription,因为它所包含的信息会告诉Vue页面上需要渲染什么样的节点,及其子节点。我们把这样的节点描述为虚拟节点,也常简写为VNode。虚拟DOM是我们对Vue组件树建立起来的整个VNode树的称呼。
createElement参数
createElement(
//{String|Object|Function}
//一个HTML标签字符串,组件选项对象,或则解析上述任何一种的一个async异步函数。必须参数。
'div',
//{Object}一个包含模板相关属性的数据对象,你可以在template中使用这些特性。可选参数。
{},
//{String|Array}子虚拟节点,由createElement()构建而成,也可以使用也可以使用字符串来生成文本虚拟节点。可选参数。
[
'先写一些文字',
createElement('h1','一则头条'),
createElement(Mycomponent,{
props:{
someProp:'foobar'
}
})
]
)
深入data对象
有一点要注意:正如在模板语法中,v-bind:class和v-bind:style,会被特别对待一样,在VNode数据对象中,下列属性名是级别最高的字段。该对象也允许你绑定普通的HTML特性,就像DOM属性一样,比如innnerHTML(这会取代v-html指令)。
{
//和v-bind:class一样的API,接收一个字符串、对象或字符串和对象组成的数组。
'class':{
foo:true,
bar:false
},
//和v-bind:style一样的API,接收一个字符串、对象或对象数组组成的数组
style:{
color:'red',
fontSize:'14px'
},
//普通的HTML特性
attrs:{
id:'foo'
},
//组件props
props:{
myPro:'bar'
},
//DOM属性
domProps:{
innerHTML:'baz'
},
//事件监听器基于'on',所以不再支持如v-on:keyup.enter修饰符,需要手动匹配keyCode.
on:{
click:this.clickHandler
},
//仅用于组件,用于监听原生事件,而不是组件内部使用,vm.$emit触发的事件。
nativeOn:{
click:this.nativeClickHandler
},
//自定义指令。注意,你无法对binding中的oldValue赋值,因为Vue已经自动为你进行了同步。
directives:[
{
name:'my-custom-directive',
value:'2',
expression:'1+1',
arg:'foo',
modifiers:{
bar:true
}
}
],
//作用域插槽格式,{name:props=>createElement('span',props.text)}
scopedSlots:{
default:props=>createElement('span',props.text)
},
//如果组件是其它组件的子组件,需要为插槽指定名称。
slot:'name-of-slot',
//其它特殊顶层属性
key:'myKey',
ref:'myRef',
//如果你在渲染函数中向多个元素都应用了相同的ref名,那么$refs.myRef会变成一个数组。
refInFor:true
}
完整示例
有了这些知识,我们现在可以完成我们最开始想实现的组件:
var getChildrenTextContent = function(children){
return children.map(function(node){
return node.children
?getChildrenTextContent(node.children)
:node.text
}).join('')
}
Vue.component('anchord-heading',{
render:function(createElement){
//创建kebab-case风格的ID
var headingId = getChildrenTextContent(this.$slots.default)
.toLowerCase()
.replace(/\W+/g,'-')
.replace(/(^\-|\-$)/g,'')
return createElement(
'h'+this.level,
[
createElement('a',{
attrs:{
name:headingId,
href:'#'+headingId
}
},this.$slots.default)
]
)
},
props:{
level:{
type:Number,
required:true
}
}
})
原文地址:https://segmentfault.com/a/1190000017354905
vue渲染函数&JSX的更多相关文章
- vue 渲染函数&jsx
前端更新状态,更新视图,所以性能问题主要由Dom操作引起的,而js解析编译dom渲染就要快得多, 所把要js和html混写. vue 的动态js操作 html 方法:reader函数: vue ...
- Vue.js 2.x render 渲染函数 & JSX
Vue.js 2.x render 渲染函数 & JSX Vue绝大多数情况下使用template创建 HTML.但是比如一些重复性比较高的场景,需要运用 JavaScript 的完全编程能力 ...
- Vue渲染函数
前面的话 Vue 推荐在绝大多数情况下使用 template 来创建HTML.然而在一些场景中,真的需要 JavaScript 的完全编程的能力,这就是 render 函数,它比 template 更 ...
- 从虚拟dom了解vue渲染函数
vue渲染函数就是render函数,他会返回一个VNode,VNode是一个js对象,是dom的映射 vue在介绍渲染函数那个章节看的不是很懂,所以想要彻底的理解渲染函数,首先需要了解vue的虚拟do ...
- vue从入门到进阶:渲染函数 & JSX(八)
Vue 推荐在绝大多数情况下使用 template 来创建你的 HTML.然而在一些场景中,你真的需要 JavaScript 的完全编程的能力,这就是 render 函数,它比 template 更接 ...
- Vue 渲染函数
Vue 推荐在绝大多数情况下使用模板来创建你的 HTML.然而在一些场景中,你真的需要 JavaScript 的完全编程的能力.这时你可以用渲染函数,它比模板更接近编译器. 一 项目结构 二 App组 ...
- 在vue中使用jsx语法
什么是JSX? JSX就是Javascript和XML结合的一种格式.React发明了JSX,利用HTML语法来创建虚拟DOM.当遇到<,JSX就当HTML解析,遇到{就当JavaScript解 ...
- Vue.js 渲染函数, JSX(未掌握,未学完)
渲染函数 , JSX(没完成学习) 基础: 实例属性:vm.$slots default 属性包括了所有没有被包含在具名插槽中的节点. 渲染函数: render: function(createEle ...
- Vue躬行记(7)——渲染函数和JSX
除了可通过模板创建HTML之外,Vue还提供了渲染函数和JSX,前者的编码自由度很高,后者对于开发过React的人来说会很熟悉.注意,Vue的模板最终都会被编译成渲染函数. 一.渲染函数 虽然在大部分 ...
随机推荐
- Luogu P2257 YY的GCD 莫比乌斯反演
第一道莫比乌斯反演...$qwq$ 设$f(d)=\sum_{i=1}^n\sum_{j=1}^m[gcd(i,j)==d]$ $F(n)=\sum_{n|d}f(d)=\lfloor \frac{N ...
- QDU-GZS与素数大法(素数筛法)
Description 自从GZS成为G神之后,追随者不计其数,更是有了大名鼎鼎的拜神论: "吾尝终日编程也,不如须臾之拜拜G神也:吾尝打字刷题也,不如一日三拜G神也: 拜拜G神,程序非长也 ...
- HttpServletRequest 和 HttpServletResponse
Servlet配置方式 全路径匹配 以 / 开始 /a /aa/bb localhost:8080/项目名称/aa/bb 路径匹配 , 前半段匹配 以 / 开始 , 但是以 * 结束 /a/* /* ...
- 算法设计与分析-HomeWork
ex1(p20) 代码如下: import random def Darts(n): k=0 i=1 while i<=n: x=random.uniform(0,1) #y=random.un ...
- 《java学习三》并发编程 -------线程池原理剖析
阻塞队列与非阻塞队 阻塞队列与普通队列的区别在于,当队列是空的时,从队列中获取元素的操作将会被阻塞,或者当队列是满时,往队列里添加元素的操作会被阻塞.试图从空的阻塞队列中获取元素的线程将会被阻塞,直到 ...
- css3的transform ,2D变换
transformtransform的中文翻译就是变换,改变,改观,转换的意思 在css中的主要作用就是对一个div或元素进行样式的改变. 他的属性(变换方式)有:平移,旋转,缩放,扭曲transla ...
- SpringBoot 数据库操作 增删改查
1.pom添加依赖 <!--数据库相关配置--> <dependency> <groupId>org.springframework.boot</groupI ...
- gitinore修改不生效
.gitignore只能忽略那些尚未被被track的文件,如果某些文件已经被纳入了版本管理中,则修改.gitignore是无效的.一个简单的解决方法就是先把本地缓存删除(改变成未track状态),然后 ...
- 工作方法-scrum+番茄工作法
1.产品和开发团队近期的工作分析和安排,使用scrum. 产品的工作:通过product backlog来列出 开发团队近期的工作安排:通过sprint backlog来列出,由个人认领,并估算(优先 ...
- (四)我的JavaScript系列:原型链
夜深风竹敲秋韵,万叶千声皆是恨. 原型链对于JavaScript来说是个很核心的概念.JavaScript不是基于类模板的面向对象语言:反而,它的面向对象机制是基于原型的.我们不可能说某个对象属于什么 ...