生成VNode对象

本文介绍了如何将使用vxe-table时遇到的HTML数组格式转换为VNode对象,以便实现表格拖拽功能。通过实例演示了Vue中VNode对象的创建和使用,解决实际项目中遇到的问题。

需求:使用vxe-table替换antd表格,实现表格拖拽功能。

问题:文档上一个函数返回了一个数组,里面是HTML代码。第一次遇见这种格式。就这样吧能运行就好。然后写完DEMO在向项目中移植的时候发现报错。

tableColumn: [
  {
     width: 60,
     slots: {
       default: () => {
         return [
           <span class="drag-btn">
              <i class="vxe-icon--menu"></i>
           </span>
         ]
     },
     header: () => {
       return [
         <vxe-tooltip content="按住后可以上下拖动排序!">
            <i class="vxe-icon--question"></i>
         </vxe-tooltip>
       ]
     }
  }
]

解决方案:查看文档需要返回一个String或者VNode[]

 

slots: {
   default: () => {
     let vm = new Vue();
     let h = vm.$createElement;
     let spanObj = h('span', {
       attrs: {
         class: 'drag-btn'
       }
     }, ['', h('i', {
        attrs: {
           class: 'vxe-icon--menu'
        }
     }, '')])
    }
}

参考文章:资料1、Vue中VNode对象创建方法

                  资料2、Vue里createElement 参数详解

 

在 Vue 3 中,**VNode(虚拟节点)** 是框架内部用于表示真实 DOM 结构的 JavaScript 对象。它作为真实 DOM 的抽象层,使得 Vue 能够在不直接操作 DOM 的情况下,通过比较新旧 VNode 来决定是否需要更新 DOM,从而提升性能和开发效率 [^1]。 ### VNode 的作用和优势 #### 1. 抽象表示 VNode 提供了对 DOM 的结构化描述,包括标签名、属性、子节点等内容。它通过 `tag`、`data`、`children`、`text` 等字段来表示 DOM 元素,使得 Vue 可以以统一的方式处理不同类型的节点 [^2]。 #### 2. 更新优化 当数据发生变化时,Vue 会重新生成新的 VNode,并使用 **Diff 算法** 比较新旧 VNode 之间的差异,最终通过 `patch()` 方法仅更新变更的部分,避免了重新渲染整个 DOM 树,从而显著提升性能 [^2]。 #### 3. 跨平台能力 VNode 作为抽象层,使得 Vue 能够基于相同的结构在不同环境中渲染,例如浏览器、Weex、Node.js 等,为跨平台开发提供了基础 [^2]。 ### VNode 的创建与使用 在 Vue 3 中,VNode 是通过 `_createVNode` 函数创建的,它是 Vue 渲染机制的核心函数之一。该函数负责将模板编译后的描述信息化为 VNode 对象,进而用于后续的渲染与更新 [^1]。 #### `_createVNode` 函数的作用 - 根据传入的标签名、数据对象、子节点等信息创建 VNode。 - 处理组件类型(如函数组件、类组件)的识别与封装。 - 支持创建不同类型的 VNode,如元素节点、文本节点、组件节点等。 #### 使用示例 ```javascript import { createVNode } from 'vue' const vnode = createVNode('div', { class: 'container' }, [ createVNode('p', null, 'Hello Vue') ]) ``` 上述代码创建了一个包含 `<p>` 子节点的 `<div>` 虚拟节点,结构如下: ```html <div class="container"> <p>Hello Vue</p> </div> ``` #### 渲染与更新流程 1. **渲染函数**:Vue 的 `render()` 函数会生成 VNode。 2. **初次渲染**:将 VNode 换为真实 DOM 并插入页面。 3. **数据变化**:当数据变化时,Vue 会重新生成新的 VNode。 4. **Diff 算法**:比较新旧 VNode 差异。 5. **最小更新**:通过 `patch()` 方法只更新发生变化的部分 [^2]。 ### VNode 与组件 在组件创建过程中,Vue 会创建组件类型的 VNode,这类 VNode 包含 `componentOptions` 参数,而 `children`、`text`、`elm` 等字段为空。这使得 Vue 在后续的渲染与更新中能够正确地处理组件的生命周期与嵌套结构 [^4]。 ### VNode 的可扩展性 VNode 作为抽象结构,为 Vue 提供了良好的可扩展性基础。例如: - 支持自定义指令绑定到 VNode 上。 - 插槽机制通过 VNode 的结构实现内容分发。 - 生命周期钩子可以通过 VNode 关联到对应的 DOM 元素 [^2]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值