通过Vue的指令操作可以在
template
中对代码进行操作
1. 插值表达式
Vue中的元素通过插值表达式{{}}
将其挂载到DOM上
而写在{{}}
中的Vue变量都在data中进行声明
<template>
{{message}}
</template>
<script>
export default {
data() {
return {
message: "这是一个简单的Vue变量",
};
},
</script>
2. v-bind 指令
动态的绑定属性到标签上
<!-- 绑定 属性 -->
<img v-bind:src="imageSrc" />
<!-- 缩写 -->
<img :src="imageSrc" />
因为Vue变量不能通过普通的CSS样式进行绑定 ,需要通过v-bind
先绑定属性,再通过给属性里Vue变量修改值来改变标签
3. v-on 指令
将事件绑定到标签上
<!-- 绑定一个点击事件(不带参数) -->
<button v-on:click="doThis"></button>
<!-- 绑定一个点击事件(带参数) $event 就是事件对象e -->
<button v-on:click="doThis($event,other)"></button>
<!-- 缩写 -->
<button @click="doThis"></button>
<!-- enter健触发 -->
<button @keyup.enter="doThis"></button>
其他修饰符:
- .stop - 调用 event.stopPropagation() 阻止事件冒泡。
- .prevent - 调用 event.preventDefault() 阻止事件默认行为。
- .self - 只当事件是从事件绑定的元素本身触发时才触发。
- .{keyAlias} - 仅当事件是从特定键触发时才触发回调。
- .once - 只触发一次事件,触发完事件清除。
- .left - 只当点击鼠标左键时触发。
- .right - 只当点击鼠标右键时触发。
- .middle - 只当点击鼠标中键时触发。
- .enter - 按下回车健时触发。
- .passive - { passive: true } 模式添加侦听器
4. v-model 指令
数据变量的双向绑定 , 通常用在表单中
<!-- 基本用法 -->
<span>用户名:</span>
<input type="text" v-model="username" />
<span>密码:</span>
<input type="password" v-model="pass" />
<!-- 下拉菜单要绑定在select上 -->
<select v-model="from">
<option value="北京市">北京</option>
<option value="南京市">南京</option>
<option value="天津市">天津</option>
</select>
<!-- (重要)
遇到复选框, v-model的变量值
非数组 - 关联的是复选框的checked属性
数组 - 关联的是复选框的value属性 选中后将value里的值传入这个数组
-->
<span>爱好: </span>
<input type="checkbox" v-model="hobby" value="抽烟">抽烟
<input type="checkbox" v-model="hobby" value="喝酒">喝酒
<input type="checkbox" v-model="hobby" value="写代码">写代码
<div>
<span>性别: </span>
<input type="radio" value="男" name="sex" v-model="gender">男
<input type="radio" value="女" name="sex" v-model="gender">女
</div>
<script>
export default {
data() {
return {
username: "",
pass: "",
from: "",
hobby: [],
sex: "",
intro: "",
};
// 总结:
// 特别注意: v-model, 在input[checkbox]的多选框状态
// 变量为非数组, 则绑定的是checked的属性(true/false) - 常用于: 单个绑定使用
// 变量为数组, 则绑定的是他们的value属性里的值 - 常用于: 收集勾选了哪些值
}
};
</script>
v-model 修饰符
5. v-tex v-html 指令
和innerText、innerHTML的功能是一样的
<template>
<div>
<p v-text="str1"></p>
<p v-html="str2"></p>
</div>
</template>
<script>
export default {
data() {
return {
str1: "<span>不解析标签</span>",
str2: "<div>解析标签</div>",
}
}
}
</script>
6. v-show v-if指令
控制标签的显示和隐藏,属性值为false时隐藏标签
v-show:false
会将标签的display属性
改为的display:none
v-if:false
会再DOM树上暂时移除该标签
一般来说,v-if 有更高的切换开销,而 v-show 有更高的初始渲染开销。因此,如果需要非常频繁地切换,则使用 v-show 较好;如果在运行时条件很少改变,则使用 v-if 较好。
v-else
和if else 用法相同 如果v-if显示则 v-else隐藏
<!-- 值为false时隐藏元素 -->
<div v-if="Math.random() > 0.5">
Now you see me
</div>
<div v-else>
Now you don't
</div>
v-else-if
和
if{}else if{}
的f用法一致 ,表示另一种条件下的v-if
<!-- 值为false时隐藏元素 -->
<div v-if="Math.random() > 0.5">
Now you see me
</div>
<div v-else-if>
Now you see other
</div>
7. v-for 指令
v-for用于列表渲染,通常为通过一组数组形式的Vue变量来渲染列表
<template>
<ul>
<!-- v-for 的局部变量只有绑定的标签及其子标签才能生效 -->
<li v-for="(item, index) in arr" :key="index">
<input type="checkbox" />{{ item.message }}
</li>
</ul>
</template>
<script>
export default {
data() {
return {
arr: [{ message: "cat" }, { message: "bear" }, { message: "lion" }],
};
},
};
</script>
item
是当前循环的数组元素index
是一个可选参数 ,为当前循环索引- 当修改数组元素时,
v-for
会更新当前渲染的数据,v-for
根据绑定地址内的数据来实时更新,所以如果不是对原数据进行的修改v-for
并不会渲染在页面上(例如filter()
、concat()
和slice()
。它们不会变更原始数组,而总是返回一个新数组)
v-for 跟新数据
v-for 的跟新默认行为会先尝试原地修改数据,即就地跟新的策略,这就和虚拟DOM以及diff算法有关了 这个默认的模式是高效的,但是只适用于不依赖子组件状态或临时 DOM 状态 (例如:表单输入值) 的列表渲染输出
可以通过添加 key
来提高跟新数据的性能
- **没有**`key`时 `v-for`为就地更新的策略
- **有**`key`时`v-for`按照`key`来进行比较跟新
- `key`建议为数组内部对象的`Id`如果没有也可以绑定索引(index)
<!-- 优先绑定id -->
<div v-for="item,index in arr" :key="item.id">
<!-- 省略的代码 -->
</div>
<!-- 没有就绑定index -->
<div v-for="item,index in arr" :key="index">
<!-- 省略的代码 -->
</div>
提示 不要使用对象或数组之类的非基本类型值作为 v-for 的 key。请用字符串或数值类型的值。
虚拟DOM
.vue文件中的template里写的标签, 都是模板, 都要被vue处理成虚拟DOM对象, 才会渲染显示到真实DOM页面上(虚拟DOM本质上其实就是一个JS对象)
将Vue
里的template里标签结构 转变为对应的虚拟DOM
<template>
<div id="app">
<p class="myCard">adscrsdf</p>
</div>
</template>
const dom = {
type: 'div',
attributes: [{id: 'app'}],
children: {
type: 'p',
attributes: [{class: 'myCard'}],
text: 'adscrsdf'
}
}
所以Vue跟新数据为:
- 生成新的虚拟DOM结构
- 与旧的虚拟DOM结构进行对比
- 利用
diff
算法来跟新变化的部分(重绘or回流)到页面上
这样做的优点 :
- 提高更新DOM的性能
- 虚拟DOM只包含必要的属性
总结: 虚拟DOM保存在内存中, 只记录dom关键信息, 配合diff算法提高DOM更新的性能