什么是Vue.js
Vue.js 一个前端框架,是一套构建用户界面的框架,只关注视图层 ,它不仅易于上手,还便于与第三方库或既有项目整合。(Vue有配套的第三方库,可以整合起来做大型项目的开发)
为什么要学习流行框架
开发效率快
提高开发效率的发展历程:原生JS -> Jquery之类的类库 -> 前端模板引擎 -> Angular.js / Vue.js
在Vue中,一个核心的概念就是让用户不再操作DOM元素,解放了用户的双手,让程序员可以更多的时间去关注业务逻辑。
框架和库的区别
框架:是一套完整的解决方案,对项目的侵入性较大,项目如果需要更换框架,则需要重新架构整个项目
库(插件):提供某一个小功能,对项目的侵入性小,如果某个库无法完成某些需求,可以很容易的切换到其他库实现需求。
从 jQuery 切换到 Zepto
从 EJS 切换到 art-template
Node(后端)中的MVC与前端中的MVVM之间的区别
MVC 是后端的分层开发概念
MVVM是前端视图层的概念,主要关注于视图层分离,也就是说MVVM把前端的视图层,分为了三部分,Model, View, VM ViewModel
为什么有了 MVC 还要有 MVVM
Vue.js 基本代码与 MVVM 之间的对应关系
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <title>Vue的基本语法</title> <meta name="viewport" content="width=device-width, initial-scale=1"> <!-- 导入Vue的包 --> <script src="./lib/vue.js"></script> </head> <body> <!-- 将来 new 的Vue实列,会控制这个元素中的所有内容 --> <!-- Vue 实例所控制的这个元素区域,就是我们的 V --> <div id="app"> <p>{{ msg }}</p> </div> <script> // 2. 创建一个Vue的实例 // 当我们导入包之后,在浏览器的内存中,就多了Vue 构造函数 // 我们 new 出来的这个 vm 对象,就是我们 MVVM 中的 VM 调度者 var vm = new Vue({ el: '#app', // 表示 vm这个实例要去控制 id 为 app 的这个元素 // 表示当前我们 new 的这个 Vue 实列,要控制页面上的哪个区域 // data 就相当于 MVVM 中的 M 专门用来保存每个页面的数据的 data: { // data 属性中,存放的是 el 中要用到的数据 msg: 'Hello World' // 通过 Vue 提供的指令,很方便的就能把数据渲染到页面上 // 不需要在手动操作DOM元素了 } }) /* * el: element 需要获取的元素,一定是html中的跟容器元素 * data: 用于数据的存储 */ </script> </body> </html>
Vue 指令之v-text和v-html
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <title>Page Title</title> <meta name="viewport" content="width=device-width, initial-scale=1"> <link rel="stylesheet" type="text/css" media="screen" href="main.css" /> <script src="./lib/vue.js"></script> </head> <body> <div id="app"> <p>+++++ {{ msg }} -----</p> <h4 v-text="msg">这里的数据会被覆盖</h4> <!-- 区别一:v-text使用属性的方式,所以默认是不存在闪烁的问题 区别二:v-text会覆盖元素中原本的内容,但是插值表达式 只会替换自己的这个占位符 不会把整个元素的内容清空 --> <div v-html="msg2">这里的内容和 v-text一样 会被覆盖</div> <!-- v-html 也会覆盖里面的内容 --> </div> <script> var vm = new Vue({ el: '#app', data: { msg: '456', msg2: '<h1>v-html 可以把内容当作html代码来显示</h1>' } }) </script> </body> </html>
Vue 指令之v-bind的学习
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <title>Page Title</title> <meta name="viewport" content="width=device-width, initial-scale=1"> <link rel="stylesheet" type="text/css" media="screen" href="main.css" /> <script src="./lib/vue.js"></script> </head> <body> <div id="app"> <!-- v-bind: 是 Vue 中,提供的用于绑定属性的指令 --> <input type="button" value="按钮1" v-bind:title="mytitle"> <!-- v-bind 中,可以写合法的js表达式 --> <input type="button" value="按钮2" v-bind:title="mytitle + '123'"> <!-- v-bind: 可以被简写为 :要绑定的属性 --> <input type="button" value="按钮3" :title="mytitle"> </div> <script> var vm = new Vue({ el: '#app', data: { msg: '456', msg2: '<h1>v-html 可以把内容当作html代码来显示</h1>', mytitle: '这是自定义的title' } }) </script> </body> </html>
Vue 指令之 v-on
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <title>Page Title</title> <meta name="viewport" content="width=device-width, initial-scale=1"> <link rel="stylesheet" type="text/css" media="screen" href="main.css" /> <script src="./lib/vue.js"></script> </head> <body> <div id="app"> <!-- v-html 也会覆盖里面的内容 --> <!-- v-bind: 是 Vue 中,提供的用于绑定属性的指令 --> <input type="button" value="按钮" v-bind:title="mytitle"> <!-- Vue 中提供了 v-on: 事件绑定机制 --> <input type="button" value="按钮1" :title="mytitle+'123'" v-on:click="show"> <input type="button" value="按钮2" :title="mytitle+'123'" v-on:mouseover="show"> </div> <script> var vm = new Vue({ el: '#app', data: { msg: '456', msg2: '<h1>v-html 可以把内容当作html代码来显示</h1>', mytitle: '这是自定义的title' }, methods:{ // 这个methods属性中定义了当前Vue实例所有可用的方法 show: function () { alert('Hello') } } }) </script> </body> </html>
小总结
如何定义一个基本的Vue代码结构
插值表达式 和 v-text
v-cloak
v-html
v-bind Vue提供的属性绑定机制 缩写是 :
v-on Vue提供的事件绑定机制 缩写是 @
事件修饰符
.stop
阻止冒泡
.prevent
阻止默认事件
.capture
添加事件侦听器时使用事件捕获模式
.self
只当事件在该元素本身(比如不是子元素)触发时触发回调
.once
事件只触发一次
Vue指令之 v-model
和 双向数据绑定
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 <body> <div id="app"> <h4>{{ msg }}</h4> <!-- v-bind 只能实现数据的单项绑定 --> <input type="text" v-bind:value="msg"> <!-- 使用 v-model 指令,可以实现表单元素和 Model 中数据的双向数据绑定 --> <!-- 注意: v-model 只能运用才 表单元素中 --> <!-- input(radio text address email...) select checkbox textarea --> <input type="text" v-model="msg"> </div> <script> var vm = new Vue({ el: '#app', data: { msg: '大家好' }, method: {} }); </script> </body>
v-for
1 2 3 <ul> <list v-for="(item, i) in list">索引值 : {{i}}--->数据 : {{item}}</list> </ul>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 <body> <div id="app"> <p v-for="item in list">{{item}}</p> <p v-for="(item, i) in list">索引值 : {{i}}--->数据 : {{item}}</p> </div> <script> var vm = new Vue({ el: '#app', data: { list: [1, 2, 3, 4, 5, 6, 7, 8, 9] }, method: {} }); </script> </body>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 <!-- 循环遍历对象数组 --> <body> <div id="app"> <p v-for="user in list">{{user.id}} --- {{user.name}}</p> <p v-for="(user, i) in list">Id : {{user.id}} --- Name : {{user.name}} --- Index : {{i}}</p> </div> <script> var vm = new Vue({ el: '#app', data: { list: [ {id: 1, name: 'zs1'}, {id: 2, name: 'zs2'}, {id: 3, name: 'zs3'}, {id: 4, name: 'zs4'}, {id: 5, name: 'zs5'} ] }, method: {} }); </script> </body>
1 2 3 4 <!-- 循环遍历对象身上的属性 --> <div v-for="(val, key, i) int userInfo"> {{val}} --- {{key}} --- {{i}} </div>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 <body> <div id="app"> <p v-for="(val, key) in user">Key : {{ key }} --- Value : {{ val }}</p> <!-- 在遍历对象身上的键值对的时候,除了 有 val key ,在第三个位置还有一个 索引 --> <p v-for="(val, key, i) in user">Key : {{ key }} --- Value : {{ val }} --- Index : {{i}}</p> </div> <script> var vm = new Vue({ el: '#app', data: { user: { id: 1, name: 'Chris', gender: '男' } }, method: {} }); </script> </body>
1 2 3 <p v-for="i in 10"> 这是第 {{i}} 个标签 </p>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 <body> <div id="app"> <!-- in 后面我们放过 普通数组,对象数组,对象,还可以放数字 --> <!-- 注意:如果使用 v-for 迭代数字的话,前面的count值从 1 开始 --> <p v-for="count in 10">这是第 {{ count }} 次循环</p> </div> <script> var vm = new Vue({ el: '#app', data: { user: {} }, method: {} }); </script> </body>
注意事项:
2.2.0+ 的版本里,当在组建中使用v-for时,key现在是必须的
v-for
循环的时候,key 属性只能使用number
获取string
key
在使用的时候,必须使用v-bind
属性绑定的形式,制定key
的值
在组件中,使用v-for
循环的时候,或者在一些特殊情况中,如果v-for
有问题,必须在使用v-for
的同时,制定唯一的字符串/数字 类型 :key
值
当Vue.js
用v-for
正在更新已渲染过的元素列表时,它默认用 就地复用 策略。如果数据项的顺序改变,Vue将不是移动 DOM 元素来匹配数据项的顺序 ,而是简单复用此处每个元素 ,并且确保它在特定索引下显示已被渲染过的每个元素。
为了给Vue
一个提示,以便它能跟踪每个节点的身份,从而重用和重新排序现有元素 ,你需要为每项提供一个唯一key
属性。
Vue指令之v-if
和v-show
一般来说,v-if 有更高的切换消耗而 v-show 有更高的初始渲染消耗。因此,如果需要频繁切换 v-show 较好,如果在运行时条件不大可能改变 v-if 较好
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 <body> <div id="app"> <input type="button" value="按钮" @click="toggle"> <!-- v-if 的特点:每次都会重新删除或创建元素 --> <!-- v-show 的特点:每次不会重新进行DOM的删除和创建操作,只是切换了元素的 display:none 样式 --> <!-- v-if 有较高的切换性能消耗 --> <!-- v-show 有较高的初始渲染消耗 --> <!-- 如果元素涉及到频繁的切换,最好不要用 v-if, 而是推荐使用 v-show --> <!-- 如果元素可能永远也不会被显示出来被用户看到,则推荐使用 v-if --> <h3 v-if="flag">这是用v-if控制的元素</h3> <h3 v-show="flag">这是用v-show控制的元素</h3> </div> <script> var vm = new Vue({ el: '#app', data: { flag: true }, methods: { toggle() { this.flag = !this.flag } } }); </script> </body>
v-if 的特点
有较高的切换性能消耗
每次都会重新删除或创建元素
如果元素可能永远也不会被显示出来被用户看到,推荐使用 v-if
v-show 的特点
每次不会重新进行DOM的删除和创建操作,只是切换了元素的 display:none 样式
有较高的初始渲染消耗
如果元素涉及到频繁的切换,推荐使用 v-show
<
约翰·卡马克的编码规范
重装系统后如何恢复Hexo博客
>