1. vue是什么?
Vue.js (读音 /vju ː /, 类似于 view ) 是一套构建用户界面的渐进式框架。
Vue 只关注视图层, 采用自底向上增量开发的设计。
Vue 的目标是通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件。
官网地址 API : https://cn.vuejs.org/v2/guide/index.html
2. MVVM是什么?
MVC 拆分解释:
视图( View ):用户界面。
控制器( Controller ):业务逻辑
模型( Model ):数据保存
MVC 通信方式
View 传送指令到 ControllerController 完成业务逻辑后,要求 Model 改变状态Model 将新的数据发送到 View ,用户得到反馈
MVC 框架局限性
View 里会包含业务逻辑View 当中的业务逻辑无法重用模型的代码少,控制器的代码却是越写越多
MVVM 拆分解释:
Model: 负责数据存储View: 负责页面展示View Model: 负责业务逻辑处理(比如 Ajax 请求等),对数据进行加工后交给视图展示
3. 为什么要使用 MVVM
1. 低耦合。视图( View )可以独立于 Model 变化和修改,一个 ViewModel 可以绑定到不同的 "View" 上,当 View 变化的时候 Model 可以不变,当 Model 变化的时候 View 也可以不变2. 可重用性。你可以把一些视图逻辑放在一个 ViewModel 里面,让很多 view 重用这段视图逻辑3. 独立开发。开发人员可以专注于业务逻辑和数据的开发( ViewModel ),设计人员可以专注于页面设计
4. Vue.js 起步
实现步骤
第一步:下载 Vue.js 库并引入
<script type="text/javascript" src="vue.js"></script>
第二步 :创建 view 视图
<div id="box"> //确定一个范围,表示此范围内部都是 vue解析出来的<h1> {{ msg }} </h1>
</div>
第三步 通过 Vue 实例化一个 vue 对象
var vm = new Vue({el: '#box', // el:‘选择器’data: {msg: 'hello, world!'},// 实例中,可以设置很多配置项
});
第四步 使用数据
将 data 中变量 msg 放在 #box 内的双花括号内
修改 data 中的 msg ,会同步显示在页面中
实现原理分析
DOM 监听
视图层发生变化,DOM 监听到之后,会传到逻辑层进行处理
数据绑定
逻辑层把数据处理完成之后,通过数据绑定,把处理后的结构返回给视图层
5. 插值表达式
使用双大括号来包裹 js 代码构成插值表达式 , 如: {{msg}}
插值表达式将双大括号中的数据替换成对应属性值进行展示 , 也叫模板语法
插值表达式中可以写入哪些内容?
1. JSON数据
<div id="wzy"><p>{{obj.name}}</p>
</div>
<script>new Vue({el: '#wzy',data: {message: 'hello world',obj:{ //插入json数据name:'tom',age:20}}
})
</script>
2. 数字 <p>{{ 10 }}</p>
3. 字符串 {{ "wzy" }}
4. 表达式 <h1>{{ 2>3?'true':'false' }}</h1>
注意:在表达式中可以调用 js 函数。如 {{msg.charAt(0)}}
6.Vue指令
什么是 Vue.js 指令
指令( Directive )是特殊的带有 v- 前缀的特性
6.1 v-if 指令
被称为条件渲染指令,它根据表达式的真假来插入和删除元素
v-if = ' 表达式 '
根据表达式结果的真假,确定是否显示当前
true 表示显示该元素; false 表示隐藏该元素
<div id="wzy"><p v-if="isShow">表达式的值为真,我就能显示</p>
</div>
var app3 = new Vue({el: '#wzy',data: {isShow: true}
})
6..2 v-else 指令
v-else 指令为 v-if 添加一个 “else 块 ” , v-else 元素必须立即跟在 v-if 元素的后面,否则不能被识别
v-else 后面不需要表达式
v-if为 true ,后面的 v-else 不会渲染到 HTML
v-if为 false ,后面的 v-else 才会渲染到 HTML
<body><div id="wzy"><h1 v-if="isShow">表达式的值为真,我就能显示</h1><h1 v-else>v-if不成立的时候,我就显示出来了</h1></div>
</body>
<script src="js/vue.js"></script>
<script>new Vue({el: '#wzy',data: {isShow: false}})
</script>
6.3 v-show 指令
控制切换一个元素的显示和隐藏
v-show = ‘ 表达式 ’
根据表达式结果的真假,确定是否显示当前元素( true 表示显示该元素; false 表示隐藏该元素)
<div class="div1" v-show='isShow'></div>
v-if 与 v-show 区别
v-show 指令的元素始终会被渲染到 HTML
它只是简单地为元素设置CSS 的 style 属性。当不满足条件的元素被设置 style="display:none" 样式
v-if 指令满足条件是,会渲染到 html 中,不满足条件时,是不会渲染到 html 中的
v-if 与 v-show 应用场景
v-if 指令有更高的 切换消耗v-if 当条件成立的时候会将元素加上,不成立的时候,就会移除 dom ,并且内部的指令不会执行v-show 指令有更高的 初始渲染消耗v-show 只是简单的隐藏和显示
如果需要频繁切换使用 v ‐ show 较好,如果在运行时条件不大可能改变 使用 v ‐ if 较好
6.4 v-on 指令
为 HTML 元素绑定事件监听
v-on :事件名称 =‘ 函数名称 ()’ 或 @ 事件名称 =‘ 函数名称 ()’
<button v-on:click='fn()'>toggle</button>
//v-on: 可以简写成 @
<button @click='fn()'>toggle</button><body><div id="wzy"><a v-on:click="show()">点击测试</a></div>
</body>
<script src="js/vue.js"></script>
<script>new Vue({el: '#wzy',data: {},methods: {show:function(){alert("测试");}}})
</script>
注意:函数定义在 methods 配置项中
案例:
<style type="text/css">.div1 {width: 100px;height: 100px;background: red;margin-top: 20px;}
</style>
<body><!-- view --><div id="box"><!--第一种:click事件直接绑定一个方法,没有参数情况下,方法后面的括号可以去掉--><!-- <button v-on:click='fn()'>toggle</button> --><button v-on:click='fn'>toggle</button><!-- v-on: 可以简写成 @ --><!-- <button @click='fn()'>toggle</button> --><br/><div class="div1" v-show='bol'></div><!--第二种:传参情况下,click事件使用内联语句--><button v-on:click="say('Hi')">Hi</button></div>
</body>
<script src="js/vue.js"></script>
<script type="text/javascript">// 实例化对象var vm = new Vue({el: '#box',data: {// 数据bol: false},// 事件统一写在methods里面methods: {fn: function() {this.bol = !this.bol;},say: function(msg) {alert(msg);}}});
</script>
6.5 v-model 指令
能轻松实现表单输入和应用状态之间的 双向绑定
双向绑定
指的是我们在 vue 实例中的 data 与其渲染的 dom 元素上的内容保持一致,两者无论谁被改变,另一方也会相应的更新为相同的数据
v-model = ‘ 变量
<body><div id="box"><input type="text" v-model='msg'></input><h1>{{ msg }}</h1><!-- v-model:进行双向绑定的(把用户输入的内容,同步显示在页面上)语法:v-model='变量'注:使用在表单元素上(常用在 type类型为text 上)--></div>
</body>
</html>
<script type="text/javascript">var vm = new Vue({el: '#box',data: {msg: 'hello'}});
</script>
6.6 v-bind 指令
v-bind 可以在其名称后面带一个参数,参数通常是 HTML 元素的特性( attribute ), v-bind 是动态绑定指令,默认
情况下自带属性的值是固定的,为了能够动态的给这些属性添加值可以使用 v-bind 指令
v-bind: 属性名 = ‘ 表达式 ’
简写形式: v-bind 可以省略,直接书写为 : 属性名 = ‘ 表达式 ’
<img v-bind:src="imageSrc"> 等价于 <img :src="imageSrc"> //绑定一个属性
<div id="box"><!-- 第一种:图片的url地址 --><img v-bind:src="imageSrc"><!-- 第二种:动态类名 v-bind:class={类名:表达式} --><div v-bind:class="{ divclass: isRed }"></div>
</div>
<script type="text/javascript">var vm = new Vue({el: '#box',data: {// 第一种:图片地址imageSrc: "images/1.png",// 第二种:class类名isRed: true}});
</script>
6.7 v-for 指令
遍历 data 中的数据,并在页面进行数据展示
v-for = ‘(item, index) in items’
7.7 v-for 指令
1. item 表示每次遍历得到的元素
2. index 表示 item 的索引,可选参数
3. items 表示数组或者对象
<body><div id="app"><ul><!-- 1、遍历对象value :表示对象的属性值key :当前对象的属性名index:当前对象的索引值--><!-- <li v-for="(value, key, index) in person">{{index}} - {{key}} - {{value}}<br></li> --><!-- 2、遍历数组item: 代表遍历的每一个数组对象index:当前数组对象的索引值--><!-- <li v-for="(item,index) in lesson">{{index}} - {{item.name}} - {{item.type}}<br></li> --><!-- 3、双层嵌套把课程中内容遍历出来--><!-- <li v-for="(item,index) in lesson"><span v-for="(childValue,index) in item.type">{{index}} - {{childValue}} <br></span></li> --><!-- 4、key 属性 :更高效的去重用和重新排序现有元素为了给 Vue 一个提示,以便它能跟踪每个节点的身份,从而重用和重新排序现有元素,你需要为每项提供一个唯一 key 属性。理想的 key 值是每项都有的且唯一的 id。建议尽可能在使用v-for 时提供 key,除非遍历输出的 DOM 内容非常简单key的工作方式类似于一个属性,所以你需要用 v-bind 来绑定动态值 ,这里使用简写形式完成--><li v-for="(item,index) in lesson" :key="index"><!-- 这的 index是 唯一的存在,可以使用,如果有其他的也可以使用 -->{{index}} - {{item.name}} - {{item.type}}<br></li></ul></div>
</body>
</html>
<script type="text/javascript">var vm = new Vue({el: '#app',data: {person: {name: 'zfpx',age: 7,},lesson: [{ name: '前端三大块', type: ['HTML', 'CSS', 'JavaScript'] },{ name: '前端三大框架', type: ['vuejs', 'react', 'angularjs'] },]}});
</script>
7.总结
v-if :根据表达式的真假来插入和删除元素v-else : v-else 指令为 v-if 添加一个 “else 块 ”v-show :控制切换一个元素的显示和隐藏v-on :为 HTML 元素绑定事件监听v-model :将用户的输入同步到视图上v-bind :绑定 HTML 元素的属性v-for :遍历 data 中的数据,并在页面进行数据展示