v-xxx 表示有特定功能,用来操作 dom 元素
    **

    • v-text 默认渲染成文本
    • v-html 渲染成html
    • v-once 只渲染一次,再更改时直接从缓存中获取
    • v-for 遍历 数组、字符串、对象 key : 唯一的值,增加唯一性,避免同一父元素下相同元素复用
    • v-if / v-else / v-else-if 操作 dom 元素 显示/隐藏(一旦条件不成立 dom 元素是不存在的)
    • v-show 更改样式 显示/隐藏
    • v-on 绑定事件 简写 @xxx
      • .stop - 调用 event.stopPropagation()。 阻止冒泡
      • .prevent - 调用 event.preventDefault()。阻止默认行为
      • .capture - 添加事件侦听器时使用 capture 模式。采取捕获方式
      • .self - 只当事件是从侦听器绑定的元素本身触发时才触发回调。 操作是自己才会触发
      • .once - 只触发一次回调。
      • .passive - 模式添加侦听器 处理事件函数中不会调用 preventDefault 函数 ,减少额外的监听,不能与 prevent 同时使用
    • v-bind 绑定动态属性 简写 :
    • v-model 双向绑定
      • .lazy - 取代 input 监听 change 事件,失去焦点 数据更新
      • .number - 输入字符串转为有效的数字
      • .trim - 输入首尾空格过滤
    • 自定义指令

    不要把 v-if 和 v-for 同时用在一个元素上,v-for 的优先级比 v-if 更高

    1. [ 指令 ]
    2. <div id="app" v-show="isShow">
    3. <!-- <span v-text></span> 等同于 {{ msg }} -->
    4. <span v-text="msg"></span>
    5. {{ msg }}
    6. <div v-html="h"></div>
    7. {{ h }}
    8. <p v-once>{{ str }}</p>
    9. <ul v-if="isShow">
    10. <li v-for="(item,index) in arr" key=`${index}_a`>{{ item }}</li>
    11. </ul>
    12. <div v-else> 2333333</div>
    13. <div v-show="isShow">3333333</div>
    14. </div>
    15. <script>
    16. let vm = new Vue({
    17. el: '#app',
    18. data: {
    19. arr: [1, 2, 3, 4, 5],
    20. msg: '我不喜欢这个世界,我只喜欢你!',
    21. h: '<h1>Serendipity</h1>',
    22. str: '时光静好 岁月安然',
    23. isShow: false,
    24. age: 10,
    25. radioVal: "0",
    26. checkVal: false,
    27. },
    28. })
    29. </script>
    30. [ 表单双向绑定 ]
    31. <div class="Ipt" id="app">
    32. <p>
    33. <!-- <input type="text" :value="age" @input="fn"> -->
    34. <!-- 下面这种是上面这种写法的语法糖 -->
    35. <input type="text" v-model.lazy="age">
    36. {{ age }}
    37. </p>
    38. <p>
    39. <!-- 单选按钮 切换按钮时 radioVal 会切换为对应 value 的值 -->
    40. <input type="radio" name="" id="" v-model="radioVal" value="0">
    41. <input type="radio" name="" id="" v-model="radioVal" value="1">
    42. {{ radioVal }}
    43. </p>
    44. <p>
    45. <!-- 单选框 checkVal 根据 true 和 false 判断是否选中 -->
    46. <input type="checkbox" name="" id="" v-model="checkVal">
    47. {{ checkVal }}
    48. </p>
    49. <p>
    50. <!-- 复选框 会把 选中的 value 值 放入到 v-model 绑定的数据中 -->
    51. <input type="checkbox" name="" id="" v-model="checkArr" value="吃饭">吃饭
    52. <input type="checkbox" name="" id="" v-model="checkArr" value="睡觉">睡觉
    53. <input type="checkbox" name="" id="" v-model="checkArr" value="打豆豆">打豆豆
    54. {{ checkArr }}
    55. </p>
    56. <p>
    57. <!-- selectVal 值的获取方式 若 option 有 value 值,则获取 否则 option 里的内容 -->
    58. <select name="" id="" v-model="selectVal">
    59. <option value="0">杭州</option>
    60. <option>厦门</option>
    61. </select>
    62. {{ selectVal }}
    63. </p>
    64. <p>
    65. <!-- 多选下拉菜单 -->
    66. <select name="" id="" v-model="selectArr" multiple>
    67. <option value="0">杭州</option>
    68. <option value="1">合肥</option>
    69. <option value="3">厦门</option>
    70. </select>
    71. {{ selectArr }}
    72. </p>
    73. </div>
    74. <script>
    75. let vm = new Vue({
    76. el: '#app',
    77. data: {
    78. age: 10,
    79. radioVal: "0",
    80. checkVal: false,
    81. checkArr:[],
    82. selectVal: 0,
    83. selectArr: [],
    84. },
    85. })
    86. </script>
    87. [ 事件绑定 ]
    88. <div id="app">
    89. <!-- 冒泡: 由内到外 捕获 : 由外到内 -->
    90. <!-- 采用捕获 ,其他元素还是采用冒泡的方式 -->
    91. <!-- <div @click.capture="parent"> -->
    92. <div @click="parent">
    93. parent
    94. <!-- @click.stop 阻止冒泡 -->
    95. <div @click.stop="son">
    96. son
    97. <!-- prevent 阻止默认行为 self 点击自己的时候才会触发 once 只触发一次 passive 表示阻止默认行为 不能与 prevent 同时使用 -->
    98. <div @click.self="grandSon">
    99. grandSon
    100. </div>
    101. </div>
    102. </div>
    103. </div>
    104. <script>
    105. let vm = new Vue({
    106. el: '#app',
    107. data: {
    108. },
    109. methods: {
    110. // 绑定事件 事件名不要和属性名相同
    111. parent() {
    112. alert('parent')
    113. },
    114. son() {
    115. alert('son')
    116. },
    117. grandSon() {
    118. alert('grandSon')
    119. }
    120. }
    121. })
    122. </script>
    123. [ 自定义指令 ]
    124. <!-- 自定义指令 -->
    125. <div class="custom">
    126. <p>
    127. <input type="text" v-focus.color="col">
    128. </p>
    129. </div>
    130. <script>
    131. // `v-focus` 全局自定义指令
    132. Vue.directive('focus', {
    133. // 指令初始化时调用
    134. bind() {
    135. console.log('初始化');
    136. },
    137. // 当被绑定的元素插入到 DOM 中时……
    138. inserted: function (el, bindings, vnode) { // el 绑定的元素,bindings 指令的参数,vnode 虚拟节点
    139. console.log(bindings);
    140. // 判断有无修饰符 如果有 进行操作
    141. if (bindings.modifiers.color) {
    142. el.style.background = bindings.value
    143. }
    144. Vue.nextTick(() => {
    145. // 聚焦元素
    146. el.focus()
    147. })
    148. },
    149. updata() {
    150. console.log('更新时触发');
    151. },
    152. unbind() {
    153. console.log('指令销毁 指令和绑定元素解绑时');
    154. }
    155. })
    156. let vm = new Vue({
    157. el: '#app',
    158. data: {
    159. col: 'red'
    160. },
    161. methods: {
    162. // 局部自定义指令 只在当前 实例起作用
    163. directives: {
    164. focus: {
    165. // 指令初始化时调用
    166. bind() {
    167. console.log('初始化');
    168. },
    169. // 当被绑定的元素插入到 DOM 中时……
    170. inserted: function (el, bindings, vnode) { // el 绑定的元素,bindings 指令的参数,vnode 虚拟节点
    171. console.log(bindings);
    172. // 判断有无修饰符 如果有 进行操作
    173. if (bindings.modifiers.color) {
    174. el.style.background = bindings.value
    175. }
    176. Vue.nextTick(() => {
    177. // 聚焦元素
    178. el.focus()
    179. })
    180. },
    181. updata() {
    182. console.log('更新时触发');
    183. },
    184. unbind() {
    185. console.log('指令销毁 指令和绑定元素解绑时');
    186. }
    187. }
    188. }
    189. }
    190. })
    191. </script>