博客列表 >01-Vue_常用指令

01-Vue_常用指令

 一纸荒凉* Armani
 一纸荒凉* Armani原创
2021年05月05日 15:22:30779浏览

1.1 指令表

指令 说明
v-cloak 作用:解决插值表达式{{msg}}闪烁的问题<br/>注意:需要配合属性选择器[v-cloak]{display:none;} 使用
v-text 作用:输出文本
v-html 作用:以浏览器能够解析的方式输出
v-bind 格式:v-bind: <br/>简写::属性 <br/>作用:用于绑定属性的指令,可以写合法的JS表达式
v-on 格式:v-on: 简写:@事件 作用:用于绑定事件
v-model 作用:实现双向绑定(M => V, V => M) <br/>注意:只能用在表单元素中
v-for 作用:for 循环
v-if v-else-if v-else 作用:根据条件展示元素 缺点:直接对DOM节点进行删除和添加,有较高的性能消耗<br/> 建议:若元素并非频繁切换,推荐使用v-if
v-show 作用:根据条件展示元素 <br/>缺点:对元素进行 display 操作,有较高的初始渲染消耗<br/>建议:若元素需要频繁的切换,建议使用v-show

1.1.0 基本的代码结构

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6. <title>Document</title>
  7. <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
  8. </head>
  9. <body>
  10. <div id="app">
  11. {{msg}}
  12. </div>
  13. <script>
  14. var vm = new Vue({
  15. el: '#app',
  16. data: {
  17. msg: 'Study',
  18. text: '<strong>加粗了呀</strong>',
  19. num: 0,
  20. flag: 'A',
  21. list: [
  22. { id: 1, name: '小炎' },
  23. { id: 2, name: '小天' },
  24. { id: 3, name: '小若' },
  25. { id: 4, name: '小修' },
  26. { id: 5, name: '小瑞' }
  27. ]
  28. },
  29. methods: {
  30. btn(){
  31. alert('click')
  32. }
  33. }
  34. })
  35. </script>
  36. </body>
  37. </html>

1.1.1 v-cloak

  1. <!-- CSS Code -->
  2. <style>
  3. [v-cloak] {
  4. display: none;
  5. }
  6. </style>
  7. <!-- Html Code -->
  8. <div id="app">
  9. <!-- 插值表达式 -->
  10. <!-- v-clock 解决插值表达式闪烁问题 -->
  11. <p v-cloak>{{ msg }}</p>
  12. </div>
  13. <!-- Script Code -->
  14. <!-- 为了方便演示,所以不在头部引入 Vue ,而是在这里 -->
  15. <script src='https://cdn.staticfile.org/vue/2.6.9/vue.min.js'></script>
  • 打开浏览器调试工具,按如下顺序:Network -> Presets(Disable cache 右边) -> show 3G 勾上
  • 运行后发现,当 Vue 还没完全加载完成时,会直接把源代码给显示出来。

因为我们的网络不稳定,导致了 Vue 还未加载完成,而 DOM 就已经渲染完了,此时用户最先看到的自然是 DOM 元素。

1.1.2 v-text

  1. <!-- Html Code -->
  2. <div id="app">
  3. <!-- 不会解析html标签 -->
  4. <p v-text="text"></p>
  5. </div>

1.1.3 v-html

  1. <!-- Html Code -->
  2. <div id="app">
  3. <!-- 不会解析html标签 -->
  4. <p v-text="text"></p>
  5. <!-- 可以解析HTML标签 -->
  6. <p v-html="text"></p>
  7. </div>

1.1.4 bind

  1. <!-- Html Code -->
  2. <div id="app">
  3. <!-- v-bind: 是vue中用于绑定属性的指令 -->
  4. <p v-bind:title="msg" class="title">TITLE</p>
  5. <!-- v-bind: 中可以书写合法的js表达式 -->
  6. <p v-bind:title="msg" class="'my '+title">TITLE</p>
  7. <!-- v-bind: 可以简写为冒号:要绑定的属性 -->
  8. <p v-bind:title="msg" class="'my '+title">TITLE</p>
  9. </div>

1.1.5 v-on

  1. <!-- Html Code -->
  2. <div id="app">
  3. <!-- v-on: 绑定事件-->
  4. <!-- 点击触发btn方法 -->
  5. <button v-on:click='btn'>单击</button>
  6. </div>

跑马灯效果案例

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6. <title>跑马灯</title>
  7. <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
  8. </head>
  9. <body>
  10. <div id="app">
  11. <input type="button" value="浪起来" @click="lang">
  12. <input type="button" value="低调" @click="stop">
  13. <p v-html="msg"></p>
  14. </div>
  15. <script>
  16. const vm = new Vue({
  17. el:'#app',
  18. data: {
  19. msg: '猥琐发育,别浪~~!!!',
  20. intervalId: null,
  21. },
  22. methods: {
  23. lang(){
  24. if(this.intervalId != null)return;
  25. this.intervalId = setInterval(()=>{
  26. // 获取到头的第一个字符
  27. let start = this.msg.substring(0,1);
  28. // 获取到后面所有的字符
  29. let end = this.msg.substring(1);
  30. // 将第一个字符放到最后面
  31. this.msg = end+start;
  32. },400)
  33. },
  34. stop(){
  35. clearInterval(this.intervalId);
  36. this.intervalId = null;
  37. }
  38. }
  39. });
  40. </script>
  41. </body>
  42. </html>

1.1.6 v-model

v-model 指令通过绑定值和捕获 input 事件来模拟双向绑定,它能轻松实现表单输入和应用状态之间的数据双向绑定。

  1. <!-- 双向绑定:实时更新 -->
  2. <input :value="num" @input="e => num = e.target.value">
  3. <textarea :value="num" @input="e => num = e.target.value"></textarea>
  4. <p v-text="msg"></p>

v-model 双向绑定 只能用于表单元素

  1. <!-- Html Code -->
  2. <div id="app">
  3. <!-- v-bind只能实现数据的单向绑定 -->
  4. <input v-bind:value="num" >
  5. <!-- 双向绑定:实时更新 -->
  6. <input v-model="num" >
  7. <p v-text="num"></p>
  8. <!-- 双向绑定:延迟更新 修饰符lazy -->
  9. <input v-model.lazy="num" >
  10. <!-- 相当于失去焦点时才触发更新操作 -->
  11. <p v-text="num"></p>
  12. </div>

简易计算器案例

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6. <title>简易的计算器</title>
  7. <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
  8. </head>
  9. <body>
  10. <div id="app">
  11. <input type="text" v-model="x">
  12. <select v-model="opt">
  13. <option value="+">+</option>
  14. <option value="-">-</option>
  15. <option value="*">*</option>
  16. <option value="/">/</option>
  17. </select>
  18. <input type="text" v-model="y">
  19. <input type="button" value="=" @click="calc">
  20. <input type="text" v-model="result">
  21. </div>
  22. <script>
  23. const vm = new Vue({
  24. el: '#app',
  25. data: {
  26. x: 0,
  27. y: 0,
  28. result: 0,
  29. opt: '+',
  30. },
  31. methods: {
  32. calc() {
  33. /*switch (this.opt) {
  34. case '+':
  35. this.result = parseInt(this.x) + parseInt(this.y);
  36. break;
  37. case '-':
  38. this.result = parseInt(this.x) - parseInt(this.y);
  39. break;
  40. case '*':
  41. this.result = parseInt(this.x) * parseInt(this.y);
  42. break;
  43. case '/':
  44. this.result = parseInt(this.x) / parseInt(this.y);
  45. break;
  46. }*/
  47. let codeStr = `parseInt(this.x) ${this.opt} parseInt(this.y)`;
  48. this.result = eval(codeStr);
  49. }
  50. }
  51. });
  52. </script>
  53. </body>
  54. </html>

1.1.7 v-for

  1. <!-- Html Code -->
  2. <div id="app">
  3. <ul v-for="item in list" :key="item.id">
  4. <li>
  5. <input type="checkbox" /> 【id】:{{item.id}} -- 【姓名】:{{item.name}}
  6. </li>
  7. </ul>
  8. </div>

Vue指令之v-forkey属性

  1. 迭代数组
  1. <ul> <li v-for="(item, i) in list">索引:{{i}} --- 姓名:{{item.name}} --- 年龄:{{item.age}}</li></ul>
  1. 迭代对象中的属性
  1. <ul>
  2. <li v-for="(item, i) in list">索引:{{i}} --- 姓名:{{item.name}} --- 年龄:{{item.age}}</li>
  3. </ul>
  1. 迭代数字
  1. <p v-for="i in 10">这是第 {{i}} 个P标签</p>

2.2.0+ 的版本里,当在组件中使用 v-for 时,key 现在是必须的。

v-for 中未设置 key 的问题

从这幅GIF中,我们可以很清楚的看到,一开始选择的是5号,然后 unshift() 后,复选框选择的位置依然没有跟着变动,而是在原位置一动不动。

当 Vue.js 用 v-for 正在更新已渲染过的元素列表时,它默认用 “就地复用” 策略。如果数据项的顺序被改变,Vue将不是移动 DOM 元素来匹配数据项的顺序, 而是简单复用此处每个元素,并且确保它在特定索引下显示已被渲染过的每个元素。

为了给 Vue 一个提示,以便它能跟踪每个节点的身份,从而重用和重新排序现有元素,你需要为每项提供一个唯一 key 属性。

解决这个问题,添加一个key即可,需要v-bind绑定

  1. <ul>
  2. <li v-for="item in list" :key="item.id">
  3. <input type="checkbox" />
  4. 【id】:{{item.id}} -- 【姓名】:{{item.name}}
  5. </li>
  6. </ul>

1.1.8 v-if / v-else-if / v-else

  1. <!-- Html Code -->
  2. <div id="app">
  3. <p v-if="flag === 'A'">A</p>
  4. <p v-else-if="flag === 'B'">B</p>
  5. <p v-else>C</p>
  6. </div>

1.1.9 v-show

  1. <!-- Html Code -->
  2. <div id="app">
  3. <p v-show="flag">A</p>
  4. </div>

v-if 的特点:每次都会重新删除或创建元素

v-show的特点:每次不会重新进行DOM的删除和创建操作,只是切换了元素的display:none样式

v-if 有较高的切换性能消耗,v-show有较高的初始渲染消耗,如果元素涉及到频繁的切换,最好使用v-show,但如果元素可能永远也不会被用户看到,则推荐使用v-if指令

选项卡切换案例

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6. <meta http-equiv="X-UA-Compatible" content="ie=edge">
  7. <title>Document</title>
  8. <style>
  9. * {
  10. margin: 0;
  11. padding: 0;
  12. }
  13. .vertical-tab {
  14. width: 920px;
  15. margin: 100px auto;
  16. }
  17. .vertical-tab .nav {
  18. list-style: none;
  19. width: 200px;
  20. }
  21. .vertical-tab .nav-tabs1 {
  22. border-right: 3px solid #e7e7e7;
  23. }
  24. .vertical-tab .nav-tabs2 {
  25. border-left: 3px solid #e7e7e7;
  26. }
  27. .vertical-tab .nav a {
  28. display: block;
  29. font-size: 18px;
  30. font-weight: 700;
  31. text-align: center;
  32. letter-spacing: 1px;
  33. text-transform: uppercase;
  34. padding: 10px 20px;
  35. margin: 0 0 1px 0;
  36. text-decoration: none;
  37. }
  38. .vertical-tab .tab-content {
  39. color: #555;
  40. background-color: #fff;
  41. font-size: 15px;
  42. letter-spacing: 1px;
  43. line-height: 23px;
  44. padding: 10px 15px 10px 25px;
  45. display: table-cell;
  46. position: relative;
  47. }
  48. .vertical-tab .nav-tabs1 {
  49. float: left;
  50. }
  51. .vertical-tab .tabs {
  52. width: 500px;
  53. box-sizing: border-box;
  54. float: left;
  55. }
  56. .vertical-tab .tab-content h3 {
  57. font-weight: 600;
  58. text-transform: uppercase;
  59. margin: 0 0 5px 0;
  60. }
  61. .vertical-tab .nav-tabs2 {
  62. float: right;
  63. }
  64. .tab-content {
  65. position: relative;
  66. }
  67. .tab-content .tab-pane {
  68. position: absolute;
  69. top: 10px;
  70. left: 20px;
  71. }
  72. .nav li.active a {
  73. color: #198df8;
  74. background: #fff;
  75. border: none;
  76. }
  77. .fade {
  78. opacity: 0;
  79. transition: all .3s linear;
  80. }
  81. .fade.active {
  82. opacity: 1;
  83. }
  84. </style>
  85. </head>
  86. <body>
  87. <div class="vertical-tab" id="app">
  88. <!-- Nav tabs -->
  89. <ul class="nav nav-tabs1">
  90. <li v-on:click='change(index,0)' :class='currentIndex==index?"active":""' v-if="index < list.length/2" v-for="(item, index) in list"><a href="#"> {{item.title}} </a></li>
  91. </ul>
  92. <!-- Tab panes -->
  93. <div class="tab-content tabs">
  94. <div class="tab-pane fade" :class='currentIndex==index?"active":""' :key='item.id' v-for='(item, index) in list'>
  95. <h3>{{item.title}}</h3>
  96. <p>{{item.content}}</p>
  97. </div>
  98. </div>
  99. <!-- Nav tabs -->
  100. <ul class="nav nav-tabs2">
  101. <li v-on:click='change(index,1)' :class='currentIndex==index?"active":""' v-if="index >= list.length/2" v-for="(item, index) in list"><a href="#"> {{item.title}} </a></li>
  102. </ul>
  103. </div>
  104. <script type="text/javascript" src="js/vue.js"></script>
  105. <script>
  106. new Vue({
  107. el: "#app",
  108. data: {
  109. currentIndex: 0, // 选项卡当前的索引
  110. list: [{
  111. id: 1,
  112. title: 'Section 1',
  113. content: 'content1'
  114. }, {
  115. id: 2,
  116. title: 'Section 2',
  117. content: 'content2'
  118. }, {
  119. id: 3,
  120. title: 'Section 3',
  121. content: 'content3'
  122. }, {
  123. id: 4,
  124. title: 'Section 4',
  125. content: 'content4'
  126. }, {
  127. id: 5,
  128. title: 'Section 5',
  129. content: 'content5'
  130. }, {
  131. id: 6,
  132. title: 'Section 6',
  133. content: 'content6'
  134. }]
  135. },
  136. methods: {
  137. change(index, flag) {
  138. if (flag) {
  139. console.log(index)
  140. this.currentIndex = index;
  141. } else {
  142. this.currentIndex = index;
  143. }
  144. }
  145. }
  146. })
  147. </script>
  148. </body>

声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议