统计
  • 文章总数:88 篇
  • 评论总数:242 条
  • 分类总数:6 个
  • 最后更新:3月31日

Vue 学习第二天

本文阅读 12 分钟
首页 技术交流 正文

Test

day02

一、今日学习目标

1.指令补充

  1. 指令修饰符
  2. v-bind对样式增强的操作
  3. v-model应用于其他表单元素

2.computed计算属性

  1. 基础语法
  2. 计算属性vs方法
  3. 计算属性的完整写法
  4. 成绩案例

3.watch侦听器

  1. 基础写法
  2. 完整写法

4.综合案例 (演示)

  1. 渲染 / 删除 / 修改数量 / 全选 / 反选 / 统计总价 / 持久化

二、指令修饰符

1.什么是指令修饰符?

​ 所谓指令修饰符就是通过“.”指明一些指令后缀 不同的后缀封装了不同的处理操作 —> 简化代码

2.按键修饰符

  • @keyup.enter —>当点击enter键的时候才触发

代码演示:

  1. <div id="app">
  2. <h3>@keyup.enter → 监听键盘回车事件</h3>
  3. <input v-model="username" type="text">
  4. </div>
  5. <script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
  6. <script>
  7. const app = new Vue({
  8. el: '#app',
  9. data: {
  10. username: ''
  11. },
  12. methods: {
  13. }
  14. })
  15. </script>

3.v-model修饰符

  • v-model.trim —>去除首位空格
  • v-model.number —>转数字

4.事件修饰符

  • @事件名.stop —> 阻止冒泡
  • @事件名.prevent —>阻止默认行为
  • @事件名.stop.prevent —>可以连用 即阻止事件冒泡也阻止默认行为
  1. <style>
  2. .father {
  3. width: 200px;
  4. height: 200px;
  5. background-color: pink;
  6. margin-top: 20px;
  7. }
  8. .son {
  9. width: 100px;
  10. height: 100px;
  11. background-color: skyblue;
  12. }
  13. </style>
  14. <div id="app">
  15. <h3>v-model修饰符 .trim .number</h3>
  16. 姓名:<input v-model="username" type="text"><br>
  17. 年纪:<input v-model="age" type="text"><br>
  18. <h3>@事件名.stop → 阻止冒泡</h3>
  19. <div @click="fatherFn" class="father">
  20. <div @click="sonFn" class="son">儿子</div>
  21. </div>
  22. <h3>@事件名.prevent → 阻止默认行为</h3>
  23. <a @click href="http://www.baidu.com">阻止默认行为</a>
  24. </div>
  25. <script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
  26. <script>
  27. const app = new Vue({
  28. el: '#app',
  29. data: {
  30. username: '',
  31. age: '',
  32. },
  33. methods: {
  34. fatherFn () {
  35. alert('老父亲被点击了')
  36. },
  37. sonFn (e) {
  38. // e.stopPropagation()
  39. alert('儿子被点击了')
  40. }
  41. }
  42. })
  43. </script>

三、v-bind对样式控制的增强-操作class

为了方便开发者进行样式控制, Vue 扩展了 v-bind 的语法,可以针对 class 类名style 行内样式 进行控制 。

1.语法:

  1. <div> :class = "对象/数组">这是一个div</div>

2.对象语法

当class动态绑定的是对象时,键就是类名,值就是布尔值,如果值是true,就有这个类,否则没有这个类

  1. <div class="box" :class="{ 类名1: 布尔值, 类名2: 布尔值 }"></div>

​ 适用场景:一个类名,来回切换

3.数组语法

当class动态绑定的是数组时 → 数组中所有的类,都会添加到盒子上,本质就是一个 class 列表

  1. <div class="box" :class="[ 类名1, 类名2, 类名3 ]"></div>

使用场景:批量添加或删除类

4.代码练习

  1. <style>
  2. .box {
  3. width: 200px;
  4. height: 200px;
  5. border: 3px solid #000;
  6. font-size: 30px;
  7. margin-top: 10px;
  8. }
  9. .pink {
  10. background-color: pink;
  11. }
  12. .big {
  13. width: 300px;
  14. height: 300px;
  15. }
  16. </style>
  17. <div id="app">
  18. <!--绑定对象-->
  19. <div class="box">黑马程序员</div>
  20. <!--绑定数组-->
  21. <div class="box">黑马程序员</div>
  22. </div>
  23. <script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
  24. <script>
  25. const app = new Vue({
  26. el: '#app',
  27. data: {
  28. }
  29. })
  30. </script>

四、京东秒杀-tab栏切换导航高亮

1.需求:

​ 当我们点击哪个tab页签时,哪个tab页签就高亮

2.准备代码:

  1. <style>
  2. * {
  3. margin: 0;
  4. padding: 0;
  5. }
  6. ul {
  7. display: flex;
  8. border-bottom: 2px solid #e01222;
  9. padding: 0 10px;
  10. }
  11. li {
  12. width: 100px;
  13. height: 50px;
  14. line-height: 50px;
  15. list-style: none;
  16. text-align: center;
  17. }
  18. li a {
  19. display: block;
  20. text-decoration: none;
  21. font-weight: bold;
  22. color: #333333;
  23. }
  24. li a.active {
  25. background-color: #e01222;
  26. color: #fff;
  27. }
  28. </style>
  29. <div id="app">
  30. <ul>
  31. <li><a class="active" href="#">京东秒杀</a></li>
  32. <li><a href="#">每日特价</a></li>
  33. <li><a href="#">品类秒杀</a></li>
  34. </ul>
  35. </div>
  36. <script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
  37. <script>
  38. const app = new Vue({
  39. el: '#app',
  40. data: {
  41. list: [
  42. { id: 1, name: '京东秒杀' },
  43. { id: 2, name: '每日特价' },
  44. { id: 3, name: '品类秒杀' }
  45. ]
  46. }
  47. })
  48. </script>

3.思路:

1.基于数据,动态渲染tab(v-for)

2.准备一个下标 记录高亮的是哪一个 tab

3.基于下标动态切换class的类名

五、v-bind对有样式控制的增强-操作style

1.语法

  1. <div class="box" :style="{ CSS属性名1: CSS属性值, CSS属性名2: CSS属性值 }"></div>

2.代码练习

  1. <style>
  2. .box {
  3. width: 200px;
  4. height: 200px;
  5. background-color: rgb(187, 150, 156);
  6. }
  7. </style>
  8. <div id="app">
  9. <div class="box"></div>
  10. </div>
  11. <script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
  12. <script>
  13. const app = new Vue({
  14. el: '#app',
  15. data: {
  16. }
  17. })
  18. </script>

3.进度条案例

  1. <style>
  2. .progress {
  3. height: 25px;
  4. width: 400px;
  5. border-radius: 15px;
  6. background-color: #272425;
  7. border: 3px solid #272425;
  8. box-sizing: border-box;
  9. margin-bottom: 30px;
  10. }
  11. .inner {
  12. width: 50%;
  13. height: 20px;
  14. border-radius: 10px;
  15. text-align: right;
  16. position: relative;
  17. background-color: #409eff;
  18. background-size: 20px 20px;
  19. box-sizing: border-box;
  20. transition: all 1s;
  21. }
  22. .inner span {
  23. position: absolute;
  24. right: -20px;
  25. bottom: -25px;
  26. }
  27. </style>
  28. <div id="app">
  29. <div class="progress">
  30. <div class="inner">
  31. <span>50%</span>
  32. </div>
  33. </div>
  34. <button>设置25%</button>
  35. <button>设置50%</button>
  36. <button>设置75%</button>
  37. <button>设置100%</button>
  38. </div>
  39. <script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
  40. <script>
  41. const app = new Vue({
  42. el: '#app',
  43. data: {
  44. }
  45. })
  46. </script>

六、v-model在其他表单元素的使用

1.讲解内容:

常见的表单元素都可以用 v-model 绑定关联 → 快速 获取设置 表单元素的值

它会根据 控件类型 自动选取 正确的方法 来更新元素

  1. 输入框 input:text ——> value
  2. 文本域 textarea ——> value
  3. 复选框 input:checkbox ——> checked
  4. 单选框 input:radio ——> checked
  5. 下拉菜单 select ——> value
  6. ...

2.代码准备

  1. <style>
  2. textarea {
  3. display: block;
  4. width: 240px;
  5. height: 100px;
  6. margin: 10px 0;
  7. }
  8. </style>
  9. <div id="app">
  10. <h3>小黑学习网</h3>
  11. 姓名:
  12. <input type="text">
  13. <br><br>
  14. 是否单身:
  15. <input type="checkbox">
  16. <br><br>
  17. <!--
  18. 前置理解:
  19. 1. name: 给单选框加上 name 属性 可以分组 → 同一组互相会互斥
  20. 2. value: 给单选框加上 value 属性,用于提交给后台的数据
  21. 结合 Vue 使用 → v-model
  22. -->
  23. 性别:
  24. <input type="radio">
  25. <input type="radio">
  26. <br><br>
  27. <!--
  28. 前置理解:
  29. 1. option 需要设置 value 值,提交给后台
  30. 2. select 的 value 值,关联了选中的 option 的 value 值
  31. 结合 Vue 使用 → v-model
  32. -->
  33. 所在城市:
  34. <select>
  35. <option>北京</option>
  36. <option>上海</option>
  37. <option>成都</option>
  38. <option>南京</option>
  39. </select>
  40. <br><br>
  41. 自我描述:
  42. <textarea></textarea>
  43. <button>立即注册</button>
  44. </div>
  45. <script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
  46. <script>
  47. const app = new Vue({
  48. el: '#app',
  49. data: {
  50. }
  51. })
  52. </script>

七、computed计算属性

1.概念

基于现有的数据,计算出来的新属性依赖的数据变化,自动重新计算。

2.语法

  1. 声明在 computed 配置项中,一个计算属性对应一个函数
  2. 使用起来和普通属性一样使用 {{ 计算属性名}}

3.注意

  1. computed配置项和data配置项是同级
  2. computed中的计算属性虽然是函数的写法,但他依然是个属性
  3. computed中的计算属性不能和data中的属性同名
  4. 使用computed中的计算属性和使用data中的属性是一样的用法
  5. computed中计算属性内部的this依然指向的是Vue实例

4.案例

比如我们可以使用计算属性实现下面这个业务场景

68203932785

5.代码准备

  1. <style>
  2. table {
  3. border: 1px solid #000;
  4. text-align: center;
  5. width: 240px;
  6. }
  7. th,td {
  8. border: 1px solid #000;
  9. }
  10. h3 {
  11. position: relative;
  12. }
  13. </style>
  14. <div id="app">
  15. <h3>小黑的礼物清单</h3>
  16. <table>
  17. <tr>
  18. <th>名字</th>
  19. <th>数量</th>
  20. </tr>
  21. <tr v-for="(item, index) in list" :key="item.id">
  22. <td>{{ item.name }}</td>
  23. <td>{{ item.num }}个</td>
  24. </tr>
  25. </table>
  26. <!-- 目标:统计求和,求得礼物总数 -->
  27. <p>礼物总数:? 个</p>
  28. </div>
  29. <script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
  30. <script>
  31. const app = new Vue({
  32. el: '#app',
  33. data: {
  34. // 现有的数据
  35. list: [
  36. { id: 1, name: '篮球', num: 1 },
  37. { id: 2, name: '玩具', num: 2 },
  38. { id: 3, name: '铅笔', num: 5 },
  39. ]
  40. }
  41. })
  42. </script>

八、computed计算属性 VS methods方法

1.computed计算属性

作用:封装了一段对于数据的处理,求得一个结果

语法:

  1. 写在computed配置项中
  2. 作为属性,直接使用

    • js中使用计算属性: this.计算属性
    • 模板中使用计算属性:{{计算属性}}

2.methods计算属性

作用:给Vue实例提供一个方法,调用以处理业务逻辑

语法:

  1. 写在methods配置项中
  2. 作为方法调用

    • js中调用:this.方法名()
    • 模板中调用 {{方法名()}} 或者 @事件名=“方法名”

3.计算属性的优势

  1. 缓存特性(提升性能)

    计算属性会对计算出来的结果缓存,再次使用直接读取缓存,

    依赖项变化了,会自动重新计算 → 并再次缓存

  2. methods没有缓存特性
  3. 通过代码比较
  1. <style>
  2. table {
  3. border: 1px solid #000;
  4. text-align: center;
  5. width: 300px;
  6. }
  7. th,td {
  8. border: 1px solid #000;
  9. }
  10. h3 {
  11. position: relative;
  12. }
  13. span {
  14. position: absolute;
  15. left: 145px;
  16. top: -4px;
  17. width: 16px;
  18. height: 16px;
  19. color: white;
  20. font-size: 12px;
  21. text-align: center;
  22. border-radius: 50%;
  23. background-color: #e63f32;
  24. }
  25. </style>
  26. <div id="app">
  27. <h3>小黑的礼物清单🛒<span>?</span></h3>
  28. <table>
  29. <tr>
  30. <th>名字</th>
  31. <th>数量</th>
  32. </tr>
  33. <tr v-for="(item, index) in list" :key="item.id">
  34. <td>{{ item.name }}</td>
  35. <td>{{ item.num }}个</td>
  36. </tr>
  37. </table>
  38. <p>礼物总数:{{ totalCount }} 个</p>
  39. </div>
  40. <script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
  41. <script>
  42. const app = new Vue({
  43. el: '#app',
  44. data: {
  45. // 现有的数据
  46. list: [
  47. { id: 1, name: '篮球', num: 3 },
  48. { id: 2, name: '玩具', num: 2 },
  49. { id: 3, name: '铅笔', num: 5 },
  50. ]
  51. },
  52. computed: {
  53. totalCount () {
  54. let total = this.list.reduce((sum, item) => sum + item.num, 0)
  55. return total
  56. }
  57. }
  58. })
  59. </script>

4.总结

1.computed有缓存特性,methods没有缓存

2.当一个结果依赖其他多个值时,推荐使用计算属性

3.当处理业务逻辑时,推荐使用methods方法,比如事件的处理函数

九、计算属性的完整写法

既然计算属性也是属性,能访问,应该也能修改了?

  1. 计算属性默认的简写,只能读取访问,不能 "修改"
  2. 如果要 "修改" → 需要写计算属性的完整写法

68204182296

完整写法代码演示

  1. <div id="app">
  2. 姓:<input type="text" v-model="firstName"> +
  3. 名:<input type="text" v-model="lastName"> =
  4. <span></span><br><br>
  5. <button>改名卡</button>
  6. </div>
  7. <script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
  8. <script>
  9. const app = new Vue({
  10. el: '#app',
  11. data: {
  12. firstName: '刘',
  13. lastName: '备'
  14. },
  15. computed: {
  16. },
  17. methods: {
  18. }
  19. })
  20. </script>

十、综合案例-成绩案例

68204248931

功能描述:

1.渲染功能

2.删除功能

3.添加功能

4.统计总分,求平均分

思路分析:

1.渲染功能 v-for :key v-bind:动态绑定class的样式

2.删除功能 v-on绑定事件, 阻止a标签的默认行为

3.v-model的修饰符 .trim、 .number、 判断数据是否为空后 再添加、添加后清空文本框的数据

4.使用计算属性computed 计算总分和平均分的值

十一、watch侦听器(监视器)

1.作用:

监视数据变化,执行一些业务逻辑或异步操作

2.语法:

  1. watch同样声明在跟data同级的配置项中
  2. 简单写法: 简单类型数据直接监视
  3. 完整写法:添加额外配置项

    1. data: {
    2.   words: '苹果',
    3.   obj: {
    4.     words: '苹果'
    5.   }
    6. },
    7. watch: {
    8. // 该方法会在数据变化时,触发执行
    9.   数据属性名 (newValue, oldValue) {
    10. 一些业务逻辑 或 异步操作。
    11. },
    12. '对象.属性名' (newValue, oldValue) {
    13. 一些业务逻辑 或 异步操作。
    14. }
    15. }

3.侦听器代码准备

  1. <style>
  2. * {
  3. margin: 0;
  4. padding: 0;
  5. box-sizing: border-box;
  6. font-size: 18px;
  7. }
  8. #app {
  9. padding: 10px 20px;
  10. }
  11. .query {
  12. margin: 10px 0;
  13. }
  14. .box {
  15. display: flex;
  16. }
  17. textarea {
  18. width: 300px;
  19. height: 160px;
  20. font-size: 18px;
  21. border: 1px solid #dedede;
  22. outline: none;
  23. resize: none;
  24. padding: 10px;
  25. }
  26. textarea:hover {
  27. border: 1px solid #1589f5;
  28. }
  29. .transbox {
  30. width: 300px;
  31. height: 160px;
  32. background-color: #f0f0f0;
  33. padding: 10px;
  34. border: none;
  35. }
  36. .tip-box {
  37. width: 300px;
  38. height: 25px;
  39. line-height: 25px;
  40. display: flex;
  41. }
  42. .tip-box span {
  43. flex: 1;
  44. text-align: center;
  45. }
  46. .query span {
  47. font-size: 18px;
  48. }
  49. .input-wrap {
  50. position: relative;
  51. }
  52. .input-wrap span {
  53. position: absolute;
  54. right: 15px;
  55. bottom: 15px;
  56. font-size: 12px;
  57. }
  58. .input-wrap i {
  59. font-size: 20px;
  60. font-style: normal;
  61. }
  62. </style>
  63. <div id="app">
  64. <!-- 条件选择框 -->
  65. <div class="query">
  66. <span>翻译成的语言:</span>
  67. <select>
  68. <option value="italy">意大利</option>
  69. <option value="english">英语</option>
  70. <option value="german">德语</option>
  71. </select>
  72. </div>
  73. <!-- 翻译框 -->
  74. <div class="box">
  75. <div class="input-wrap">
  76. <textarea v-model="words"></textarea>
  77. <span><i>⌨️</i>文档翻译</span>
  78. </div>
  79. <div class="output-wrap">
  80. <div class="transbox">mela</div>
  81. </div>
  82. </div>
  83. </div>
  84. <script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
  85. <script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
  86. <script>
  87. // 接口地址:https://applet-base-api-t.itheima.net/api/translate
  88. // 请求方式:get
  89. // 请求参数:
  90. // (1)words:需要被翻译的文本(必传)
  91. // (2)lang: 需要被翻译成的语言(可选)默认值-意大利
  92. // -----------------------------------------------
  93. const app = new Vue({
  94. el: '#app',
  95. data: {
  96. words: ''
  97. },
  98. // 具体讲解:(1) watch语法 (2) 具体业务实现
  99. })
  100. </script>

十二、翻译案例-代码实现

  1. <script>
  2. // 接口地址:https://applet-base-api-t.itheima.net/api/translate
  3. // 请求方式:get
  4. // 请求参数:
  5. // (1)words:需要被翻译的文本(必传)
  6. // (2)lang: 需要被翻译成的语言(可选)默认值-意大利
  7. // -----------------------------------------------
  8. const app = new Vue({
  9. el: '#app',
  10. data: {
  11. //words: ''
  12. obj: {
  13. words: ''
  14. },
  15. result: '', // 翻译结果
  16. // timer: null // 延时器id
  17. },
  18. // 具体讲解:(1) watch语法 (2) 具体业务实现
  19. watch: {
  20. // 该方法会在数据变化时调用执行
  21. // newValue新值, oldValue老值(一般不用)
  22. // words (newValue) {
  23. // console.log('变化了', newValue)
  24. // }
  25. 'obj.words' (newValue) {
  26. // console.log('变化了', newValue)
  27. // 防抖: 延迟执行 → 干啥事先等一等,延迟一会,一段时间内没有再次触发,才执行
  28. clearTimeout(this.timer)
  29. this.timer = setTimeout(async () => {
  30. const res = await axios({
  31. url: 'https://applet-base-api-t.itheima.net/api/translate',
  32. params: {
  33. words: newValue
  34. }
  35. })
  36. this.result = res.data.data
  37. console.log(res.data.data)
  38. }, 300)
  39. }
  40. }
  41. })
  42. </script>

十三、watch侦听器

1.语法

完整写法 —>添加额外的配置项

  1. deep:true 对复杂类型进行深度监听
  2. immdiate:true 初始化 立刻执行一次
  1. data: {
  2.   obj: {
  3.     words: '苹果',
  4.     lang: 'italy'
  5.   },
  6. },
  7. watch: {// watch 完整写法
  8.   对象: {
  9. deep: true, // 深度监视
  10. immdiate:true,//立即执行handler函数
  11.     handler (newValue) {
  12.       console.log(newValue)
  13.     }
  14.   }
  15. }

2.需求

68205051572

  • 当文本框输入的时候 右侧翻译内容要时时变化
  • 当下拉框中的语言发生变化的时候 右侧翻译的内容依然要时时变化
  • 如果文本框中有默认值的话要立即翻译

3.代码实现

  1. <script>
  2. const app = new Vue({
  3. el: '#app',
  4. data: {
  5. obj: {
  6. words: '小黑',
  7. lang: 'italy'
  8. },
  9. result: '', // 翻译结果
  10. },
  11. watch: {
  12. obj: {
  13. deep: true, // 深度监视
  14. immediate: true, // 立刻执行,一进入页面handler就立刻执行一次
  15. handler (newValue) {
  16. clearTimeout(this.timer)
  17. this.timer = setTimeout(async () => {
  18. const res = await axios({
  19. url: 'https://applet-base-api-t.itheima.net/api/translate',
  20. params: newValue
  21. })
  22. this.result = res.data.data
  23. console.log(res.data.data)
  24. }, 300)
  25. }
  26. }
  27. }
  28. })
  29. </script>

4.总结

watch侦听器的写法有几种?

1.简单写法

  1. watch: {
  2.   数据属性名 (newValue, oldValue) {
  3. 一些业务逻辑 或 异步操作。
  4. },
  5. '对象.属性名' (newValue, oldValue) {
  6. 一些业务逻辑 或 异步操作。
  7. }
  8. }

2.完整写法

  1. watch: {// watch 完整写法
  2.   数据属性名: {
  3. deep: true, // 深度监视(针对复杂类型)
  4. immediate: true, // 是否立刻执行一次handler
  5.     handler (newValue) {
  6.       console.log(newValue)
  7.     }
  8.   }
  9. }

十四、综合案例

购物车案例

68205100897

需求说明:

  1. 渲染功能
  2. 删除功能
  3. 修改个数
  4. 全选反选
  5. 统计 选中的 总价 和 总数量
  6. 持久化到本地

实现思路:

1.基本渲染: v-for遍历、:class动态绑定样式

2.删除功能 : v-on 绑定事件,获取当前行的id

3.修改个数 : v-on绑定事件,获取当前行的id,进行筛选出对应的项然后增加或减少

4.全选反选

  1. 必须所有的小选框都选中,全选按钮才选中 → every
  2. 如果全选按钮选中,则所有小选框都选中
  3. 如果全选取消,则所有小选框都取消选中

声明计算属性,判断数组中的每一个checked属性的值,看是否需要全部选

5.统计 选中的 总价 和 总数量 :通过计算属性来计算选中的总价和总数量

6.持久化到本地: 在数据变化时都要更新下本地存储 watch

本文来自投稿,不代表本站立场,如若转载,请注明出处:
-- 展开阅读全文 --
节流和防抖
« 上一篇 09-04
JavaScript中find方法
下一篇 » 09-05

发表评论

  • 泡泡
  • 阿呆
  • 阿鲁
  • 蛆音娘
发表评论