第十一天
JavaScript开源框架
Jquery、ExtJS、Dojo、vue.js
JS MV*模式
MVC(模式-视图-控制器)、MVP(模型-视图-表示器)、MVVM(模型-视图-视图模型)
MVC
MVC全名是Model View Controller,是模型(Model)-视图(View)-控制器(Controller)的缩写。MVC一般用于表现层(Web)开发。
表现层--对应JavaWeb中JSP层
mvc模式图
MVP
MVP是一种过渡模式,全称是Model-View-Presenter,Model提供数据,View负责显示,Presenter负责逻辑的处理。
MVVM
MVVM是一种基于MVC和MVP的架构模式,全称是Model-View-ViewModel,其中可以将ViewModel看成一个专门的Controller,充当数据转换器,它将Model信息转变成View信息,还将命令从View传递到Model。因此,很多这种模式的实现都要利用声明式数据绑定来实现将View工作从其它层分离。
mvvm模式图
MVC与MVVM的区别
mvc+mvvm
- MVC是后端的分层开发的概念
- MVVM是前端视图层的概念,主要关注于视图层分离,也就是说:MVVM把前端的视图层分为了三部分Model、View、VM(ViewModel)
单页Web应用程序(SPA)
只有一张Web页面的应用,通过改变该页的数据和样式修改页面,提高效率。
Vue.js
- Vue.js是一个JavaScript的MVVM库,是一套构建用户界面的渐进式框架。它是以数据驱动和组件化的思想构建的,采用自底向上增量开发的设计。
- Vue.js是目前最火的一个框架,Recat是最流行的一个框架(React除了开发网站,还可以开发手机App,Vue语法上也可以用于App开发,需要借助于Weex)。
- Vue.js是前端的主流框架之一,和Angular.js、React.js一起,并成为前端三大主流框架!
- Vue.js是一套构建用户界面的框架,只关注视图层,它不仅易于上手,还便于与第三方库或既有项目整合。
Vue特点
- 轻量级的框架
- 双向数据绑定
- 指令
- 插件化
框架和库的区别
- 框架:是一套完整的解决方案;对项目的侵入性较大,项目如果需要更换框架,则重新架构整个项目。
- 库(插件):提供某一个小功能,对项目的侵入性较小,如果某个库无法完成某些需求,可以很容易切换到其它库实现需求。
display和visibility区别
display:none隐藏后不占空间 visibility:hidden隐藏后会占用空间
Vue基础
Vue基础
- 如何定义一个基本Vue代码结构
- 插值表达式和v-text
- v-cloak
- v-html
- v-bind Vue提供的属性绑定机制,缩写是 :属性
- v-on Vue提供的事件绑定机制,缩写是@事件
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
| <!DOCTYPE html> <html lang="en">
<head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Vue的基本代码</title> <script src="./js/vue.js"></script> </head>
<body> <div id="app"> <p>{{msg}}</p> </div>
<script> var vm = new Vue({ el: "#app", data: { msg: "welcome to vue!" } }) </script> </body>
</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 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
| <!DOCTYPE html> <html lang="en">
<head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>v-cloak、v-text、v-html、v-on的学习</title> <script src="./js/vue.js"></script> <style> [v-cloak] { display: none; } </style> </head>
<body> <div id="app"> <p v-cloak>++++++{{msg}}--------</p> <h4 v-text="msg">=======</h4>
<div>{{msg2}}</div> <div v-text="msg2"></div> <div v-html="msg2"></div>
<input type="button" value="按钮" :title="mytitle+'123'">
<input type="button" value="按钮" @click="show">
</div> <script> new Vue({ el: "#app", data: { msg: "123", msg2: "<h1>标题<h1>", mytitle: "这是一个title" }, methods: { show: function () { alert("Hello"); } } }) </script>
</body>
</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 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
| <!DOCTYPE html> <html lang="en">
<head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>跑马灯效果</title> <script src="./js/vue.js"></script> </head>
<body> <div id="app"> <input type="button" value="浪起来" @click="lang"> <input type="button" value="低调" @click="stop"> <h4>{{msg}}</h4> </div> <script> var vm = new Vue({ el: "#app", data: { msg: "猥琐发育,别浪~~!", intervalId: null }, methods: { lang() { if (this.intervalId != null) return; this.intervalId = setInterval(() => { var start = this.msg.substring(0, 1); var end = this.msg.substring(1); this.msg = end + start; }, 400) }, stop() { clearInterval(this.intervalId); this.intervalId = null; } } }) </script> </body>
</html>
|
v-on 事件修饰符
- .stop 阻止冒泡
- .prevent 阻止默认事件
- .capture 添加事件侦听器使用事件捕获模式
- .self只当事件在该元素本身(比如不是子元素)触发时触发回调
- .once 事件只触发一次
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 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81
| <!DOCTYPE html> <html lang="en">
<head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>事件修饰符</title> <script src="./js/vue.js"></script> <style> .inner { height: 150px; background-color: darkcyan; }
.outer { background-color: red; } </style> </head>
<body> <div id="app">
<div class="outer" @click="divHandler"> <div class="inner" @click.self="divHandler"> <input type="button" value="戳它" @click.stop="btnHandler"> </div> </div>
</div> <script> var vm = new Vue({ el: "#app", data: {}, methods: { divHandler() { console.log("这是触发了inner div的点击事件") }, btnHandler() { console.log("这是触发了btn的点击事件") }, linkClick() { console.log("触发了链接的点击事件"); } div2Handler() { console.log("这是触发了outer div的点击事件"); } } }); </script> </body>
</html>
|
Vue指令之v-model和双向数据绑定
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 lang="en">
<head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>v-model</title> <script src="./js/vue.js"></script> </head>
<body> <div id="app"> <h4>{{msg}}</h4>
<input type="text" v-model="msg"> </div> <script> var vm = new Vue({ el: " #app", data: { msg: "Hello word" }, methods: {} }) </script> </body>
</html>
|
vue中的样式
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 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58
| <!DOCTYPE html> <html lang="en">
<head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>vue中的样式</title> <script src="./js/vue.js"></script> <style> .red { color: red; }
.thin { font-weight: 200; }
.italic { font-style: italic; }
.active { letter-spacing: 0.5em; } </style> </head>
<body> <div id="app">
<h1 :class="classObj">这是一个h1</h1>
</div> <script> var vm = new Vue({ el: " #app", data: { flag: true, classObj: { red: true, thin: true, italic: false, active: false } } }) </script> </body>
</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 36 37
| <!DOCTYPE html> <html lang="en">
<head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>vue中的样式-style</title> <script src="./js/vue.js"></script> </head>
<body> <div id="app">
<h1 :style="[styleObj1,styleObj2]">这是一个h1</h1>
</div> <script> var vm = new Vue({ el: "#app", data: { styleObj1: { color: 'red', 'font-weight': 200 }, styleObj2: { 'font-style': 'italic' } } }) </script> </body>
</html>
|
v-for
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 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88
| <!DOCTYPE html> <html lang="en">
<head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>v-for循环</title> <script src="./js/vue.js"></script> </head>
<body> <div id="app">
<div> <label for="">ID: <input type="text" v-model="id"></label> <label for="">Name: <input type="text" v-model="name"></label> <input type="button" value="添加" @click="add"> </div> <p v-for="item in list1" :key="item.id"> <input type="checkbox" name="" id="">{{item.id}}---{{item.name}} </p> </div> <script> var vue = new Vue({ el: "#app", data: { id: "", name: "", list: [1, 2, 3, 4, 5, 6], list1: [{ id: 1, name: 'zs' }, { id: 2, name: 'ls' }, { id: 3, name: 'ww' } ], user: { id: 1, name: "zs", gender: "男" } }, methods: { add() { this.list1.unshift({ id: this.id, name: this.name }) } } }) </script> </body>
</html>
|
v-if和v-show
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 40
| <!DOCTYPE html> <html lang="en">
<head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>v-if和v-show的使用</title> <script src="./js/vue.js"></script> </head>
<body> <div id="app"> <input type="button" value="toggle" @click="flag=!flag"> <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: { } }) </script> </body>
</html>
|
总结
- MVC和MVVM的区别
- 学习了Vue中最基本的代码结构
- 插值表达式 v-cloak v-text v-html v-bind(缩写是:) v-on(缩写是@) v-model v-for v-if v-show
- 事件修饰符: .stop .prevent .cature .self .once
- el 指定要控制的区域 data是个对象,指定了控制的区域内要用到的数据 methods 虽然带个s后缀,但是是个对象,这里可以自定义方法
- 在VM实例中,如果要访问data上的数据,或者要访问methods中的方法,必须带this
- 在v-for 要会使用key属性(只接收string/number)
- v-model 只能应用于表单元素
- 在vue中绑定样式两种方式:v-bind:class v-bind:style