• vue grammer one


    本文所有内容均来自 书籍《vue.js实战》

    完整代码请查看github

    v-model

    <!DOCTYPE html>
    <html>
    <head>
    	<meta charset="utf-8">
    	<title>Hello world</title>
    </head>
    <body>
    	<div id="app">
    		<input type="text" v-model="name" placeholder="your name">
    		<h1>Hello,{{ name }}</h1>
    	</div>
    	<script src="https://unpkg.com/vue/dist/vue.min.js"></script>
    	<script>
    		var app = new Vue({
    		<!-- #app为某个元素的id -->
    			el:'#app',
    			data: {
    				name: ''
    			}
    		})
    	</script>
    </body>
    </html>
    

    为缩减篇幅,本文后面所有代码 都只给出body标签内的内容

    v-html 、v-pre

    <div id="app">
        <span v-html="link"></span>
    </div>
    <script src="https://unpkg.com/vue/dist/vue.min.js"></script>
    <script>
        var app = new Vue({
            el:'#app',
            data: {
                link: '<a href="#">这是一个链接</a>'
            }
        })
    </script>
    
    <div id="app">
        <span v-pre>{{只为显示双大括号}}</span>
    </div>
    <script src="https://unpkg.com/vue/dist/vue.min.js"></script>
    <script>
        var app = new Vue({
            el:'#app',
            data: ''
        })
    </script>
    

    三元运算符,四则运算

    <div id="app">
        <!-- Vue .js 只支持单个表达式,不支持语句和流控制 -->
        {{ number / 10 }}
        {{ isOK ? 'Y' : 'N' }}
        {{ text.split(',').reverse().join(',') }}
    </div>
    <script src="https://unpkg.com/vue/dist/vue.min.js"></script>
    <script>
        var app = new Vue({
            el:'#app',
            data: {
                number: 100,
                isOK: false,
                text: '123,456'
            }
        })
    </script>
    

    过滤器

    <div id="app">
        {{ date | formatDate}}<!-- 使用过滤器格式化时间 -->
    </div>
    <script src="https://unpkg.com/vue/dist/vue.min.js"></script>
    <script>
        var padDate = function(value) {
            return value < 10 ? '0' + value : value 
        };
        var app = new Vue({
            el:'#app',
            data: {
                date : new Date()
            },
            filters: {
                formatDate: function(value) {
                    var date = new Date(value);
                    var year = date.getFullYear();
                    var month = padDate(date.getMonth()+1);
                    var day = padDate(date.getDate());
                    var hours = padDate(date.getHours());
                    var minutes = padDate(date.getMinutes());
                    var seconds = padDate(date.getSeconds());
                    return year + '-' + month + '-' + day + ' ' + hours + ':' + minutes + ':' + seconds
                }
            },
            mounted: function() {
                var _this = this;// 声明一个变量指向Vue实例this,保证作用域一致
                this.timer = setInterval(function() {
                    _this.date = new Date(); // 修改数据
                }, 1000);
            },
            beforeDestroy: function() {
                if(this.timer) {
                    clearInterval(this.timer);
                }
            }
        })
    </script>
    

    过滤器应当用于处理简单的文本转换,如果要实现更为复杂的数据变换,应该使用计算属性

    v-bind

    <div id="app">
        <a v-bind:href="url">链接</a>
        <img v-bind:src="imgUrl">
    </div>
    <script src="https://unpkg.com/vue/dist/vue.min.js"></script>
    <script>
        var app = new Vue({
            el:'#app',
            data: {
                url : 'https://www.github.com',
                imgUrl : 'https://gitee.com/jack541/repo-for-pic-go/raw/master/img/image-20220102162032176.png'
            }
        })	
    </script>
    

    以下两句等效:

    <a v-bind:href="url">链接</a>

    <a :href="url">链接</a>

    v-on

    <div id="app">
        <p v-if="show">这是一段文本</p>
        <button v-on:click="handleClose">点击隐藏</button>
    </div>
    <script src="https://unpkg.com/vue/dist/vue.min.js"></script>
    <script>
        var app = new Vue({
            el:'#app',
            data: {
                show : true
            },
            methods: {
                handleClose: function(){
                    if (this.show == true)
                        this.show = false;
                    else 
                        this.show = true;
                }
            }
        })	
    </script>
    

    以下两句等效:

    <button v-on:click="handleClose">点击隐藏</button>

    <button @click="handleClose">点击隐藏</button>

    computed属性用法

    <div id="app">
        {{ reversedText }}
    </div>
    <script src="https://unpkg.com/vue/dist/vue.min.js"></script>
    <script>
        var app = new Vue({
            el:'#app',
            data: {
                text: '123,456'
            },
            computed: {
                reversedText: function() {
                    return this.text.split(',').reverse().join(',');
                }
            }
        })	
    </script>
    
    <div id="app">
        总价:{{ prices }}
    </div>
    <script src="https://unpkg.com/vue/dist/vue.min.js"></script>
    <script>
        var app = new Vue({
            el:'#app',
            data: {
                package1: [
                    {
                        name: 'iPhone 13 128G',
                        price: 5999,
                        count: 3
                    },{
                        name: 'iPad mini6',
                        price: 3799,
                        count: 5
                    }
                ],
                package2: [
                    {
                        name: 'iPhone 13 pro 256G',
                        price: 8999,
                        count: 3
                    },{
                        name: 'Mac Pro intel i9 1TB SDD 32G RAM',
                        price: 21999,
                        count: 1
                    }
                ]
            },
            computed: {
                prices : function() {
                    var prices = 0;
                    for (var i = 0; i < this.package1.length; i++) {
                        prices += this.package1[i].price * this.package1[i].count;
                    }
                    for (var i = 0; i < this.package2.length; i++) {
                        prices += this.package2[i].price * this.package2[i].count;
                    }
                    return prices;
                }
            }
        })	
    </script>
    

    setter getter

    <div id="app">
        姓名:{{ fullName }}
    </div>
    <script src="https://unpkg.com/vue/dist/vue.min.js"></script>
    <script>
        var app = new Vue({
            el:'#app',
            data: {
                firstName: 'jack',
                lastName: 'green'
            },
            computed: {
                fullName: {
                    //getter 用于读取
                    get: function () {
                        return this.firstName + ' ' + this.lastName;
                    },
                    // setter 写入时出发
                    set: function (newValue) {
                        var names = newValue.split(' ');
                        this.firstName = names[0];
                        this.lastName = names[names.length - 1];
                    } 
                }
            }
        })	
    </script>
    

    计算缓存

    计算属性是基于它的依赖缓存的。 一个计算属性所依赖的数据发生变化时,它才会重新取值。

    <div id="app">
        <!-- 注意,这里的 reversedText是方法,所以要带()-->
        {{ reversedText() }}
    </div>
    <script src="https://unpkg.com/vue/dist/vue.min.js"></script>
    <script>
        var app = new Vue({
            el:'#app',
            data: {
                text: '123,456'
            },
            methods: {
                reversedText: function() {
                    return this.text.split(',').reverse().join(',');
                }
            }
        })	
    </script>
    

    使用 v-bind切换class属性

    <div id="app">
        <div :class="{ 'active': isActive, 'error': isError }"></div>
    </div>
    <script src="https://unpkg.com/vue/dist/vue.min.js"></script>
    <script>
        var app = new Vue({
            el:'#app',
            data: {
                isActive: true,
                isError: false
            }
        })	
    </script>
    

    :class 的表达式过长或逻辑复杂时,还可以绑定一个计算属性,这是一种很友好和常见的用法,一般当条件多于两个时,都可以使用data 或computed。

    <div id="app">
        AA<div :class="classes"></div>
    </div>
    <script src="https://unpkg.com/vue/dist/vue.min.js"></script>
    <script>
        var app = new Vue({
            el:'#app',
            data: {
                isActive: true,
                error: null
            },
            computed: {
                classes: function() {
                    return {
                        active: this.isActive && !this.error,
                        'text-fail': this.error && this.error.type === 'fail'
                    }
                }
            }
        })	
    </script>
    

    数组语法

    • data 定义
    <div id="app">
        <div :class="[{ 'active' : isActive }, errorCls]"></div>
    </div>
    <script src="https://unpkg.com/vue/dist/vue.min.js"></script>
    <script>
        var app = new Vue({
            el:'#app',
            data: {
                isActive: true,
                errorCls: 'error'
            },
        })	
    </script>
    
    • computed定义
    <div id="app">
        <button :class="classes"></button>
    </div>
    <script src="https://unpkg.com/vue/dist/vue.min.js"></script>
    <script>
        var app = new Vue({
            el:'#app',
            data: {
                size: 'large',
                disabled: true
            },
            computed: {
                classes: function() {
                    return [
                        'btn',
                        {
                        // 定义btn大小,不为空的时候就为size的尺寸
                            ['btn-' + this.size]: this.size != '',
                        // 定义button是否可用
                            ['btn-disabled']: this.disabled
                        }
                    ]
                }
            }
        })	
    </script>
    

    NOTES: 使用计算属性给元素动态设置类名,在业务中经常用到,尤其是在写复用的组件时,所以在开发过程中,如果表达式较长或逻辑复杂,应该尽可能地优先使用计算属性。

    绑定style

    <div id="app">
        <div :style="styles">文本</div>
        <!-- 应对多个对象时可以使用数组语法 styleA相当于一个data中的styles元素 -->
        <!-- <div :style="[styleA, styleB] " >文本</d iv> -->
    </div>
    <script src="https://unpkg.com/vue/dist/vue.min.js"></script>
    <script>
        var app = new Vue({
            el:'#app',
            data: {
                styles :{
                    color: 'red',
                    fontSize: 14+'px'
                }
            }
        })	
    </script>
    

    在实际业务中,: style 的数组语法并不常用,因为往往可以写在一个对象里面;而较为常用的应当是计算属性。

    v-cloak

    <div id="app" v-cloak>
        {{ message }}
    </div>
    <script src="https://unpkg.com/vue/dist/vue.min.js"></script>
    <script>
        var app = new Vue({
            el:'#app',
            data: {
                message: '页面正在加载中……'
            }
        });
    
    </script>
    

    v-once

    作用是定义它的元素或组件只渲染一次,包括元素或组件的所有子节点。

    <div id="app">
        <span v-once> {{ message }}</span>
        <div v-once>
            <span> {{ message }} </span>
        </div>
    </div>
    <script src="https://unpkg.com/vue/dist/vue.min.js"></script>
    <script>
        var app = new Vue({
            el:'#app',
            data: {
                message: '这是一段文本'
            }
        })
    </script>
    

    v-if v-else-if v-else

    <div id="app">
        <p v-if="status === 1"> 当status为1时显示该行</p>
        <p v-else-if="status === 2"> 当status为2时显示该行</p>
        <p v-else>否则显示该行</p>
    </div>
    <script src="https://unpkg.com/vue/dist/vue.min.js"></script>
    <script>
        var app = new Vue({
            el:'#app',
            data: {
                status: 1
            }
        })
    </script>
    

    v-else-if 要紧跟v-if, v-else 要紧跟v-else-if 或v-if, 表达式的值为真时,当前元素/组件及所
    有子节点将被渲染,为假时被移除

    template 复用元素

    <div id="app">
        <template v-if="type === 'name'">
            <label>用户名:</label>
            <input placeholder="输入用户名">
        </template>
        <template v-else>
            <label>邮箱:</label>
            <input placeholder="输入邮箱">
        </template> 
        <button @click="handleToggleClick">切换输入类型</button>
    </div>
    <script src="https://unpkg.com/vue/dist/vue.min.js"></script>
    <script>
        var app = new Vue({
            el:'#app',
            data: {
                type: 'name'
            },
            methods: {
                handleToggleClick: function () {
                    this.type = this.type === 'name' ? 'mail' : 'name';
                }
            }
        })
    </script>
    

    如果不希望复用input框,可以使用Vue.js 提供的key 属性,它可以让你自己决定是否要复用元
    素, key 的值必须是唯一的。

    <template v-if="type === 'name'">
        <label>用户名:</label>
        <input placeholder="输入用户名" key="name-input">
    </template>
    <template v-else>
        <label>邮箱:</label>
        <input placeholder="输入邮箱" key="mail-input">
    </template>
    

    v-show

    <div id="app">
        <p v-show="status === 1">当status为1时显示该行</p>
    </div>
    <script src="https://unpkg.com/vue/dist/vue.min.js"></script>
    <script>
        var app = new Vue({
            el:'#app',
            data: {
                status: 2
            }
        })
    </script>
    

    v-show 不能在<template>上使用。

    若表达式v-if初始值为false, 则一开始元素/组件并不会渲染,只有当条件第一次变为真时才开始编译。而v-show 只是简单的CSS属性切换,无论条件真与否,都会被编译。相比之下, v-if 更适合条件不经常改变的场景,因为它切换开销相对较大, 而v-show 适用千频繁切换条件。

    v-for

    <div id="app">
        <ul>
            <li v-for="book in books">{{ book.name }}</li>
            <!-- <li v-for="book of books">{{ book.name }}</li> -->
        </ul>
    </div>
    <script src="https://unpkg.com/vue/dist/vue.min.js"></script>
    <script>
        new Vue({
            el: '#app',
            data: {
                books: [
                    {name : '《Vue.js实战》'},
                    {name : '《JavaScript 语言精粹》'},
                    {name : '《JavaScript 高级程序设计》'}
                ]
            }
        })
    </script>
    
    

    参考文献:书籍《vue.js实战》

    转载请注明 原文地址

  • 相关阅读:
    Visual Studio color schemes
    WebForm服务器验证控件与前端js自定义验证共同使用
    Powerdesigner设计表生成SQL脚本(带有注释)
    JS日期格式化
    C# 生成小于Int数值绝对值的随机数
    LINQ解析
    Could not calculate build plan:
    Maven Tomcat webapp
    用JS来改变CSS样式
    安装 groovy eclipse 插件
  • 原文地址:https://www.cnblogs.com/whalefall541/p/15759972.html
Copyright © 2020-2023  润新知