Blogger Information
Blog 128
fans 9
comment 5
visits 241320
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
01-Vue_常用指令
 一纸荒凉* Armani
Original
780 people have browsed it

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>

Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
0 comments
Author's latest blog post