Vue 02Day Knowledge Point

一.v指令 v-for

1.v-for

作用:可以遍历 数组 或者 对象,用于渲染数结构

遍历数组的方法:

v-for=”item in 数组名”

  1. <template>
  2. <div>
  3. <ul>
  4. <!-- 循环生成标签 item指向数组中的每一个元素-->
  5. <li v-for="item in goodList" :key="item">
  6. <h1>{{item.name}}</h1>
  7. <h1>{{item.age}}</h1>
  8. </li>
  9. </ul>
  10. </div>
  11. </template>
  12. <script>
  13. export default {
  14. name: 'App',
  15. data(){
  16. return{
  17. goodList:[
  18. {
  19. name:'小明',
  20. age:18,
  21. },
  22. {
  23. name:'小红',
  24. age:16,
  25. },
  26. ]
  27. }
  28. }
  29. }
  30. </script>
  31. <style>
  32. </style>

v-for=”(item, index) in 数组名”

  1. <template>
  2. <div>
  3. <ul>
  4. <!-- 循环生成标签 item指向数组中的每一个元素-->
  5. <li v-for="item in goodList" :key="item">
  6. <h1>{{item.name}}</h1>
  7. <h1>{{item.age}}</h1>
  8. </li>
  9. </ul>
  10. <ul>
  11. <!-- index 是数组下标 -->
  12. <li v-for="(item,index) in goodList" :key="item.name">
  13. {{index}}:{{item.name}}
  14. </li>
  15. </ul>
  16. </div>
  17. </template>
  18. <script>
  19. export default {
  20. name: 'App',
  21. data(){
  22. return{
  23. goodList:[
  24. {
  25. name:'小明',
  26. age:18,
  27. },
  28. {
  29. name:'小红',
  30. age:16,
  31. },
  32. ]
  33. }
  34. }
  35. }
  36. </script>
  37. <style>
  38. </style>

遍历对象语法:

v-for = “(value, key) in 对象名”

  1. <template>
  2. <div>
  3. <ul>
  4. <li v-for="(value,key) in goodList" :key="value">
  5. {{value}}:{{key}}
  6. </li>
  7. </ul>
  8. </div>
  9. </template>
  10. <script>
  11. export default {
  12. name: 'App',
  13. data(){
  14. return{
  15. goodList:{
  16. name:'小明',
  17. gender:'男',
  18. age:18,
  19. }
  20. }
  21. }
  22. }
  23. </script>
  24. <style>
  25. </style>

遍历数字:

v-for = “item in 数字”

  1. <template>
  2. <div>
  3. <ul>
  4. <!-- 使用场景:轮播图小圆点 -->
  5. <!-- 遍历数字 v-for="item in 数字" -->
  6. <li v-for="item in 10" :key="item">{{item}}</li>
  7. <!-- 打印出来的是1-10 -->
  8. <li v-for="item in array.length" :key="item">{{item}}</li>
  9. </ul>
  10. </div>
  11. </template>
  12. <script>
  13. export default {
  14. name: 'App',
  15. data(){
  16. return{
  17. array:[1,2,3],
  18. }
  19. }
  20. }
  21. </script>
  22. <style>
  23. </style>

2.v-for就地更新

v-for 的默认行为会尝试原地修改元素,复用标签就地更新内容,而不是移动它们

就地更新机制:vue是尽可能复用上一次渲染的DOM

vue会复用上一次渲染的列表,并把它更新成新列表的样子

Vue-Day 02 - 图1

3.虚拟DOM

1.概念:内存中的js对象,描述的是渲染的DOM结构

2.好处:更高效的对比DOM变化,我们可以对比出变化的部分,只更新变化的内容,减少DOM操作

Vue-Day 02 - 图2

  1. <template>
  2. <div>
  3. <ul>
  4. <!-- v-for的就地更新和虚拟dom -->
  5. <li v-for="(item, index) in list" :key="index">{{item}}</li>
  6. </ul>
  7. <button @click="list.reverse()">翻转数组</button>
  8. </div>
  9. </template>
  10. <script>
  11. export default {
  12. data() {
  13. return {
  14. list: [1, 2, 3],
  15. };
  16. },
  17. };
  18. </script>
  19. <style>
  20. </style>

3.对比虚拟dom? 为啥不对比 真实 dom 呢?
真实dom太复杂,对比性能效率低

5.拓展:怎么理解vue中的虚拟DOM

  1. 原理:
  2. JavaScript 对象模拟真实 DOM 树,对真实 DOM 进行抽象;
  3. diff 算法 比较两棵虚拟 DOM 树的差异;
  4. pach 算法 将两个虚拟 DOM 对象的差异应用到真正的 DOM 树。
  5. 好处:
  6. 1、性能优化
  7. 2、无需手动操作DOM
  8. 3、可以跨平台,服务端渲染等

4.v-for和key的机制

如果不提供key,或者使用索引为key,都采用就地更新机制

如果提供了key,就根据key进行对比,提升对比和更新性能

Vue-Day 02 - 图3

Vue-Day 02 - 图4

二.class 和 style

1.v-bind 对于class和style的增强:动态设置class 和 style

动态修饰样式

1.style:对比语法 :style=”{样式属性名:样式的值}”

样式属性名带横线 1.小驼峰 2.加引号

例如:font-size 1.fontSize 2.’font-size’

  1. <template>
  2. <div>
  3. <!-- style绑定语法::style="对象/数组" -->
  4. <!-- 对象的属性名不能有横线的,这种情况两种方式:第一种使用小驼峰命名,font-size -> fontSize -->
  5. <!-- 第二种方式,给属性名加引号 -->
  6. <!-- 属性值不要忘了单位 -->
  7. <h1 :style="{ 'font-size': '18px', color: 'red' }">hello world!</h1>
  8. </div>
  9. </template>
  10. <script>
  11. export default {
  12. data() {
  13. return {};
  14. },
  15. };
  16. </script>
  17. <style>
  18. </style>

2.class:对象语法::class=”{ 类名: 布尔值 }”

类名有横线,加引号

数组语法::class=”数组”

  1. <template>
  2. <div>
  3. <!-- 类名绑定,语法:class="对象/数组" -->
  4. <!-- :class="{ 类名: 布尔值, 类名2: 布尔值 }" -->
  5. <!-- 可以绑定多个类名 -->
  6. <h1 class="content" :class="{ warning: age <= 18, large: true }">
  7. hello world
  8. </h1>
  9. <!-- 类名绑定数组语法 -->
  10. <!-- :class="['类名1', '类名2']" -->
  11. <h1 :class="['red', 'warning']">byebye world</h1>
  12. </div>
  13. </template>
  14. <script>
  15. export default {
  16. data() {
  17. return {
  18. age: 8,
  19. };
  20. },
  21. };
  22. </script>
  23. <style>
  24. .warning {
  25. color: red;
  26. }
  27. </style>

2.点击切换类代码演示

Vue-Day 02 - 图5

  1. <template>
  2. <div>
  3. <!-- 请实现,点击h1标签,字体变大变红,再点击恢复原状 -->
  4. <h1 :class="{ big: isBig }" @click="isBig = !isBig">hello world</h1>
  5. </div>
  6. </template>
  7. <script>
  8. export default {
  9. data() {
  10. return {
  11. isBig: false,
  12. };
  13. },
  14. };
  15. </script>
  16. <style>
  17. .big {
  18. color: red;
  19. font-size: 100px;
  20. }
  21. </style>

三.计算属性

1.计算属性

1.计算属性: 一个特殊属性, 值依赖于另外一些数据动态计算出来。

2.注意:

a. 计算属性必须定义在 computed 节点中
b. 计算属性必须是一个 function,计算属性必须有返回值
c. 计算属性不能被当作方法调用, 要作为属性来用

作用:

声明在computed对象里

简写:声明为一个函数

3.计算属性特点?
1 计算后会立刻缓存,下次直接读缓存
2 依赖项改变, 函数会重新执行 并 重新缓存
多次使用计算属性,性能会极高

  1. <template>
  2. <div>
  3. <span>年龄{{age}}</span>
  4. <button @click="year = year - 1">+1 岁</button>
  5. </div>
  6. </template>
  7. <script>
  8. export default {
  9. name: 'App',
  10. data(){
  11. return{
  12. year:2000,
  13. };
  14. },
  15. computed:{
  16. age(){
  17. const date = new Date();
  18. return date.getFullYear() - this.year;
  19. }
  20. }
  21. }
  22. </script>
  23. <style>
  24. </style>

2.计算属性的缓存说明

计算属性, 基于依赖项的值进行缓存,依赖的变量不变, 都直接从缓存取结果。
计算属性如果被多次使用,性能极高

3.完整写法

完整写法:声明为一个对象

get 读取计算属性的值的时候触发 return 一个值

set 修改计算属性的时候触发 第一个参数是修改的值

Vue-Day 02 - 图6

  1. <template>
  2. <div>
  3. <span>年龄{{age}}</span>
  4. <button @click="age = age + 1">+1 岁</button>
  5. <h3>出生年份:{{year}}</h3>
  6. </div>
  7. </template>
  8. <script>
  9. export default {
  10. name: 'App',
  11. data(){
  12. return{
  13. year:2000,
  14. };
  15. },
  16. computed:{
  17. age:{
  18. get(){
  19. const date = new Date();
  20. return date.getFullYear() - this.year;
  21. },
  22. set(newAge){
  23. const date = new Date();
  24. this.year =date.getFullYear() - newAge;
  25. }
  26. }
  27. }
  28. }
  29. </script>
  30. <style>
  31. </style>

四.侦听器

1.侦听器 watch

简写:

Vue-Day 02 - 图7

  1. <template>
  2. <div>
  3. <!-- 侦听器 作用:监听数据变化 -->
  4. <span>
  5. {{count}}
  6. </span>
  7. <button @click="count++">加一</button>
  8. </div>
  9. </template>
  10. <script>
  11. export default {
  12. data(){
  13. return{
  14. count:100,
  15. }
  16. },
  17. watch:{
  18. // newVal 是新值 oldVal是旧值
  19. count(newVal,oldVal){
  20. console.log(newVal,oldVal);
  21. }
  22. }
  23. }
  24. </script>
  25. <style>
  26. </style>

2.侦听器:深度侦听和立即执行

如果监听的是复杂数据类型,需要深度监听,需要指定deep为true, 需要用到监听的完整的写法

完整的写法:

Vue-Day 02 - 图8