3-解析template

509 阅读2分钟

Hi,我是Aben,连夜更新第三集,欢迎Star---》源代码仓库

在vue3的官网中对template进行这样的论述:

image-20210625181816970.png 在vue中 进行模板构建分为两种模式:1、使用script标签;2、使用template标签

1、使用script标签:通过设定type为"x-template“,将id与实例中的template设定为同一名称。其原理在vue官网中说明为:如果字符串以 # 开始,则它将被用作 querySelector,并使用匹配元素的 innerHTML 作为模板字符串。但是这种技巧在实际项目中并不合适,我们常常使用第二种办法。

<body>
    <div id="app"></div>
    <!-- 模板start -->
    <script type="x-template" id="why">
        <div>
            <h2>{{message}}</h2>
            <h2>{{counter}}</h2>
            <button @click='increment'>+1</button>
            <button @click='decrement'>-1</button>
        </div>
    </script>
    <!-- 模板end -->
    <script src="../js/vue.js"></script>
    <script>
        /*    document.querySelector("#why"); */
        Vue.createApp({
            template: "#why",
            data: function() {
                return {
                    message: "Hello World",
                    counter: 100
                }
            },
            methods: {
                increment() {
                    console.log("点击了+1");
                    this.counter++;
                },
                decrement() {
                    console.log("点击了-1");
                    this.counter--;
                }
            }
        }).mount('#app');
    </script>
</body>

2、使用template标签

image-20210625182537577.png

template标签可以被vue进行载入,但是最终其是被挂载在实例上,如以下代码通过template是只显示一次,而如果将template改为div,就会出现两次结果,而且第二次的message与counter还不会被绑定数值(如下图2-1效果所示),另一方面在vue2是规定只允许有一个根节点,而在vue3中对根节点并没有数目上的限制。

<body>
    <div id="app"></div>
    <template id="why">
      <div>
        <h2>{{message}}</h2>
        <h2>{{counter}}</h2>
        <button @click='increment'>+1</button>
        <button @click='decrement'>-1</button>
        <button @click='btnClick'>按钮</button>
        <button @click='btn2Click'>按钮2</button>
      </div>
    </template>
    <script src="../js/vue.js"></script>
    <script>
        Vue.createApp({
            template: '#why',
            data: function() {
                return {
                    message: "Hello World",
                    counter: 100
                }
            },
            // 定义各种各样的方法
            methods: {
                increment() {
                    console.log("点击了+1");
                    this.counter++;
                },
                decrement() {
                    console.log("点击了-1");
                    this.counter--;
                },
                btnClick: () => {
                    console.log(this);
                    /* 箭头函数this指向window */
                },
                btn2Click: function() {
                    console.log(this);
                    /* 普通函数指向Proxy*/
                }
            }
        }).mount('#app');
    </script>
</body>

image-20210625212427153.png

(图2-1)

另一方面,相信大家也会注意到vue中this指向问题,当我写下为箭头函数时this指向的是window而普通函数时this(button2)指向是Proxy,为什么会这样呢?我们下期来了解关于箭头函数与普通函数的知识,也会同大家一起聊聊this指向的问题。

image-20210625211413059.png

可以把脑子的文字转述出来对于我来说极其不容易,再加上今天已经更新了3篇文章了,另一方面也是以为本人才疏学浅,所以可能会有所纰漏,欢迎大家指正。下期再见!