当前位置:   article > 正文

Vue.js (包含2.x和3.x) 总结01 (指令、双向绑定、修饰符、事件对象、MVVM)_vue3模版中使用事件对象

vue3模版中使用事件对象

目录

一、vue 是?

MVVM

二、创建

1.Helloword

2. data的两种创建方式

3.视图挂载方式

4.{{}} 模板语法

三、指令

1.v-model

1)什么是双向绑定?

2)双向绑定的原理

2.v-show

3.v-on

例子

4.v-for

5.v-bind  (容易忘记)

例子

6.v-if 条件渲染

1)v-show与v-if 区别

2)v-if与v-else

3)v-else-if

7.v-html

8.v-text

屏幕闪动/闪动

9.v-once

例子

四、修饰符与事件对象

1.事件对象$event

2.修饰符

1) 按键修饰符

2) 事件修饰符

3) v-model修饰符

lazy修饰符

number修饰符

trim修饰符


一、vue 是?

vue是用于构建用户界面的javascript框架。

vue是一个渐进式 自底层向上增量开发MVVM框架。

即先完成项目的基本功能,再使用各种高级的vue插件来完成复杂的功能。

渐进式,就是vue是会做 自己管理的功能 不会影响其他没有管理的范围 所以vue可以很好的和第三方插件结合。

vue的核心就是数据驱动与组件化。

MVVM

M model 模型 存放数据 data

V view 视图 就是用户可以看见的界面

VM viewModel 视图模型 就是关联视图与模型之间的桥梁 用来再数据层和视图层中间进行数据传递(双向绑定

二、创建

1.Helloword

1.npm 下载 vue依赖库 或者可以用cnpm

注意: 如果你要用cnpm 淘宝镜像 需要先安装:

npm install -g cnpm --registry=https://registry.npm.taobao.org

打开cmd,window+r

初始化:

npm init -y

下载 vue包 

2.x

npm install --save vue@2

3.x

npm install --save vue@3

或npm install --save vue

注:查看下载的是哪个版本的包

1.package.json里dependencies下的vue

2.node_modules下的vue下的dist文件夹下的vue.js下的vue的注释中(vue2)

引用vue库文件

vue2

  1. <script src="./node_modules/vue/dist/vue.js"></script>
  2. // 或
  3. <script src="./node_modules/vue/dist/vue.min.js"></script>

vue3

 <script src="./node_modules/vue/dist/vue.global.js"></script>

在vue3中使用createApp()方法来进行创建

注:

切包:package.json里dependencies下的vue中更改2或3,右键在集成终端中打开,输入cnpm install.

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7. <title>Document</title>
  8. <!-- 1.引用vue库文件 -->
  9. <script src="./node_modules/vue/dist/vue.js"></script>
  10. </head>
  11. <body>
  12. <!-- 1.创建视图层 -->
  13. <div id="demo">
  14. <h1>{{text}}</h1>
  15. <h1>{{obj.name}}</h1>
  16. </div>
  17. <h1>外面{{text}}</h1>
  18. <!-- 2.创建vm层 vue实例 -->
  19. <script>
  20. new Vue({
  21. // 关联视图
  22. // el:"#demo",
  23. // 3.创建模型数据
  24. data:{
  25. text:"初一",
  26. age:18,
  27. arr:[111,222,333,444,555],
  28. obj:{
  29. name:"飘飘",
  30. sex:"女"
  31. }
  32. }
  33. }).$mount("#demo")
  34. </script>
  35. </body>
  36. </html>
  1. <body>
  2. <!-- 在vue3中使用createApp()方法来进行创建 -->
  3. <!-- 1.创建视图层 -->
  4. <div id="demoDiv">{{text}}</div>
  5. <script>
  6. // 创建vue实例
  7. Vue.createApp({
  8. // 创建模型数据
  9. // data函数返回一个对象
  10. data(){
  11. return{
  12. text:"hello"
  13. }
  14. }
  15. }).mount("#demoDiv")
  16. // 关联视图
  17. </script>
  18. </body>

2. data的两种创建方式

1.对象式(2.x正常用 )

2.函数式(推荐 2.x与3.x都正常用 )

  1. <body>
  2. <div id="demo">
  3. <h1>{{text}}</h1>
  4. </div>
  5. <script>
  6. let v = new Vue({
  7. // data: {
  8. // text: "我是对象式写法里的变量"
  9. // }
  10. // 函数式data写法
  11. data() {
  12. return {
  13. text: "我是函数式变量写法里的变量"
  14. }
  15. }
  16. })
  17. v.$mount("#demo");
  18. </script>
  19. </body>

3.视图挂载方式

1.el 正常的属性挂载

2.mount 手动挂载(推荐)因为vue是渐进式的,不单单会使用vue的基本内容,还会使用vue的高级插件,但是这些插件需要等待vue加载完才能使用,所以必须要使用mount 延时挂载来解决

4.{{}} 模板语法

把表达式(通过计算返回结果的公式)放到页面中进行展示

  1. <body>
  2. <div id="demo">
  3. <h2>{{text}}</h2>
  4. <em>{{num+1}}</em>
  5. <p>{{demo.toUpperCase()}}</p>
  6. <h3>{{bool?"啊偶":"切"}}</h3>
  7. </div>
  8. <script>
  9. Vue.createApp({
  10. data() {
  11. return {
  12. text: "hello",
  13. num:1234,
  14. demo: "qqwertyuiop",
  15. bool: false
  16. }
  17. }
  18. }).mount("#demo")
  19. </script>
  20. </body>

三、指令

html的属性是用来扩展html标签的功能,它写在html的开标签中,属性="属性值"

指令是在vue中使用v-前缀的html特殊属性,用来在vue中扩展标签的功能

语法: 写在开标签中,v-指令=“指令值”

1.v-model

在表单元素中进行数据的双向绑定

可以用于不同的表单元素

eg: input文本类型,绑定当前元素的value属性,并自动监听input事件。

复选框,自动监听change事件,并设置true或false。

下拉列表,自动监听change事件,并得到对应value值。

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7. <title>Document</title>
  8. <!-- <script src="./node_modules/vue/dist/vue.js"></script> -->
  9. <script src="./node_modules/vue/dist/vue.global.js"></script>
  10. </head>
  11. <body>
  12. <div id="demo">
  13. <!-- 给表单元素完成数据的双向绑定 -->
  14. <input type="text" v-model="inputval" />
  15. <h1>{{inputval}}</h1>
  16. <h1>{{inputval}}</h1>
  17. <!-- 给复选框绑定任何数据,再勾选时,就会修改成布尔值 -->
  18. <input type="checkbox" v-model="hhh">
  19. <h1>{{hhh}}</h1>
  20. <!-- 飘飘 勾选为true,反之false -->
  21. </div>
  22. <script>
  23. Vue.createApp({
  24. data(){
  25. return{
  26. inputval:"",
  27. hhh:"飘飘"
  28. }
  29. }
  30. }).mount("#demo")
  31. </script>
  32. </body>
  33. </html>

1)什么是双向绑定?

视图变模型变:Dom监听(DOM Listener)即view页面改变 ---- dom监听-----通知模型改变

模型变视图变:数据绑定 即data数据改变 ---- 数据绑定触发-----页面视图改变

2)双向绑定的原理

在vue中双向绑定是数据劫持/数据代理配合发布者订阅者模式完成的。

数据劫持/数据代理:

在Vue2中,vue的data在初始化时,便通过Object.defineProperty()来监听,当视图或者模型改变,会通知另外一方进行改变。

在Vue3中使用Proxy 来完成

发布者订阅者模式

一对多 的关系

2.v-show

使用css方式控制元素的显示和隐藏,true为显示,false为隐藏

  1. <body>
  2. <div id="demo">
  3. <h1 v-show="bool">登录</h1>
  4. <h1 v-show="boolone">登录成功</h1>
  5. <hr>
  6. <input type="checkbox" v-model="booltwo">{{booltwo?"显示":"隐藏"}}
  7. <h1 v-show="booltwo">哈哈</h1>
  8. </div>
  9. <script>
  10. Vue.createApp({
  11. data() {
  12. return {
  13. bool: false,
  14. boolone: true,
  15. booltwo: true
  16. }
  17. }
  18. }).mount("#demo")
  19. </script>
  20. </body>

3.v-on

在vue中进行dom事件绑定

语法:

1.传统写法  v-on:事件名不加on     例如:onclick---->  v-on:click="函数"

2.简写 @事件名不加on   例如: onclick---->  @click="函数"

事件处理

1.调用函数方式

2.内联事件方式   eg:  @click="v.edit=!v.edit"

另外,函数写在与data同级的methods里,在函数中使用data数据需要this.变量名。

  1. <body>
  2. <div id="demo">
  3. <button v-on:click="fun()">点击</button>
  4. </div>
  5. <script>
  6. Vue.createApp({
  7. data() {
  8. return {
  9. text: "哈哈"
  10. }
  11. },
  12. // 函数写在与data同级的methods里
  13. // 在函数中使用data数据需要this.变量名
  14. methods: {
  15. fun() {
  16. console.log("qwdfg", this.text)
  17. }
  18. }
  19. }).mount("#demo")
  20. </script>
  21. </body>

例子

输入框中改变原始值,h1中值随之改变,点击h1,输入框消失,再次点击输入框出现,里面是原始值

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7. <title>Document</title>
  8. <script src="./node_modules/vue/dist/vue.global.js"></script>
  9. </head>
  10. <body>
  11. <!-- 输入框中改变原始值,h1中值随之改变,点击h1,输入框消失,再次点击输入框出现,里面是原始值 -->
  12. <div id="demo">
  13. <h1 @click="fun()">{{text}}</h1>
  14. <input type="text" v-model="text" v-show="bool">
  15. </div>
  16. <script>
  17. Vue.createApp({
  18. data(){
  19. return{
  20. text:"hahaha",
  21. bool:true
  22. }
  23. },
  24. methods:{
  25. fun(){
  26. this.text="hahaha";
  27. this.bool=!this.bool;
  28. }
  29. }
  30. }).mount("#demo")
  31. </script>
  32. </body>
  33. </html>

4.v-for

遍历展示data数据

语法:  v-for="(遍历的值 遍历的下标) in 要遍历的数据"

  1. <body>
  2. <div id="demo">
  3. <ul>
  4. <li v-for="(v,i) in arr">{{v}}</li>
  5. </ul>
  6. <hr>
  7. <table border="1">
  8. <tr v-for="(v,i) in arrobj">
  9. <td>{{v.name}}</td>
  10. <td>{{v.age}}</td>
  11. </tr>
  12. </table>
  13. </div>
  14. <script>
  15. Vue.createApp({
  16. data() {
  17. return {
  18. arr: ["ab", "cd", "ef", "gh"],
  19. arrobj:[
  20. {name:"xiaoming1",age:11},
  21. {name:"xiaoming2",age:12},
  22. {name:"xiaoming3",age:13},
  23. {name:"xiaoming4",age:14}
  24. ]
  25. }
  26. }
  27. }).mount("#demo")
  28. </script>
  29. </body>

5.v-bind  (容易忘记)

给html属性插入变量

语法: 传统写法:v-bind:属性="属性值"

         简写::属性="属性值"

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7. <title>Document</title>
  8. <script src="./node_modules/vue/dist/vue.global.js"></script>
  9. </head>
  10. <body>
  11. <div id="demo">
  12. <!-- 传统写法 -->
  13. <a v-bind:href="ahref">{{text}}</a><hr>
  14. <!-- 简写 -->
  15. <a :href="ahref">{{text}}</a>
  16. </div>
  17. <script>
  18. Vue.createApp({
  19. data() {
  20. return {
  21. text: "点击去百度",
  22. ahref: "http://www.baidu.com"
  23. }
  24. }
  25. }).mount("#demo")
  26. </script>
  27. </body>
  28. </html>

例子

点击变色,价格计算

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7. <title>Document</title>
  8. <script src="./node_modules/vue/dist/vue.global.js"></script>
  9. <style>
  10. .cs{background-color: red;}
  11. </style>
  12. </head>
  13. <body>
  14. <!-- 展示数据--点击变色-- -->
  15. <div id="demo">
  16. <h1>计算价格</h1>
  17. <table border="1">
  18. <tr v-for="(v,i) in arr" @click="fun(i)" :class="v.style?'cs':''">
  19. <td>{{v.title}}--{{v.price}}</td>
  20. </tr>
  21. </table>
  22. <p>总价格:{{num}}</p>
  23. </div>
  24. <script>
  25. Vue.createApp({
  26. data() {
  27. return {
  28. num:0,
  29. arr:[
  30. {title:"苹果",price:3,style:false},
  31. {title:"西瓜",price:4,style:false},
  32. {title:"葡萄",price:5,style:false},
  33. {title:"梨",price:2,style:false}
  34. ]
  35. }
  36. },
  37. methods:{
  38. fun(i){
  39. console.log(i);
  40. this.arr[i].style=!this.arr[i].style;
  41. // 判断当前style是否为true,为true做加法,false做减法
  42. if(this.arr[i].style){
  43. this.num+=this.arr[i].price;
  44. }else{
  45. this.num-=this.arr[i].price;
  46. }
  47. }
  48. }
  49. }).mount("#demo")
  50. </script>
  51. </body>
  52. </html>

6.v-if 条件渲染

对页面的dom元素进行添加和移除,true为添加,false为移除。

v-else和v-else-if都必须紧跟在v-if的后面使用(v-else-if可以跟在v-else-if后面)。

页面效果和v-show基本一致,但底层操作不一样。

1)v-show与v-if 区别

1.代码不同

2.v-show是通过css的方式进行显示和隐藏的,v-if是对dom进行添加和移除

3.v-show在初始化时更消耗性能,v-if则好点,v-show在频繁切换时性能更好,v-if性能浪费更高

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7. <title>Document</title>
  8. <script src="./node_modules/vue/dist/vue.global.js"></script>
  9. </head>
  10. <body>
  11. <div id="demo">
  12. <input type="checkbox" v-model="ck">
  13. <h1 v-show="ck">v-show效果</h1>
  14. <h1 v-if="ck">v-if效果</h1>
  15. </div>
  16. <script>
  17. Vue.createApp({
  18. data(){
  19. return{
  20. ck:true
  21. }
  22. }
  23. }).mount("#demo")
  24. </script>
  25. </body>
  26. </html>

2)v-if与v-else

  1. <body>
  2. <div id="demo">
  3. <input type="checkbox" v-model="ck">
  4. <!-- <h1 v-show="ck">v-show效果</h1> -->
  5. <h1 v-if="ck">v-if效果</h1>
  6. <h1 v-else>v-else效果</h1>
  7. </div>
  8. <script>
  9. Vue.createApp({
  10. data(){
  11. return{
  12. ck:true
  13. }
  14. },
  15. methods:{}
  16. }).mount("#demo")
  17. </script>
  18. </body>

3)v-else-if

  1. <body>
  2. <div id="demo">
  3. <select v-model="selectval">
  4. <!-- <option value="发给后台的">给用户看的展示在页面上</option> -->
  5. <option value="苹果">苹果</option>
  6. <option value="西瓜">西瓜</option>
  7. <option value="桃子">桃子</option>
  8. <option value="栗子">栗子</option>
  9. </select>
  10. <h1 v-if="selectval=='苹果'">苹果</h1>
  11. <h1 v-else-if="selectval=='西瓜'">西瓜</h1>
  12. <h1 v-else-if="selectval=='桃子'">桃子</h1>
  13. <h1 v-else-if="selectval=='栗子'">栗子</h1>
  14. <h1 v-else>什么都没有选</h1>
  15. </div>
  16. <script>
  17. Vue.createApp({
  18. data() {
  19. return {
  20. selectval: ""
  21. }
  22. }
  23. }).mount("#demo")
  24. </script>
  25. </body>

7.v-html

把字符串标签进行页面渲染

  1. <body>
  2. <div id="demo">
  3. <div v-html="text" ></div>
  4. </div>
  5. <script>
  6. Vue.createApp({
  7. data() {
  8. return {
  9. text: "<h2>qwertyuiop</h2>"
  10. }
  11. },
  12. methods: {}
  13. }).mount("#demo")
  14. </script>
  15. </body>

8.v-text

向页面插入变量 作用和{{}}一样

  1. <body>
  2. <div id="demo">
  3. <h1>{{text}}</h1>
  4. <h1 v-text="text"></h1>
  5. </div>
  6. <script>
  7. Vue.createApp({
  8. data(){
  9. return {
  10. text:"我是初始值"
  11. }
  12. }
  13. }).mount("#demo")
  14. </script>
  15. </body>

屏幕闪动/闪动

当用户网络较慢,或是被较卡时,可能会出现vue的库文件还没有加载完,但是页面渲染完成。

解决方案1:

就是全部使用v-text替代{{}}   不好用

解决方案2:

使用v-cloak指令(该指令就是防止页面加载时出现vue变量名没有渲染而产生的 )配合css来完成

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7. <title>Document</title>
  8. <script src="./node_modules/vue/dist/vue.global.js"></script>
  9. <style>
  10. [v-cloak]{
  11. display: none;
  12. }
  13. </style>
  14. </head>
  15. <body>
  16. <div id="demo" v-cloak>
  17. <h1>{{text}}</h1>
  18. </div>
  19. <script>
  20. Vue.createApp({
  21. data(){
  22. return {
  23. text:"我是初始值"
  24. }
  25. }
  26. }).mount("#demo")
  27. </script>
  28. </body>
  29. </html>

9.v-once

一次性插值

  1. <body>
  2. <div id="demo">
  3. <input type="text" v-model="text">
  4. <h1>{{text}}</h1>
  5. <h1>{{text}}</h1>
  6. <h1 v-once>{{text}}</h1>
  7. <h1>{{text}}</h1>
  8. <h1>{{text}}</h1>
  9. </div>
  10. <script>
  11. Vue.createApp({
  12. data() {
  13. return {
  14. text: "初始值"
  15. }
  16. }
  17. }).mount("#demo")
  18. </script>
  19. </body>

例子

如图

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7. <title>Document</title>
  8. <script src="./node_modules/vue/dist/vue.global.js"></script>
  9. <style>
  10. li{list-style-type:none;}
  11. .aaa{background-color: red;}
  12. .del{cursor: pointer;}
  13. </style>
  14. </head>
  15. <body>
  16. <div id="demo">
  17. <h1>任务列表</h1>
  18. <p>任务总数:{{arr.length}};还有:{{sheng()}}未完成; <span class="del" v-on:click="del">【完成】</span></p>
  19. <ul v-if="arr.length!=0">
  20. <li v-for="(v,i) in arr">
  21. <!-- 选中后变色 -->
  22. <input type="checkbox" v-model="v.style">
  23. <!-- <input type="text" v-model="v.title" v-if="v.edit" @blur="v.edit=!v.edit">
  24. <span v-bind:class="v.style?'aaa':''" v-else @click="v.edit=!v.edit">{{v.title}}---{{v.style}}</span> -->
  25. <!-- 使用edit(i)函数 @blur 元素失去焦点触发-->
  26. <input type="text" v-model="v.title" v-if="v.edit" @blur="editOne(i)">
  27. <span v-bind:class="v.style?'aaa':''" v-else @click="edit(i)">{{v.title}}</span>
  28. </li>
  29. </ul>
  30. <h3 v-else>暂无任务</h3>
  31. <input type="text" v-model.trim="inputval"><button @click="add()" :disabled="bool">添加</button>
  32. </div>
  33. <script>
  34. Vue.createApp({
  35. data(){
  36. return{
  37. inputval:"",
  38. arr:[
  39. {title:"AAAAA",style:false,edit:false},
  40. {title:"BBBBB",style:false,edit:false},
  41. {title:"CCCCC",style:false,edit:false},
  42. {title:"DDDDD",style:false,edit:false}
  43. ],
  44. bool:true
  45. }
  46. },
  47. methods:{
  48. add(){
  49. // console.log(this.inputval);
  50. //拿到输入框中添加的值,添加至arr数组末尾,添加完成后,输入框中为空
  51. this.arr.push({title:this.inputval,style:false,edit:false});
  52. this.inputval="";
  53. },
  54. sheng(){
  55. let k=0;
  56. // forEach() 方法用于调用数组的每个元素,并将元素传递给回调函数。该方法是对数组的每个元素执行一次给定的函数;他的返回值是 undefined;注意: forEach() 对于空数组是不会执行回调函数的。
  57. this.arr.forEach(v => {
  58. // 判断遍历出的v.style是否恒等于false,是则k++
  59. if(v.style==false){
  60. k++;
  61. }
  62. });
  63. return k
  64. },
  65. del(){
  66. // 1.先创建一个空变量用于临时保存数据
  67. let newarr=[];
  68. // 2.把原数据赋值给这个临时变量
  69. newarr=this.arr;
  70. // 3.把原始数据清空
  71. this.arr=[];
  72. // 4.循环这个临时数据,判断每个值里的style是否等于false,等于false,则把它放在原始数据中
  73. for(var i=0;i<newarr.length;i++){
  74. if(newarr[i].style==false){
  75. this.arr.push(newarr[i]);
  76. }
  77. }
  78. },
  79. edit(i){
  80. // 避免多个输入框出现
  81. this.arr.forEach((item,index)=>{
  82. item.edit=false
  83. });
  84. this.arr[i].edit=!this.arr[i].edit;
  85. },
  86. editOne(i){
  87. // 在输入框失去焦点后,该条数据恢复原始状态(输入框消失)
  88. this.arr[i].edit=false;
  89. }
  90. },
  91. computed:{},
  92. watch:{
  93. // 当输入框中值的长度为0,不可添加
  94. inputval(newval,oldval){
  95. if(this.inputval.length==0){
  96. this.bool=true;
  97. }else{
  98. this.bool=false;
  99. }
  100. }
  101. }
  102. }).mount("#demo")
  103. </script>
  104. </body>
  105. </html>

四、修饰符与事件对象

1.事件对象$event

谁触发这个事件,事件对象就指向谁,事件对象中包含触发这个事件元素相关信息

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7. <title>Document</title>
  8. <script src="./node_modules/vue/dist/vue.global.js"></script>
  9. </head>
  10. <body>
  11. <div id="demo">
  12. <input type="text" @keydown="fun($event)">
  13. </div>
  14. <script>
  15. Vue.createApp({
  16. data() {
  17. return {
  18. }
  19. },
  20. methods:{
  21. fun(e){
  22. if(e.keyCode==13){
  23. console.log("按下了回车");
  24. }
  25. }
  26. }
  27. }).mount("#demo")
  28. </script>
  29. </body>
  30. </html>

2.修饰符

通过vue提供的修饰符可以处理dom时间的一些细节性的内容(对事件的细节进行约束)

v-on:事件.修饰符="函数()"

1) 按键修饰符

.up .down .left .right .ctrl .enter .delete .space .esc .....

优化对于键盘事件的相关处理

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7. <title>Document</title>
  8. <script src="./node_modules/vue/dist/vue.global.js"></script>
  9. </head>
  10. <body>
  11. <div id="demo">
  12. <input type="text" @keydown.space="fun()">
  13. </div>
  14. <script>
  15. Vue.createApp({
  16. data() {
  17. return {}
  18. },
  19. methods: {
  20. fun(e) {
  21. console.log("aaaaaa");
  22. }
  23. }
  24. }).mount("#demo")
  25. </script>
  26. </body>
  27. </html>

2) 事件修饰符

.stop 阻止事件冒泡

.prevent 阻止事件默认行为

.captrue 设置捕获

.self 只触发自己范围的事件 不包含子元素

.once 只触发当前事件一次

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7. <title>Document</title>
  8. <script src="./node_modules/vue/dist/vue.global.js"></script>
  9. <style>
  10. .fu{width: 300px;height: 300px;background-color: yellowgreen;}
  11. .zi{width: 100px;height: 100px;background-color: gray;}
  12. </style>
  13. </head>
  14. <body>
  15. <div id="demo">
  16. <div class="fu" @click.once="fu()">
  17. <div class="zi" @click.stop="zi()"></div>
  18. </div>
  19. </div>
  20. <script>
  21. Vue.createApp({
  22. data() {
  23. return {}
  24. },
  25. methods: {
  26. fu() {
  27. console.log("fufufu");
  28. },
  29. zi(){
  30. console.log("zizizi");
  31. }
  32. }
  33. }).mount("#demo")
  34. </script>
  35. </body>
  36. </html>

3) v-model修饰符

lazy修饰符

使用v-model后,用户每次修改输入内容,都会将数据同时绑定,为了避免这种情况的发生,使用lazy修饰符来进行限定。只有当用户的input中失去焦点或者用户点击回车按钮时,才会将的数据进行修改。

  1. <body>
  2. <div id="demo">
  3. <input type="text" v-model.lazy="text">
  4. <h1>{{text}}</h1>
  5. </div>
  6. <script>
  7. Vue.createApp({
  8. data() {
  9. return {
  10. text:"默认值"
  11. }
  12. },
  13. methods: {
  14. }
  15. }).mount("#demo")
  16. </script>
  17. </body>
number修饰符

当用户在input中输入数字时,浏览器会默认将输入的数字转化为string类型,使用number修饰符来将输入的数字转为number类型

  1. <body>
  2. <div id="demo">
  3. <input type="text" v-model.number="num">
  4. <button @click="fun()">点击查看数据类型</button>
  5. </div>
  6. <script>
  7. Vue.createApp({
  8. data() {
  9. return {
  10. num: 66
  11. }
  12. },
  13. methods: {
  14. fun(){
  15. console.log(typeof(this.num));
  16. }
  17. }
  18. }).mount("#demo")
  19. </script>
  20. </body>
trim修饰符

使用trim修饰符来去掉字符串首部或者尾部的所有空格,常用于登陆注册。

<input type="text" v-model.number.trim="num">

修饰符间没有冲突,可连拼,如上。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/79350
推荐阅读
相关标签
  

闽ICP备14008679号