2018年9月4日 星期二

避免使用 Vue.js 的 DOM Templates

參考 Why You Should Avoid Vue.js DOM Templates

最近才開始學習使用 Vue,剛看到這篇文章,不懂它在說什麼,只知道在 Html 的 table 中,會將非 table 的內容,上移到 table 上方。在學習了 component 之後,終於理解它在說什麼了。

在 component 中,有幾種方式定義 template。最方便的,應該是使用 backtick (`) 來定義多行字串,不過,IE 10 不支援。我們無法強制要求使用者完全不用 IE 10,也不想辛苦的用 Javascript 的 string,因此只能選擇使用 x-template 或 DOM template。

其實,DOM template 也不是好選擇,因為在 IE 10 是不正常的,最後,只剩 x-template。關於不用 DOM template 的原因,一些測試和說明如下。

測試程式碼,如下

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Vue.js Template Test</title>
</head>
<body>
<div id="app">
    <template-test1></template-test1>
    <template-test2></template-test2>
</div>

<script type="text/javascript" src="vue_2.5.16.js"></script>

<script type="text/x-template" id="template-test1">
    <div>
        <h3>使用 x-template</h3>
        <table border="1">
            <component-test-sub
                    v-for="ri in 5"
                    v-bind:key="ri"
                    v-bind:ri="ri"
            />
        </table>
    </div>
</script>

<script>
    Vue.component('template-test1', {
        template: '#template-test1'
    });
</script>

<!-- Template 在瀏覽器應該不會顯示,但在 IE 10 會顯示 <h3> 的 title -->
<template id="template-test2">
    <div>
        <h3>使用 DOM template</h3>
        <table border="1">
            <tr is="component-test-sub"
                v-for="ri in 5"
                v-bind:key="ri"
                v-bind:ri="ri"
            ></tr>
        </table>
    </div>
</template>

<script>
    Vue.component('template-test2', {
        template: '#template-test2'
    });
</script>

<script type="text/x-template" id="test-sub-template">
    <tr>
        <td>Row {{ ri }}</td>
    </tr>
</script>

<script type="text/javascript">
    Vue.component('componentTestSub', {
        template: '#test-sub-template',
        props: {
            ri: Number  // row index
        }
    });

    new Vue({
        el: '#app'
    });
</script>
</body>
</html>



說明

使用 x-template,其 childNodes 只有一個,就是其中的全部內容。而使用 DOM template 時,瀏覽器會解析其內容,建立 DOM tree。

因此,使用 DOM template 時,在 <table></table> 中,不能直接使用 <component-test-sub />,也不允許 self closing。

沒有留言:

張貼留言

網誌存檔