vue之 h() 函数

前言

Vue推荐在绝大数情况下使用模板来创建HTML,然后一些特殊的场景,你真的需要JavaScript的完全编程的能力,这个时候你可以使用渲染函数 ,它比模板更接近编译器;

h()函数是什么

Vue在生成真实的DOM之前,首先会将节点转换成VNode,而VNode组合在一起形成一颗树结构,就是虚拟DOM(VDOM),最后VDOM才渲染成真实的DOM;

如果我们直接编写生成vnode的代码,那效率会更高,这里就是h()函数。h函数也可以称为createVnode函数,用于创建 vnode 的一个函数

h()函数怎么用

h函数 接收三个参数。 例:()=>h('h1',{class="classsNmae"}, '大家好!')
第一个: 可以为一个html标签,一个组件,一个异步组件,或者是一个函数式组件。
第二个:{ Object } Props,与attributes和props,以及事件对应的对象,我们可以在模板中使用,如果没有需要传入的属性,可以设置为null。
第三个:{String | Object |Array}可以是字符串Text文本或者是h函数构建的对象再者可以是有插槽的对象。

代码例子:

  {
          label: t('components.SubTaskDetail.5q09prnzux41'),
          value: dataCheckDetail
            ? h(
                'div',
                null,
                h('div', { class: 'desc-value-row' }, [
                  h(
                    'div',
                    null,
                    t('components.SubTaskDetail.5q09xhsvcq44', {
                      totalDataSize: dataCheckData.value?.total || 0,
                      totalRowCount: dataCheckData.value?.totalRows || 0,
                      totalTableCount: dataCheckData.value?.tableCount || 0,
                      totalTableFinishCount:
                        dataCheckData.value?.completeCount || 0
                    })
                  ),
                  h(
                    'div',
                    { class: 'arco-tag arco-tag-checked speed-tag' },
                    t('components.SubTaskDetail.5q09xhsvcq45', {
                      avgSpeed: dataCheckData.value?.avgSpeed || 0
                    })
                  )
                ])
              )
            : t('components.SubTaskDetail.5q09prnznzg0'),
          span: 5
        }

//  "5q09prnzux41": "数据校验:",
//  "5q09xhsvcq44": "数据总量:{totalDataSize}MB,数据总行数:{totalRowCount}行,数据总表数:{totalTableCount}张,已完成表数:{totalTableFinishCount}张",
//  "5q09xhsvcq45": "平均校验速率:{avgSpeed}MB/s"


//:deep深度选择器
  :deep(.desc-value-row) {
    display: flex;
    align-items: center;
  }

  :deep(.speed-tag) {
    margin-left: 50px;
  }

效果: 

### Vue 3 中 `h` 函数的使用方法 #### 创建 VNode 的基本语法 在 Vue 3 中,`h` 是一个全局 API,用于创建虚拟 DOM 节点 (VNodes)[^1]。其基础签名如下: ```javascript const vnode = h(type, props?, children?) ``` - **type**: 可以为 HTML 标签名字符串、组件定义对象或其它返回 VNode 的函数。 - **props** *(可选)*: 包含属性的对象,如类名、样式、事件监听器等。 - **children** *(可选)*: 子节点可以是单个 VNode 或者一组子 VNodes。 #### 示例:简单创建一个 VNode 下面的例子展示了如何利用 `h` 来构建最简单的按钮元素并赋予点击行为: ```javascript import { h } from 'vue'; // 定义渲染函数 function renderButton() { return h('button', { onClick(event) { console.log('Button clicked!', event); } }, 'Click Me'); } ``` 此代码片段会生成 `<button>Click Me</button>` 这样的 HTML 结构,并为其绑定了一个点击处理程序。 #### 使用于组合式API中 当与 Composition API 结合时,可以在 setup 方法内部调用 `h()` 构建动态的内容或者条件性的界面部分[^2]: ```javascript export default { setup(props, context) { const count = ref(0); function incrementCounter() { count.value++; } return () => h( 'div', null, [ h('p', `Count is ${count.value}`), h('button', { onClick: incrementCounter }, '+') ] ); }, }; ``` 上述例子实现了计数器功能,每当按下 '+' 按钮时更新显示数值[^4]。 #### 插槽 Slot 和 `h` 函数一起工作 为了支持具名插槽和作用域插槽,在传递给 `h` 的第三个参数里还可以嵌套更复杂的结构来描述这些特性: ```javascript return h(MyComponent, {}, { header: () => h('header', 'This is a header'), footer: ({ msg }) => h('footer', `${msg}!`) }); ``` 这里假设 MyComponent 接受两个名为 `header` 和 `footer` 的插槽;第二个插槽还接收来自父级的数据作为参数。 #### 关联问题探讨 通过以上介绍可以看出,`h` 不仅限于直接操作DOM,它也是实现高级特性的桥梁之一,比如高阶组件(HOCs),这使得开发者能够更加灵活地控制应用的行为模式[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值