一、ViewModel是Vue.js的核心,他是一个Vue实例。Vue实例是做用于摸一个html元素上的,这个元素能够是html的body元素,也能够是指定了ID的某个元素。 二、当建立了ViewModel后,双向绑定时如何的达成的? ViewModel中有两个在此咱们看作两个插件(Dom Listeners和Data Bindings)而他们是实现双向绑定的关键 三、从View一侧看,viewModel中的DOM Listener会检测页面上DOM元素的变化,若是有变化,则更改Model上的数据 四、从Model一侧看,当咱们更新Model数据时,Data Binddings会帮咱们更新页面中的DOM元素
<!DOCTYPE html>
使用Vue的过程就是定义MVVM各个组成部分的过程的过程。 一、定义View 二、定义Model 三、建立一个Vue实例或"ViewModel",它用于链接View和Model 四、文本插值{{}} 运行时{{ message }}会被数据对象的message属性替换
MVVM自己是实现了双向绑定的,在Vue.js中可使用v-model指令在表单元素上建立双向数据绑定 <!--这是View--> <div id="app"> <p>{{ message }}</p> <input type="text" v-model="message"/> </div> 将message绑定到文本框,当更改文本框的值时,<p>{{ message }}</p> 中的内容也会被更新。 相反,,若是改变message的值,文本框的值也会被更新
一、什么是指令? Vue.js的指令是以v-开头的,它们做用于HTML元素,指令提供了一些特殊的特性,将指令绑定在元素上时,指令会为绑定的目标元素添加一些特殊的行为,咱们能够将指 令看做特殊的HTML特性(attribute)。 二、经常使用的内置指令 v-if指令 v-show指令 v-else指令 v-for指令 v-bind指令 v-on指令 自定义指令
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> </head> <body> <div id="app"> <h1>Hello, Vue.js!</h1> <h1 v-if="yes">Yes!</h1> <h1 v-if="no">No!</h1> <h1 v-if="age >= 25">Age: {{ age }}</h1> <h1 v-if="name.indexOf('jack') >= 0">Name: {{ name }}</h1> </div> </body> <script src="js/vue.js"></script> <script> var vm = new Vue({ el: '#app', data: { yes: true, no: false, age: 28, name: 'keepfool' } }) </script> </html> 运行结果: HELLO,,vue.js yes age:28 分析: 数据的yes属性为true,因此"Yes!"会被输出; 数据的no属性为false,因此"No!"不会被输出; 运算式age >= 25返回true,因此"Age: 28"会被输出; 运算式name.indexOf('jack') >= 0返回false,因此"Name: keepfool"不会被输出。
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> </head> <body> <div id="app"> <h1>Hello, Vue.js!</h1> <h1 v-show="yes">Yes!</h1> <h1 v-show="no">No!</h1> <h1 v-show="age >= 25">Age: {{ age }}</h1> <h1 v-show="name.indexOf('jack') >= 0">Name: {{ name }}</h1> </div> </body> <script src="js/vue.js"></script> <script> var vm = new Vue({ el: '#app', data: { yes: true, no: false, age: 28, name: 'keepfool' } }) </script> </html> 运行结果: HELLO,vue.js yes age:28 分析:不符合条件的会自动设置css属性display:none样式,可是会显示在页面上
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> </head> <body> <div id="app"> <h1 v-if="age >= 25">Age: {{ age }}</h1> <h1 v-else>Name: {{ name }}</h1> <h1>---------------------分割线---------------------</h1> <h1 v-show="name.indexOf('keep') >= 0">Name: {{ name }}</h1> <h1 v-else>Sex: {{ sex }}</h1> </div> </body> <script src="js/vue.js"></script> <script> var vm = new Vue({ el: '#app', data: { age: 28, name: 'keepfool', sex: 'Male' } }) </script> </html> 解析: v-else元素是否渲染在HTML中,取决于前面使用的是v-if仍是v-show指令。 这段代码中v-if为true,后面的v-else不会渲染到HTML;v-show为tue,可是后面的v-else仍然渲染到HTML了。
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> <link rel="stylesheet" href="styles/demo.css" /> </head> <body> <div id="app"> <table> <thead> <tr> <th>Name</th> <th>Age</th> <th>Sex</th> </tr> </thead> <tbody> <tr v-for="person in people"> <td>{{ person.name }}</td> <td>{{ person.age }}</td> <td>{{ person.sex }}</td> </tr> </tbody> </table> </div> </body> <script src="js/vue.js"></script> <script> var vm = new Vue({ el: '#app', data: { people: [{ name: 'Jack', age: 30, sex: 'Male' }, { name: 'Bill', age: 26, sex: 'Male' }, { name: 'Tracy', age: 22, sex: 'Female' }, { name: 'Chris', age: 36, sex: 'Male' }] } }) </script> </html>
下面这段代码构建了一个简单的分页条,v-bind指令做用于元素的class特性上。javascript
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> <link rel="stylesheet" href="styles/demo.css" /> </head> <body> <div id="app"> <ul class="pagination"> <li v-for="n in pageCount"> <a href="javascripit:void(0)" v-bind:class="activeNumber === n + 1 ? 'active' : ''">{{ n + 1 }}</a> </li> </ul> </div> </body> <script src="js/vue.js"></script> <script> var vm = new Vue({ el: '#app', data: { activeNumber: 1, pageCount: 10 } }) </script> </html> 注意v-for="n in pageCount"这行代码,pageCount是一个整数,遍历时n从0开始,而后遍历到pageCount –1结束。
有两种形式调用方法:绑定一个方法(让事件指向方法的引用),或者使用内联语句。 Greet按钮将它的单击事件直接绑定到greet()方法,而Hi按钮则是调用say()方法。 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> </head> <body> <div id="app"> <p><input type="text" v-model="message"></p> <p> <!--click事件直接绑定一个方法--> <button v-on:click="greet">Greet</button> </p> <p> <!--click事件使用内联语句--> <button v-on:click="say('Hi')">Hi</button> </p> </div> </body> <script src="js/vue.js"></script> <script> var vm = new Vue({ el: '#app', data: { message: 'Hello, Vue.js!' }, // 在 `methods` 对象中定义方法 methods: { greet: function() { // // 方法内 `this` 指向 vm alert(this.message) }, say: function(msg) { alert(msg) } } }) </script> </html>
Vue.js为最经常使用的两个指令v-bind和v-on提供了缩写方式。v-bind指令能够缩写为一个冒号,v-on指令能够缩写为@符号。 <!--完整语法--> <a href="javascripit:;" v-bind:class="activeNumber">{{ n + 1 }}</a> <!--缩写语法--> <a href="javascripit:;" :class="activeNumber">{{ n + 1 }}</a> <!--完整语法--> <button v-on:click="greet">Greet</button> <!--缩写语法--> <button @click="greet">Greet</button>