Vue mustache语法

mustache语法

  Vue中的插值语法mustache本意为胡子,可能是{{}}长得像胡子吧。

  下面是对mustache插值语法一个最简单的使用。

  被管理元素会通过data属性拿到其中的数据对象。

<body>
    <main id="id-1">{{msg1}}</main>
</body>
<script src='https://cdn.jsdelivr.net/npm/vue/dist/vue.js'></script>
<script>
    "use strict";
    const v1 = new Vue({
        el: "#id-1",
        data: {
            msg1: "HELLO,WORLD",
        }
    })
</script>

数据继承

   被管理元素的子集元素都可以获取到被管理的父元素的数据对象。

   但是子元素的数据对象父元素不能获取到。

  Vue mustache语法

<body>
    <main id="id-1">
        {{msg2}}
        <section id="chilren-1">{{msg1}}</section>
    </main>
</body>
<script src='https://cdn.jsdelivr.net/npm/vue/dist/vue.js'></script>
<script>
    "use strict";
    const v1 = new Vue({
        el: "#id-1",
        data: {
            msg1: "爸爸的数据",
        }
    })
    const v2 = new Vue({
        el:"#chilren-1",
        data:{
            msg2:"儿子的数据",
        }
    })
</script>

四则渲染

   标签中的内容可以根据数据层中的数据进行四则渲染。

  Vue mustache语法

<body>
    <main id="id-1">
        <p>{{msg1 + msg2}}</p>
        <p>{{msg3 * 3}}</p>
    </main>
</body>
<script src='https://cdn.jsdelivr.net/npm/vue/dist/vue.js'></script>
<script>
    "use strict";
    const v1 = new Vue({
        el: "#id-1",
        data: {
            msg1: "HELLO",
            msg2: "WORLD",
            msg3: 10,
        }
    })
</script>

v-once

   当标签中添加该属性指令时,标签渲染的内容将是固定的不会再随着数据层数据的动态改变而进行改变。

  Vue mustache语法

<body>
    <main id="id-1">
        <!-- HELLOWORLD 不会变 -->
        <p v-once>{{msg1}}</p>
        <!-- 会变 -->
        <p>{{msg1}}</p>
    </main>
</body>
<script src='https://cdn.jsdelivr.net/npm/vue/dist/vue.js'></script>
<script>
    "use strict";
    const v1 = new Vue({
        el: "#id-1",
        data: {
            msg1: "HELLO WORLD",
        }
    })
</script>

v-html

   当标签中添加该属性指令时,该标签渲染的内容将会以HTML代码呈现。

   这会预防XSS攻击。

  注意,该属性指令应该通过等号绑定一个数据

  Vue mustache语法

<body>
    <main id="id-1">
        <p v-html="msg1"></p>
        <p>{{msg1}}</p>
    </main>
</body>
<script src='https://cdn.jsdelivr.net/npm/vue/dist/vue.js'></script>
<script>
    "use strict";
    const v1 = new Vue({
        el: "#id-1",
        data: {
            msg1: "<a href='www.google.com'>谷歌搜索</a>",
        }
    })
</script>

v-text

   这个属性指令和直接使用{{}}渲染内容无太大差异,不同的是这个是通过属性指令来进行渲染。

  注意,该属性指令应该通过等号绑定一个数据

  Vue mustache语法

<body>
    <main id="id-1">
        <p v-text="msg1"></p>
        <p>{{msg1}}</p>
    </main>
</body>
<script src='https://cdn.jsdelivr.net/npm/vue/dist/vue.js'></script>
<script>
    "use strict";
    const v1 = new Vue({
        el: "#id-1",
        data: {
            msg1: "HELLO,WORLD",
        }
    })
</script>

v-show

   该属性指令为false时将该标签将添加display:none的样式。

  Vue mustache语法

<body>
    <main id="id-1">
        <p v-show="conditionOne">display:block</p>
        <p v-show="conditionTwo">display:none</p>
    </main>
</body>
<script src='https://cdn.jsdelivr.net/npm/vue/dist/vue.js'></script>
<script>
    "use strict";
    const v1 = new Vue({
        el: "#id-1",
        data: {
            conditionOne: true,
            conditionTwo: false,
        }
    })
</script>

v-pre

   该属性指令会将标签中的内容按照原本格式进行呈现,类似于<pre>标签。

  Vue mustache语法

<body>
    <main id="id-1">
        <p v-pre>{{msg1}}</p>
        <p>{{msg1}}</p>
    </main>
</body>
<script src='https://cdn.jsdelivr.net/npm/vue/dist/vue.js'></script>
<script>
    "use strict";
    const v1 = new Vue({
        el: "#id-1",
        data: {
            msg1: "HELLO,WORLD",
        }
    })
</script>

v-cloak

   在网络情况较差的环境下,可能会出现模板渲染不及时的问题。

   使用v-cloak属性指令可挡住{{}}模板语法,使用户获得更好的体验。

  注意:需要手动添加样式

  Vue mustache语法

<style>
    [v-cloak]{
    	display: none;
    }
</style>

<body>
    <main id="id-1" v-cloak>
        <p>{{msg1}}</p>
        <p>{{msg1}}</p>
    </main>
</body>
<script src='https://cdn.jsdelivr.net/npm/vue/dist/vue.js'></script>
<script>
    "use strict";

    setTimeout(function(){
        const v1 = new Vue({
        el: "#id-1",
        data: {
            msg1: "HELLO,WORLD",
        }
    })
    },1000)
</script>

计算属性

   计算属性computed可以让标签内容渲染出极为复杂的数据。

   既然是属性,调用时就可以不加括号。

computed

   以下是计算属性的基本使用,我们需要计算出后端返回过来的数据,书的总价。

  computed内部其实是通过getttr实现的,所以不用加括号

  Vue mustache语法

<body>
    <main id="id-1">
        <div>书籍总价格:{{totalPrice}}</div>
    </main>
</body>
<script src='https://cdn.jsdelivr.net/npm/vue/dist/vue.js'></script>
<script>
    "use strict";
    const v1 = new Vue({
        el: "#id-1",
        data: {
            books: {
                "Vue实战": 128,
                "JavaScrip入门": 99,
                "HTML5初识": 87,
                "CSS3": 68,
            }
        },
        computed: {
            totalPrice() {
                return Object.values(this.books).reduce((prev, cur) => {
                    return prev + cur
                }, 0)
            }
        }
    })
</script>

methods

   对于上述需求,我们也可以用方法来完成,不同的是需要添加括号进行运行。

   这是methodscomputed一个最显著的区别。

  Vue mustache语法

<body>
    <main id="id-1">
        <div>书籍总价格:{{totalPrice}}</div>
        <div>书籍总价格:{{getTotaPrice()}}</div>
    </main>
</body>
<script src='https://cdn.jsdelivr.net/npm/vue/dist/vue.js'></script>
<script>
    "use strict";

    const v1 = new Vue({
        el: "#id-1",
        data: {
            books: {
                "Vue实战": 128,
                "JavaScrip入门": 99,
                "HTML5初识": 87,
                "CSS3": 68,
            }
        },
        computed: {
            totalPrice() {
                return Object.values(this.books).reduce((prev, cur) => {
                    return prev + cur
                }, 0)
            }
        },
        methods:{
            getTotaPrice(){
                return Object.values(this.books).reduce((prev, cur) => {
                    return prev + cur
                }, 0)
            }
        }
    })
</script>

缓存特性

   computed是具有缓存的,而methods则是没有缓存。

   如下示例,使用computed对多个标签进行渲染,发现只会运行一次。

   而使用methods的话则会运行多次。

  Vue mustache语法

  

<body>
    <main id="id-1">
        <div>书籍总价格:{{totalPrice}}</div>
        <div>书籍总价格:{{totalPrice}}</div>
        <div>书籍总价格:{{totalPrice}}</div>
        <div>书籍总价格:{{getTotaPrice()}}</div>
        <div>书籍总价格:{{getTotaPrice()}}</div>
        <div>书籍总价格:{{getTotaPrice()}}</div>
    </main>
</body>
<script src='https://cdn.jsdelivr.net/npm/vue/dist/vue.js'></script>
<script>
    "use strict";

    const v1 = new Vue({
        el: "#id-1",
        data: {
            books: {
                "Vue实战": 128,
                "JavaScrip入门": 99,
                "HTML5初识": 87,
                "CSS3": 68,
            }
        },
        computed: {
            totalPrice() {
                console.log("运行computed中的方法");
                return Object.values(this.books).reduce((prev, cur) => {
                    return prev + cur
                }, 0)
            }
        },
        methods:{
            getTotaPrice(){
                console.log("运行methods总的方法");
                return Object.values(this.books).reduce((prev, cur) => {
                    return prev + cur
                }, 0)
            }
        }
    })
</script>
上一篇:零基础IM开发入门(四):什么是IM系统的消息时序一致性?


下一篇:Jquery