一、Vue简介
数据驱动视图:
- 在使用了 vue 的页面中,vue 会监听数据的变化,从而自动重新渲染页面的结构。
- 注意:数据驱动视图是单向的数据绑定。
双向数据绑定:
- 在填写表单时,双向数据绑定可以辅助开发者在不操作 DOM 的前提下,自动把用户填写的内容同步到数据源。
- 开发者不再需要手动操作 DOM 元素,来获取表单元素最新的值。
MVVM
MVVM 是 vue 实现数据驱动视图和双向数据绑定的核心原理。它把每个 HTML 页面都拆分成了如下三个部分:
- View 表示当前页面所渲染的 DOM 结构。
- Model 表示当前页面渲染时所依赖的数据源。
- ViewModel 表示 vue 的实例,它是 MVVM 的核心,把当前页面的数据源(Model)和页面的结构(View)连接在了一起。
当数据源发生变化时,会被 ViewModel 监听到,VM 会根据最新的数据源自动更新页面的结构
当表单元素的值发生变化时,也会被 VM 监听到,VM 会把变化过后最新的值自动同步到 Model 数据源中
二、Vue 的基本使用
基本使用步骤
- 导入 vue.js 的 script 脚本文件
- 在页面中声明一个将要被 vue 所控制的 DOM 区域
- 创建 vm 实例对象(vue 实例对象)
<body>
<!--2. 在页面中声明一个将要被vue所控制的dom区域-->
<div id = "app">{{username}}</div>
<!--1. 导入vue.js的scripti脚本文件-->
<script src="./lib/vue-2.6.12.js"></script>
<script>
//3. 创建vm实例对象(vue实例对象)
const vm = new Vue({
//3.1指定当前vm实例要控制页面的那个区域
el:'#app',
//3.2指定model数据源
data:{
username:'zs'
}
})
</script>
</body>
三、Vue 指令
1. 内容渲染指令
渲染 DOM 元素的文本内容:
- v-text
- {{ }}
- v-html
v-text
会把gender对应的值渲染到p标签上,并覆盖默认的文本。
<p v-text="gender">性别</p>
{{ }}语法
插入,不会覆盖默认文本。
<p>性别:{{gender}}</p>
v-html
可以渲染出html标签
<p v-html="des"></p>
/*
data:{
des:'<i>abc</i>'
}
*/
2. 属性绑定指令
<!--使用v-bind指令为input的placeholder动态绑定属性值-->
<input type = "text" v-bind:placehoder="inputValue">
<!--使用v-bind指令为img的src动态绑定属性值-->
<img v-bind:src="imgSrc" alt = "">
使用js表达式
<p>{{message.split('').reverse().join('')}}</p>
3. 事件绑定指令
v-on 事件绑定
原生 DOM 对象有 onclick、oninput、onkeyup 等原生事件,替换为 vue 的事件绑定形式后,
分别为:v-on:click、v-on:input、v-on:keyup
<h3>{{count}}</h3>
<button v-on:click="addCount">+1</button>
<!--简写形式-->
<button @click="count += 1">+1</button>
通过 v-on 绑定的事件处理函数,需要在 methods 节点中进行声明
// 创建 VM 实例对象
const vm = new Vue({
// 指定当前 VM 要控制的区域
el: '#app',
// 数据源
data: {
// 计数器的值
count: 0,
},
methods: {
// 点击按钮,让 count 自增 +1
addCount() {
this.count += 1
},
},
})
可以接收到事件对象 event
<h3>count 的值为:{{count}}</h3>
<button v-on:click="addCount">+1</button>
methods: {
addCount(e) { //接受事件参数对象event,简写为e:就是被点的那个按钮
const nowBgColor = e.target.style.backgroundColor
e.target.style.backgroundColor = nowBgColor === 'red' ? '' : 'red'
this.count += 1
},
},
绑定事件并传参
- 在使用 v-on 指令绑定事件时,可以使用 ( ) 进行传参
- $event 是 vue 提供的特殊变量,用来表示原生的事件参数对象 event。$event 可以解决事件参数对象 event 被覆盖的问题。
<h3>count 的值为:{{count}}</h3>
<button @click="addCount(2, $event)">+2</button>
methods: {
//在形参处用step接受传递过来的参数值
//在形参处用e接受传递过来的原生事件参数对象
addCount(step, e) {
const bgColor = e.target.style.backgroundColor
e.target.style.backgroundColor = bgColor === 'red' ? '' : 'red'
this.count += step
},
}
事件修饰符
对事件的触发进行控制
事件修饰符 | 说明 |
.prevent | 阻止默认行为 |
.stop | 阻止事件冒泡 |
.capture | 以捕获模式触发当前的事件处理函数 |
.once | 绑定的事件只触发一次 |
.self | 只有在event.target是当前元素自身时触发事件处理函数 |
<div class="outer" @click="onOuterClick">
外层的 div
<div class="inner" @click.stop="onInnerClick">内部的 div</div>
</div>
按键修饰符
<!--只有在'key'是'enter'时调用'vm.submit()' -->
<!--只有在'key'是'esc'时调用'vm.clearInput()' -->
<input type="text" @keyup.enter="submit" @keyup.esc="clearInput" />
双向绑定指令
v-model 双向数据绑定指令,实现对表单的实时同步修改。
注意:v-model 指令只能配合表单元素一起使用!
<p>用户名是:{{username}}</p>
<input type="text" v-model="username" />
<p>选中的省份是:{{province}}</p>
<select v-model="province">
<option value="">请选择</option>
<option value="1">北京</option>
<option value="2">河北</option>
<option value="3">黑龙江</option>
</select>
修饰符 | 作用 | 示例 |
.lazy | 在“change”时而非“input”时更新,当文本框失去焦点时更新 | <input v-model.lazy="msg" /> |
.number | 自动将用户的输入转化为数值类型 | <input v-model.number="age" /> |
.trim | 去掉用户输入的首位空格 | <input v-model.trim="msg" /> |
条件渲染指令
实现原理不同:
- v-if 指令会动态地创建或移除 DOM 元素,从而控制元素在页面上的显示与隐藏;
- v-show 指令会动态为元素添加或移除 style="display: none;" 样式,从而控制元素的显示与隐藏;
性能消耗不同:
- v-if 有更高的切换开销,而 v-show 有更高的初始渲染开销。
- 如果需要非常频繁地切换,则使用 v-show 较好
- 如果在运行时条件很少改变,则使用 v-if 较好
v-else
<div v-if="Math.random() > 0.5">
随机数大于0.5
</div>
<div v-else>
随机数小于0.5
</div>
v-else-if
<div v-if="type === 'A'">优秀</div>
<div v-else-if="type === 'B'">良好</div>
<div v-else-if="type === 'C'">一般</div>
<div v-else>其他</div>
v-for
data: {
// 用户列表的数据
list: [
{ id: 1, name: 'zs' },
{ id: 2, name: 'ls' },
],
},
<ul>
<li v-for="(index, item) in list">索引是:{{index}},姓名是:{{item.name}}</li>
</ul>
当列表的数据变化时,vue 会尽可能的复用已存在的 DOM 元素,从而提升渲染的性能。为了保证有状态的列表被正确更新的前提下,提升渲染的性能。需要为每项提供一个唯一的 key 属性:
① key 的值只能是字符串或数字类型
② key 的值不能重复
③ 建议把数据项 id 属性的值作为 key 的值(因为 id 属性的值具有唯一性)
④ 使用 index 的值当作 key 的值没有任何意义(因为 index 的值不具有唯一性)
⑤ 建议使用 v-for 指令时一定要指定 key 的值(既提升性能、又防止列表状态紊乱)
<ul>
<li v-for="(user, index) in userlist" :key="user.id">
<input type="checkbox" />姓名:{{user.name}}
</li>
</ul>