首页 > 语言 > JavaScript > 正文

Vue render深入开发讲解

2024-05-06 15:20:00
字体:
来源:转载
供稿:网友

简介

在使用Vue进行开发的时候,大多数情况下都是使用template进行开发,使用template简单、方便、快捷,可是有时候需要特殊的场景使用template就不是很适合。因此为了很好使用render函数,我决定深入窥探一下。各位看官如果觉得下面写的有不正确之处还望看官指出,你们与我的互动就是写作的最大动力。

场景

官网描述的场景当我们开始写一个通过 level prop 动态生成 heading 标签的组件,你可能很快想到这样实现:

<script type="text/x-template" id="anchored-heading-template"> <h1 v-if="level === 1">  <slot></slot> </h1> <h2 v-else-if="level === 2">  <slot></slot> </h2> <h3 v-else-if="level === 3">  <slot></slot> </h3> <h4 v-else-if="level === 4">  <slot></slot> </h4> <h5 v-else-if="level === 5">  <slot></slot> </h5> <h6 v-else-if="level === 6">  <slot></slot> </h6></script>
Vue.component('anchored-heading', { template: '#anchored-heading-template', props: {  level: {   type: Number,   required: true  } }})

在这种场景中使用 template 并不是最好的选择:首先代码冗长,为了在不同级别的标题中插入锚点元素,我们需要重复地使用 <slot></slot>。

虽然模板在大多数组件中都非常好用,但是在这里它就不是很简洁的了。那么,我们来尝试使用 render 函数重写上面的例子:

Vue.component('anchored-heading', { render: function (createElement) {  return createElement(   'h' + this.level,  // tag name 标签名称   this.$slots.default // 子组件中的阵列  ) }, props: {  level: {   type: Number,   required: true  } }})

简单清晰很多!简单来说,这样代码精简很多,但是需要非常熟悉 Vue 的实例属性。在这个例子中,你需要知道当你不使用 slot 属性向组件中传递内容时,比如 anchored-heading 中的 Hello world!,这些子元素被存储在组件实例中的 $slots.default中。

createElement参数介绍

接下来你需要熟悉的是如何在 createElement 函数中生成模板。这里是 createElement 接受的参数:

createElement( // {String | Object | Function} // 一个 HTML 标签字符串,组件选项对象,或者 // 解析上述任何一种的一个 async 异步函数,必要参数。 'div', // {Object} // 一个包含模板相关属性的数据对象 // 这样,您可以在 template 中使用这些属性。可选参数。 {  // (详情见下一节) }, // {String | Array} // 子节点 (VNodes),由 `createElement()` 构建而成, // 或使用字符串来生成“文本节点”。可选参数。 [  '先写一些文字',  createElement('h1', '一则头条'),  createElement(MyComponent, {   props: {    someProp: 'foobar'   }  }) ])            
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

图片精选