is属性可以使html原生标签转化成vue组件

    1. <body>
    2. <script src='https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js'></script>
    3. <div id='myApp'>
    4. html标签结构中, 有一些特殊标签结构是不能正确渲染的,
    5. 例如: p标签中嵌套div, a标签中嵌套a标签, button嵌套button, tabel中嵌套非tr
    6. <p>p <div>div</div> </p>
    7. <a href="#">a1 <a href="#">a2</a> </a>
    8. <button>button1 <button>button2</button> </button>
    9. <table> <span>span</span> </table>
    10. 以上标签结构在渲染时,会产生结构错乱, 不按照书写的结构渲染, 详见查看器 <br>
    11. 所以如果子组件和父组件标签结构不匹配时,会造成渲染异常, 如下所示
    12. <table>
    13. <my-com v-for="item in 3"></my-com>
    14. </table>
    15. <!-- 此时我们把myCom中的根标签换成tr, tr依然被渲染到tabel外了,
    16. 原因: 标签渲染之前存在两个解析过程 1, 浏览器内核先把标签结构解析到缓存,再次过程中判断标签结构是否符合要求, 2, vue内核把组件结构解析成组件模板中的标签结构, 解析1早于解析2, 浏览器先把my-com移出tabel, 然后vuemy-com解析成tr -->
    17. <!-- 解决: tabel中暂时先写tr, 经过第一步解析,浏览器会把tr保留在tabel内, 第二步解析, vue内核会通过is属性把tr装化成目标组件myCom -->
    18. <table>
    19. <tr is="my-com" v-for="item in 3"></tr>
    20. </table>
    21. <div is="my-com"></div>
    22. </div>
    23. <!-- 组件模板 -->
    24. <template id='myTem'>
    25. <tr>
    26. <td>a</td>
    27. <td>b</td>
    28. <td>c</td>
    29. </tr>
    30. </template>
    31. <script>
    32. Vue.component('myCom', {
    33. template: '#myTem',
    34. data(){
    35. return{
    36. }
    37. }
    38. })
    39. new Vue({
    40. el: '#myApp',
    41. data: {
    42. },
    43. methods: {
    44. }
    45. })
    46. </script>
    47. </body>