vue渲染函数&JSX

简介: Vue推荐在绝大多数情况下使用template来创建你的HTML。然而在一些场景中,你真的需要JavaScript的完全编程能力,这时你可以使用render函数,它比template跟接近编译器.虚拟DOM在深入渲染函数之前,了解一些浏览器的工作原理很重要。

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

相关文章
|
4月前
|
JavaScript 前端开发 算法
vue渲染页面的原理
vue渲染页面的原理
172 56
|
6月前
|
敏捷开发 人工智能 JavaScript
Figma-Low-Code:快速将Figma设计转换为Vue.js应用,支持低代码渲染、数据绑定
Figma-Low-Code 是一个开源项目,能够直接将 Figma 设计转换为 Vue.js 应用程序,减少设计师与开发者之间的交接时间,支持低代码渲染和数据绑定。
345 3
Figma-Low-Code:快速将Figma设计转换为Vue.js应用,支持低代码渲染、数据绑定
|
8月前
Vue3 项目的 setup 函数
【10月更文挑战第23天】setup` 函数是 Vue3 中非常重要的一个概念,掌握它的使用方法对于开发高效、灵活的 Vue3 组件至关重要。通过不断的实践和探索,你将能够更好地利用 `setup` 函数来构建优秀的 Vue3 项目。
|
8月前
|
监控 JavaScript 前端开发
Vue 异步渲染
【10月更文挑战第23天】Vue 异步渲染是提高应用性能和用户体验的重要手段。通过理解异步渲染的原理和优化策略,我们可以更好地利用 Vue 的优势,开发出高效、流畅的前端应用。同时,在实际开发中,要注意数据一致性、性能监控和调试等问题,确保应用的稳定性和可靠性。
|
9月前
|
JavaScript API
vue3知识点:ref函数
vue3知识点:ref函数
113 2
|
9月前
|
API
vue3知识点:reactive函数
vue3知识点:reactive函数
101 1
|
24天前
|
人工智能 JavaScript 算法
Vue 中 key 属性的深入解析:改变 key 导致组件销毁与重建
Vue 中 key 属性的深入解析:改变 key 导致组件销毁与重建
163 0
|
25天前
|
JavaScript UED
用组件懒加载优化Vue应用性能
用组件懒加载优化Vue应用性能
|
3月前
|
JavaScript
vue实现任务周期cron表达式选择组件
vue实现任务周期cron表达式选择组件
355 4
|
2月前
|
JavaScript 数据可视化 前端开发
基于 Vue 与 D3 的可拖拽拓扑图技术方案及应用案例解析
本文介绍了基于Vue和D3实现可拖拽拓扑图的技术方案与应用实例。通过Vue构建用户界面和交互逻辑,结合D3强大的数据可视化能力,实现了力导向布局、节点拖拽、交互事件等功能。文章详细讲解了数据模型设计、拖拽功能实现、组件封装及高级扩展(如节点类型定制、连接样式优化等),并提供了性能优化方案以应对大数据量场景。最终,展示了基础网络拓扑、实时更新拓扑等应用实例,为开发者提供了一套完整的实现思路和实践经验。
231 77