vue.js:<component:is ="comp-name"/>和<div:is ="comp-name"/>之间有什么区别?

tom*_*013 5 vue-component vuejs2

在vue中使用动态组件时,我们可以使用component或html标记,例如div标记名称:

<component :is="comp-name"></component>
Run Code Online (Sandbox Code Playgroud)

要么:

// assume that the root tag of comp-name is div
<div :is="comp-name"></div>
Run Code Online (Sandbox Code Playgroud)

那两种方式有什么区别?是相同的?

ghy*_*ybs 10

" is"属性不是特定于Vue的,它来自自定义元素规范.

另请参见什么是HTML"is"属性?

但显然Vue必须自己实现它的编译,模仿Custom Element规范.

在您显示的示例中,我想这无关紧要,因为在两种情况下,标记(<component><div>)都将被Vue组件实例替换.这是使用is属性在几个可能的组件("动态组件")之间切换的典型情况.

但是,当您尝试在某些HTML元素中使用自定义元素/ Vue组件(使用运行时编译)时,它会变得很重要,这些元素限制了它们可以拥有的子元素的类型,如Vue指南的DOM模板分析警告部分所述:

一些HTML元素,比如<ul>,<ol>,<table><select>什么元素可以在其内部出现有限制,以及一些元素,如<li>,<tr><option>只能出现某些其他元素中.

在这些情况下,is属性可能不会(仅)用于在动态组件之间切换,而是为了遵守HTML限制(为了避免浏览器对我们的自定义组件出现意外行为),同时仍然由我们的自定义组件替换它们.

这是一个快速演示<table>:

Vue.component('my-row', {
  template: '#my-row',
});

new Vue({
  el: '#app',
});
Run Code Online (Sandbox Code Playgroud)
td,
th {
  border: 1px solid black;
}
Run Code Online (Sandbox Code Playgroud)
<script src="https://unpkg.com/vue"></script>

<div id="app">
  <table id="table1">
    <tr>
      <th>Table</th>
      <td>1</td>
    </tr>
    <!-- Below Custom component will be stripped out of the table. Exact result may differ depending on browsers -->
    <my-row></my-row>
  </table>

  <hr />

  <table id="table2">
    <tr>
      <th>Table</th>
      <td>2</td>
    </tr>
    <!-- Valid TR row will be correctly replaced by Custom component -->
    <tr is="my-row"></tr>
  </table>
</div>

<template id="my-row">
  <tr>
    <th>Header</th>
    <td>Cell</td>
  </tr>
</template>
Run Code Online (Sandbox Code Playgroud)

结果:

  • 在Firefox,所述<my-row>标签被渲染外部上方<table>.
  • 同样在Chrome中.