Vue概念及常见命令介绍

Vue.js介绍


Vue.js是JavaScript MVVM(Model-View-ViewModel)库,十分简洁,Vue核心只关注视图层,相对AngularJS提供更加简洁、易于理解的API。Vue尽可能通过简单的API实现响应的数据绑定和组合的视图组件。

Vue和MVVM模式


MVVM模式即Model-View-ViewModel。Vue提供的核心是MVVM中的VM,即ViewModel。ViewModel负责连接View和Model,保证视图和数据的一致性。
Vue借鉴了AngularJS的directive和filter的概念,但是API相对简单易懂,而在整体也相对轻巧许多,Vue在组件化上与React概念很接近,可以定义可复用和嵌套的组件类,可以在模板中声明式的使用组件。
Vue是以数据为驱动的,Vue自身将DOM和数据进行绑定,一旦创建绑定,DOM和数据将保持同步,每当数据发生变化,DOM会跟着变化。
ViewModel是Vue的核心,它是Vue的一个实例。Vue实例时作用域某个HTML元素上的,这个HTML元素可以是body,也可以是某个id所指代的元素。
DOM Listeners和Data Bindings是实现双向绑定的关键。DOM Listeners监听页面所有View层DOM元素的变化,当发生变化,Model层的数据随之变化;Data Bindings监听Model层的数据,当数据发生变化,View层的DOM元素随之变化。

Vue.js特点

  • 简洁:页面由HTML模板+Json数据+Vue实例组成
  • 数据驱动:自动计算属性和追踪依赖的模板表达式
  • 组件化:用可复用、解耦的组件来构造页面
  • 轻量:代码量小,不依赖其他库
  • 快速:精确有效批量DOM更新
  • 模板友好:可通过npm,bower等多种方式安装,很容易融入

Vue.js入门小例子

声明式渲染

本例子由HTML模板(View)+Json数据(Model)+Vue实例(ViewModel)组成。
创建Vue的实例,需传入一个选项对象,如:数据、挂载元素、方法、模生命周期钩子等。本例子中,选项对象的el属性为#app,表示Vue实例挂载在<div id="app">...</div>元素上,data属性为exampleData,表示Model为exampleData。View中{{message}}是Vue的一种数据绑定语法,在运行时,{{message}}会被数据对象的message属性替换。

<!DOCTYPE html>
<html>
    <head>
        <title>声明式渲染</title>
        <meta charset="utf-8">
        <script src="https://unpkg.com/vue/dist/vue.js"></script>        
    </head>
    <body>
        <!-- View -->
        <div id="app">
            {{message}}
        </div>
        <script>
            //Model
            var exampleData = {
                message: 'Hello Vue!'
            }
            //ViewModel
            var app = new Vue({
                el: '#app',
                data: exampleData
            })
        </script>
    </body>
</html>

双向绑定

在Vue中使用v-model在表单元素上实现双向绑定。当在输入框输入的信息发生变化,<p>...</p>中的信息随之变化;当通过控制台中的Console,修改exampleData.message的值,输入框中的信息也随之变化。

<!DOCTYPE html>
<html lang="en">
    <head>
        <title>双向绑定</title>
        <meta charset="utf-8">
        <script src="https://unpkg.com/vue/dist/vue.js"></script>
    </head>
    <body>
        <!-- View -->
        <div id="app">
            <p>{{message}}</p>
            <input type="text" v-model="message">
        </div>
        <script>
            //Model
            var exampleData = {
                message: 'Hello Vue!'
            }
            //ViewModel
            var app = new Vue({
                el: '#app',
                data: exampleData
            })
        </script>
    </body>
</html>

运行截图:


更改exampleData.message

Vue.js常用指令

Vue指令以v-开头,作用在HTML元素上,将指令绑定在元素上时,会给绑定的元素添加一些特殊行为,可将指令视作特殊的HTML属性(attribute)。
下面将介绍Vue中常用的几个内置指令。当然,Vue除了内置指令,也可以根据需求自定义指令。

v-if指令

条件判断指令,根据表达式值的真假来插入或删除元素,表达式返回一个布尔值,语法如下:

v-if = "expression"

例子:
在本例中,表达式是yesno,和age>25yes的值为true,因此在HTML中显示该元素,其他同理。

<!DOCTYPE html>
<html lang="en">
    <head>
        <title>v-if指令</title>
        <meta charset="utf-8">
        <script src="https://unpkg.com/vue/dist/vue.js"></script>
    </head>
    <body>
        <div id="app">
            <h1 v-if="yes">Yes</h1>
            <h1 v-if="no">No</h1>
            <h1 v-if="age > 25">Age: {{age}}</h1>
        </div>
        <script>
            var app = new Vue({
                el: '#app',
                data: {
                    yes: true,//值为真,插入元素
                    no: false,//值为假,不插入元素
                    age: 28
                }
            })
        </script>
    </body>
</html>

运行截图:


v-show指令

条件渲染指令,与v-if不同的是,无论v-show的值为truefalse,元素都会存在于HTML代码中;而只有当v-if的值为true,元素才会存在于HTML代码中。v-show指令只是设置了元素CSS的style值。语法如下:

v-show = "expression"

例子:

<!DOCTYPE html>
<html lang="en">
    <head>
        <title>v-show指令</title>
        <meta charset="utf-8">
        <script src="https://unpkg.com/vue/dist/vue.js"></script>
    </head>
    <body>
        <div id="app">
            <h1 v-show="yes">Yes</h1>
            <h1 v-show="no">No</h1>
            <h1 v-show="age > 25">Age: {{age}}</h1>
        </div>
        <script>
            var app = new Vue({
                el: '#app',
                data: {
                    yes: true,//值为真
                    no: false,//值为假
                    age: 28
                }
            })
        </script>
    </body>
</html>

运行截图:


v-else指令

可配合v-if或v-show使用,v-else指令必须紧邻v-if或v-show,否则该命令无法正常工作。v-else绑定的元素能否渲染在HTML中,取决于前面使用的是v-if还是v-show。若前面使用的是v-if,且v-if值为true,则v-else元素不会渲染;若前面使用的是v-show,且v-show值为true,则v-else元素仍会渲染到HTML。

v-for指令

循环指令,基于一个数组渲染一个列表,与JavaScript遍历类似,语法如下:

v-for = "item in items"

例子:
在本例中,数组是todos,依次遍历数组todos中的每个元素,将text部分显示。

<!DOCTYPE html>
<html lang="en">
    <head>
        <title>v-for指令</title>
        <meta charset="utf-8">
        <script src="https://unpkg.com/vue/dist/vue.js"></script>
    </head>
    <body>
        <div id="app">
            <ol>
                <li v-for="todo in todos">{{todo.text}}</li>
            </ol>
        </div>
        <script>
            var app = new Vue({
                el: '#app',
                data: {
                    todos: [
                        {text: 'learn Javascript'},
                        {text: 'learn Vue'},
                        {text: 'learn ...'}
                    ]
                }
            })
        </script>
    </body>
</html>

运行截图:


在浏览器控制台里Console,输入app.todos.push({text: 'new item'}),则会插入新的一条信息。
运行截图:

v-bind指令

给DOM绑定元素属性,语法如下:

v-bind:argument="expression"

其中,argument通常是HTML元素的特性,如:v-bind:class="expression"
注:v-bind指令可以缩写为:冒号。如::class="expression"
例子:
在本例子中,当鼠标悬停在span标签的文字上时,会显示加载网页的时间。

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="utf-8">
        <script src="https://unpkg.com/vue/dist/vue.js"></script>
    </head>
    <body>
        <div id="app">
            <span v-bind:title="message">Hover your mouse over me</span>
        </div>
        <script>
            var app = new Vue({
                el: '#app',
                data: {
                    message: 'you loaded this page on ' + new Date()
                }
            })
        </script>
    </body>
</html>

v-on指令

用于监听DOM事件,语法与v-bind类似,如监听点击事件v-on:click="doSth"
注:v-on指令可以缩写为@符号。如:@click="dooSth"
例子:

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="utf-8">
        <script src="https://unpkg.com/vue/dist/vue.js"></script>
    </head>
    <body>
        <div id="app">
            <p><input type="text" v-model="message"></p>
            <p>
                <button v-on:click="greet">Greet</button>
            </p>
            <p>
                <button v-on:click="say('hello vue')">Hello</button>
            </p>
        </div>
        <script>
            var app = new Vue({
                el: '#app',
                data: {
                    message: 'Greet to Vue'
                },
                methods: {
                    greet: function(){
                        alert(this.message);
                    },
                    say: function(msg){
                        alert(msg);
                    }
                }
            })
        </script>
    </body>
</html>

运行结果:


一个综合性例子

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="utf-8">
        <script src="https://unpkg.com/vue/dist/vue.js"></script>
    </head>
    <body>
        <div id="app">
            <fieldset>
                <legend>Create New</legend>

                <label for="">Name:</label>
                <input type="text" v-model="newPerson.name">

                <label for="">Age:</label>
                <input type="text" v-model="newPerson.age">

                <label for="">Age:</label>
                <select name="" id="" v-model="newPerson.sex">
                    <option value="Male">Male</option>
                    <option value="Female">Female</option>
                </select>
    
                <button @click="createPerson">Create</button>
            </fieldset>
            <table>
                <tr>
                    <th>Name</th>
                    <th>Age</th>
                    <th>Sex</th>
                    <th>Delete</th>
                </tr>
                <tr v-for="person in people">
                    <td>{{person.name}}</td>
                    <td>{{person.age}}</td>
                    <td>{{person.sex}}</td>
                    <td><button @click="deletePerson($index)">Delete</button></td>
                </tr>
            </table>
        </div>
        <script>
            var app = new Vue({
                el: '#app',
                data: {
                    newPerson: {
                        name: '',
                        age: 0,
                        sex: 'Male'
                    },
                    people: [{
                        name: 'tyy',
                        age: 24,
                        sex: 'Male'
                    }, {
                        name: 'syd',
                        age: 24,
                        sex: 'Female'
                    }]
                },
                methods: {
                    createPerson: function(){
                        this.people.push(this.newPerson);
                        this.newPerson = {
                            name: '',
                            age: 0,
                            sex: 'Male'
                        }
                    },
                    deletePerson: function(index){
                        this.people.splice(index, 1);
                    }
                }
            })
        </script>
    </body>
</html>

运行截图:


参考链接

  1. Vue.js——60分钟快速入门
  2. 介绍Vue.js
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,607评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,047评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,496评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,405评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,400评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,479评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,883评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,535评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,743评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,544评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,612评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,309评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,881评论 3 306
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,891评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,136评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,783评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,316评论 2 342

推荐阅读更多精彩内容

  • 1.安装 可以简单地在页面引入Vue.js作为独立版本,Vue即被注册为全局变量,可以在页面使用了。 如果希望搭建...
    Awey阅读 10,981评论 4 129
  • 这篇笔记主要包含 Vue 2 不同于 Vue 1 或者特有的内容,还有我对于 Vue 1.0 印象不深的内容。关于...
    云之外阅读 5,044评论 0 29
  • Vue 实例 属性和方法 每个 Vue 实例都会代理其 data 对象里所有的属性:var data = { a:...
    云之外阅读 2,198评论 0 6
  • 版权归作者所有,任何形式转载请联系作者。作者:二小姐 入冬以来常常听到大家传“砖家”们说今年是最冷冬天。到现在为止...
    小菲菲菲儿阅读 206评论 0 0
  • 天丧脸,地哭情,泪雨哗哗淋。大禹治疾数千年,河道病不轻。 雷公吼,龙闹心,风狂啸啸鸣。小民活来万艰辛,苦累与谁听。...
    松风入骨阅读 274评论 82 68