VUE中的事件处理及表单处理

**

VUE中的事件处理及表单处理

**

1-事件处理

1.1-事件对象

  1. 无需给事件处理函数传递参数

    在事件处理函数定义的位置, 直接通过形参接收事件对象即可

    <div id="app">
            <h1>{{msg}}</h1>
            <button v-on:click="updateMsg">点击改变msg</button>
        </div>
        <script>
            let vm = new Vue({
                el:'#app',
                data:{
                    msg:'hello world'
                },
                methods: {
                    updateMsg(e){
                        console.log(e)
                        this.msg = '你好'
                    }
                },
            })
        </script>
    
  2. 需要给事件处理函数传递参数

    需要使用系统提供的关键字**$event**手动传递事件对象

     <!-- 
            1.无需给事件处理函数传递参数,形参就是事件对象
            2.需要给事件处理函数传递参数,用$event代表事件对象
         -->
        <div id="app">
            <h1>{{msg}}</h1>
            <button v-on:click="updateMsg('哈哈',$event)">点击改变msg</button>
            <hr>
            <input type="text" @keyup="getInput">
        </div>
        <script>
            let vm = new Vue({
                el:'#app',
                data:{
                    msg:'hello world'
                },
                methods: {
                    updateMsg(e,val){
                        console.log(e,val)
                        this.msg = '你好'
                    },
                    getInput(e){
                        if(e.keyCode === 13) {
                            console.log(e.target.value)
                        }
                    }
                },
            })
        </script>
    

1.2-事件修饰符

  • 作用: 限制事件触发的时机或者条件

  • 语法格式

    <div @事件名称.事件修饰符="事件处理函数"></div>
    
1.2.1-stop
  • 作用: 阻止事件冒泡

  • 书写位置: 子元素事件注册位置

    <style>
            .father {
                width: 300px;
                height: 300px;
                background-color: pink;
            }
            .child {
                width: 200px;
                height: 200px;
                background-color: gold;
            }
        </style>
    <div id="app">
            <div class="father" @click="getFather">
                father
                <div class="child" @click.stop="getChild">
                    child
                </div>
            </div>
        </div>
        <script>
            let vm = new Vue({
                el:'#app',
                data:{
    
                },
                methods: {
                    getFather(){
                        console.log('父标签被点击')
                    },
                    getChild(e){
                        // 原生js阻止冒泡行为
                        // e.stopPropagation();
                        
                        console.log('子标签被点击')
                    }
                },
            })
        </script>
    
1.2.2-prevent
  • 作用: 阻止默认行为

    <div id="app">
            <a href="https://www.baidu.com" target="_blank" @click.prevent.once="handle">点击跳转到百度</a>
        </div>
        <script>
            let vm = new Vue({
                el:'#app',
                methods: {
                    handle(e){
                        // 原生js阻止默认行为
                        // e.preventDefault();
                        console.log('点击了')
                    }
                },
            })
        </script>
    
1.2.3-capture
  • 作用: 修改事件执行顺序, 将事件执行顺序变为捕获模式(由外向内依次触发)

  • 书写位置: 父元素的事件注册位置

    <div id="app">
            <!-- 将事件执行顺序改变为由外向内 -->
            <div class="father" @click.capture="getFather">
                father
                <div class="child" @click="getChild">
                    child
                </div>
            </div>
        </div>
        <script>
            let vm = new Vue({
                el:'#app',
                data:{
    
                },
                methods: {
                    getFather(){
                        console.log('父标签被点击')
                    },
                    getChild(){
                        console.log('子标签被点击')
                    }
                },
            })
        </script>
    
1.2.4-self
  • 作用: 限制事件只能被自己触发, 不能被冒泡行为触发

  • 书写位置: 父元素事件注册位置

    <div id="app">
            <!-- self 限制只能被自身出发 -->
            <div class="father" @click.self.once="getFather">
                father
                <div class="child" @click="getChild">
                    child
                </div>
            </div>
        </div>
        <script>
            let vm = new Vue({
                el:'#app',
                data:{
    
                },
                methods: {
                    getFather(){
                        console.log('父标签被点击')
                    },
                    getChild(){
                        console.log('子标签被点击')
                    }
                },
            })
        </script>
    
1.2.5-once
  • 作用: 限制事件只能被触发一次

    <div id="app">
            <!-- once 限制事件只能被触发一次 -->
            <div class="box" @click.once="handle"></div>
        </div>
        <script>
            let vm = new Vue({
                el:'#app',
                data:{
    
                },
                methods: {
                    handle(){
                        console.log('盒子被点击了')
                    }
                },
            })
        </script>
    

1.3-按键修饰符

  • 作用: 修饰键盘事件, 从而限制键盘事件的触发条件(只有在按下按键修饰符对应的键盘按键的时候, 才执行事件处理函数)

  • 语法格式

    <input @键盘事件名称.按键修饰符="事件处理函数">
    
1.3.1-系统内置的按键修饰符
  • .enter: 回车键
  • .tab: tab键
  • .delete (捕获“删除”和“退格”键)
  • .esc: esc键
  • .space空格键
  • .up: 上
  • .down: 下
  • .left: 左
  • .right: 右
1.3.2-自定义按键修饰符
  • 按键修饰符名字自定义即可
  • 键盘码必须真实有效
// Vue.config.keyCodes.自定义按键修饰符别名 = 按键键盘码
Vue.config.keyCodes.f1 = 112;
1.3.3-系统修饰符
  • .ctrl

  • .alt

  • .shift

  • .meta

2-表单处理

2.0-双向数据绑定

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2jnQWqfQ-1625197010923)(.\media\双向数据绑定.jpg)]

2.1-v-model指令

  • 作用: 将用户通过表单元素输入或者选择的内容同步到数据层

  • 注意: v-model这个指令一般只能和表单元素结合起来使用

2.2-常见表单元素双向数据绑定

<div id="app">
        <h3>用户信息</h3>
        <div>
            用户名:<input type="text" placeholder="请输入用户名" v-model="userinfo.username">
        </div>
        <div>
            密码:<input type="password" placeholder="请输入密码" v-model="userinfo.password">
        </div>
        <div>
            性别:
            <input type="radio" value="male" v-model="userinfo.sex"><input type="radio" value="female" v-model="userinfo.sex"></div>
        <div>
            爱好:
            <input type="checkbox" value="code" v-model="userinfo.hobby"> 敲代码
            <input type="checkbox" value="sleep" v-model="userinfo.hobby"> 睡觉
            <input type="checkbox" value="playGame" v-model="userinfo.hobby"> 玩游戏
        </div>
        <div>
            所属省份:
            <select v-model="userinfo.province">
                <option value="JS">江苏</option>
                <option value="ZJ">浙江</option>
                <option value="SC">四川</option>
                <option value="HB">湖北</option>
            </select>
        </div>
        <div>
            <button @click="submit">提交</button>
        </div>
    </div>
    <script>
        let vm = new Vue({
            el:'#app',
            data:{
                userinfo:{
                    username:'',
                    password:'',
                    sex:'male',
                    hobby:['sleep','playGame'],
                    province:'JS'
                }
            },
            methods: {
                submit(){
                    console.log(this.userinfo)
                    // 发送一个ajax请求
                }
            },
        })
    </script>

2.2-表单修饰符

  • 作用: 对v-model指令所收集到的表单内容进行处理
2.2.1-书写位置
v-model.表单修饰符="数据"
2.2.2-系统表单修饰符
  • trim

    • 作用: 去除表单元素内容首位和末尾的空格
  • number

    • 作用: 对表单元素的内容进行数据类型的转换, 将表单内容转换成数值类型
    • 特点:
      • 当表单内容可以被转换成数值类型的时候, 会自动转换
      • 当表单内容无法转换成数值类型的时候, 则不会做处理
  • lazy

    • 作用: 延迟v-model同步数据的时机, 失去焦点的时候, 再进行数据同步

3-vm.$set

3.1-作用

  • 动态给数组添加元素
  • 动态给对象添加属性

3.2-语法

vm.$set(目标数据,数组的索引/对象的属性名,数组元素的值/对象的属性值)

3.3-别名

Vue.set(目标数据,数组的索引/对象的属性名,数组元素的值/对象的属性值)
<div id="app">
        <h3 v-for="item in arr">{{item}}</h3>
        <hr>
        <h3 v-for="(item,key) in userinfo">{{key}}=={{item}}</h3>
        <hr>
        <button @click="add">点击向数组添加一条数据</button>
        <button @click="addObj">点击向对象添加一条属性</button>
    </div>
    <script>
        let vm = new Vue({
            el:'#app',
            data:{
                arr:['宝马','奔驰','奥迪'],
                userinfo:{
                    username:'张三',
                    sex:'男',
                    age:20
                }
            },
            methods: {
                add(){
                    // this.arr.push('大众')
                    // this.arr[3] = '保时捷'
                    this.$set(this.arr,3,'保时捷')
                    console.log(this.arr)
                },
                addObj(){
                    this.userinfo.province = '江苏'
                    // this.$set('目标数据','数组的索引/对象属性名','数组的元素/对象属性值')
                    // this.$set(this.userinfo,'province','江苏')
                    // 别名
                    // Vue.set(this.userinfo,'hobby','睡觉')
                    console.log(this.userinfo)
                    // 强制视图更新
                    this.$forceUpdate()
                }
            },
        })
    </script>
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值