Vue 的渲染方法中,“h”代表什么?

Avatar of Sarah Drasner
Sarah Drasner

DigitalOcean 为您旅程的每个阶段提供云产品。立即开始使用 200 美元的免费额度!

如果您使用 Vue 一段时间了,您可能遇到过这种渲染应用程序的方式——这是最新版本 CLI 中的默认方式,位于 main.js

new Vue({
 render: h => h(App)
}).$mount('#app')

或者,如果您使用渲染函数,可能是为了利用 JSX

Vue.component('jsx-example', {
  render (h) {
    return <div id="foo">bar</div>
  }
})

您可能想知道,h 是做什么的?它代表什么? h 代表 **hyperscript**。它是 HTML 的一种变体,HTML 代表超文本标记语言:由于我们正在处理脚本,因此在虚拟 DOM 实现中使用这种替换已成为惯例。此定义也出现在其他框架的文档中。例如,在 Cycle.js 中就是这样。

在这个问题中,Evan 描述道

Hyperscript 本身代表“生成 HTML 结构的脚本”

它被缩写为 h,因为更容易输入。他还在 Frontend Masters 上的高级 Vue 工作坊 中对其进行了更详细的描述。

实际上,您可以将其视为 createElement 的简写。以下是完整形式

render: function (createElement) {
  return createElement(App);
}

如果我们将其替换为 h,则首先得到

render: function (h) {
  return h(App);
}

…然后可以使用 ES6 缩写为

render: h => h (App)

Vue 版本最多可以接受三个参数

render(h) {
  return h('div', {}, [...])
}
  1. 第一个是元素的类型(此处显示为 div)。
  2. 第二个是数据对象。我们在这里嵌套一些字段,包括:props、attrs、dom props、class 和 style。
  3. 第三个是子节点数组。然后我们将进行嵌套调用,并最终返回一个虚拟 DOM 节点的树。

Vue 指南此处 中有更深入的信息。

名称 **hyperscript** 可能会让某些人感到困惑,因为 hyperscript 实际上是 一个库的名称(这些天没有更新),它实际上有一个 小型生态系统。 在这种情况下,我们并不是在谈论那个特定的实现。

希望这能为那些好奇的人澄清一些事情!