Vue03--事件处理与表单绑定

1.输入的事件处理

input框中的三个事件:
    input    当输入框进行输入的时候 触发的事件
    change   当元素的值发生改变时 触发的事件
    blur     当输入框失去焦点的时候 触发的事件
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="./js/vue.js"></script>
</head>
<body>
<div id="app">
    <h1>v-model的使用</h1>
	<input type="text" v-model="msg" @blur="handleBlur" @change="handleChange">
    <input type="text" v-model="msg" @input="handleInput">
    <br>
    {{msg}}
    <hr>
    <h1></h1>

</div>
</body>
<script>

    var vm = new Vue({
        el: '#app',
        data: {
            msg: ''

        },
        methods: {
            handleBlur() {
                console.log("blur",this.msg)
            },
            handleChange() {
                console.log("change",this.msg)
            },
            handleInput(){
                console.log('input',this.msg)
            }
        }
    })


</script>
</html>

2.数据双向绑定

2.1 v-model的基本使用

# v-model 相当于 给input框 绑定value
<input v-model="message" placeholder="edit me">  # placeholder是提示
<p>Message is: {{ message }}</p>

2.2 v-model的修饰符

# .lazy    等待input框的数据绑定后,发生改变后再变化
    在默认情况下,v-model 在每次input事件触发后将输入框的值与数据进行同步 (除了上述输入法组合文字时)。
    你可以添加 lazy 修饰符,从而转为在 change 事件之后进行同步:

    <!-- 在“change”时而非“input”时更新 -->
    <input v-model.lazy="msg">

# .number    数字开头,只保留数字,后面的字母不保留;字母开头,都保留
    如果想自动将用户的输入值转为数值类型,可以给 v-model 添加 number 修饰符:

    <input v-model.number="age" type="number">
    这通常很有用,因为即使在 type="number" 时,HTML 输入元素的值也总会返回字符串。
    如果这个值无法被 parseFloat() 解析,则会返回原始的值。

# .trim    去除首尾的空格
    如果要自动过滤用户输入的首尾空白字符,可以给 v-model 添加 trim 修饰符:

    <input v-model.trim="msg">
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="./js/vue.js"></script>
</head>
<body>
<div id="app">
<!--    lazy的使用:<input type="text" v-model.lazy="msg"> {{msg}}-->
<!--    number的使用:<input type="text" v-model.number="msg"> {{msg}}-->
    trim的使用:<input type="text" v-model.number="msg"> {{msg}}
</div>

</body>
<script>
    let vm = new Vue({
        el: '#app',
        data: {
            msg:''
        },
        methods: {
        },
    })
</script>
</html>

3.表单控制

# v-model 会根据控件类型自动选取正确的方法来更新元素,实现表单控制。
    它负责监听用户的输入事件以更新数据,并对一些极端场景进行一些特殊处理。   
    
    v-model 会忽略所有表单元素的 value、checked、selected attribute的初始值,
    而总是将 Vue 实例的数据作为数据来源。应该通过JavaScript在组件的 data 选项中声明初始值。


# v-model 在内部为不同控件类型使用不同的property 并抛出不同的事件:
    text和textarea    使用 value 和 input 事件       ====  文本初始值+ input 事件
    checkbox和radio   使用 checked 和 change 事件    ====  勾选项的值+ change 事件
    select            使用 value 和 change 作为事件  ====  选择项的值+ change事件

    
    # 简之:
    	原生js获取对应input框的值,分别是 value,checked,value;
    	但是vue中,因为是双向数据绑定,直接点v-model绑定的变量就行了
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="./js/vue.js"></script>
</head>
<body>
<div id="app">
    <input type="text" placeholder="请输入用户名:"><br>
    <input type="password" placeholder="请输入密码:"><br>
    <input type="checkbox" v-model="checked">记住用户名
    <hr>
    
    <input type="radio" v-model="picked" value="1">男
    <input type="radio" v-model="picked" value="2">女
    <input type="radio" v-model="picked" value="0">保密
    <br><br>您选择的性别:{{picked}}
    <hr>

    <input type="checkbox" v-model="checkedHobby" value="1">篮球
    <input type="checkbox" v-model="checkedHobby" value="2">足球
    <input type="checkbox" v-model="checkedHobby" value="3">棒球
    <input type="checkbox" v-model="checkedHobby" value="4">桌球
    <br><br>您喜欢的球类:{{checkedHobby}}
    <hr>
    
	<select v-model="selected">
        <option disabled value="">请选择</option>
        <option>A</option>
        <option>B</option>
        <option>C</option>
	</select>
	<br><br>您选择的是:{{ selected }}
	       
</div>
</body>
<script>
    var vm = new Vue({
        el: '#app',
        data: {
            picked: '',       // radio,是字符串,选择谁,字符串就变成选中的value值
            
            checked: false,   // 如果是只有一个checkbox,绑定的值就是true和false
            checkedHobby:[]   // checkbox多选,绑定的值就是数组,选择以后,数组中放选中的value值
            
            selected:'',     // select单选,是字符串,选择谁,字符串就变成选中的value值
                             // select多选,绑定的值就是数组,选择以后,数组中放选中的value值
        },
        methods: {}
    })


</script>
</html>

4.input事件案例--输入过滤

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="./js/vue.js"></script>
</head>
<body>
<div id="app">
    <input type="text" v-model="mytext" @input="handleInput">
    <li v-for="item in newDataList">{{item}}</li>

</div>
</body>
<script>
    new Vue({
        el: '#app',
        data: {
            mytext: '',
            dataList: ['a', 'at', 'atom', 'be', 'beyond', 'cs', 'csrf'],
            newDataList: ['a', 'at', 'atom', 'be', 'beyond', 'cs', 'csrf'],

        },
        methods: {
            handleInput() {

                // console.log(this)
                // var _this=this  // 普通匿名函数内部的this和外部的this不是一个
                // this.newDataList = this.dataList.filter(function (item) {
                //     var res = item.indexOf(_this.mytext)
                //     if (res > -1) {
                //         return true
                //     } else {
                //         return false
                //     }
                //
                // })

                this.newDataList = this.dataList.filter( (item) => {
                    return item.indexOf(this.mytext)>-1
                })
                
		// this.newDataList = this.dataList.filter((item) => item.indexOf(this.mytext)>-1
            }
        }
    })


</script>
</html>

5.事件修饰符

.stop	只处理自己的事件,阻止事件冒泡, 写在子控件中
.self	只处理自己的事件,子控件冒泡的事件不处理, 写在父控件中

.prevent   阻止默认事件	例如:阻止a链接默认跳转, 变成执行自己的方法
.once	事件只会触发一次(适用于抽奖页面)
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="./js/vue.js"></script>
</head>
<body>
<div id="app">

    <!--<ul @click="handleUl">-->
    <ul @click.self="handleUl">
        <li @click.stop="handleLi">我是li1,阻止了事件冒泡</li>
        <li @click="handleLi">我是li2,不阻止事件冒泡</li>
    </ul>

	<a href="https://www.baidu.com/" @click.prevent="handleA">致命诱惑</a>

    <button @click.once="handleMS">秒杀</button>
</div>
</body>
<script>


    new Vue({
        el: '#app',
        data: {},
        methods: {
            handleLi(){
                console.log('li被点击了')
            },
            handleUl(){
                console.log('ul被点击了')
            },
            handleA(){
                console.log('a标签被点击了')
                window.location='https://www.baidu.com/' // 自己决定要不要跳
            },
            handleMS(){
                console.log("handleMS")
            }
        }
    })

</script>
</html>

6.按键修饰符

# 按键事件
    keyup    键按下,并弹起时 才触发事件   # 常用
    keydown  键按下就触发事件
    
# 按键修饰符
    # 常用
    .enter
    .esc
    .delete  (捕获 "删除" 和 "退格" 键)
    
    .tab
    .space
    .up
    .down
    .left
    .right
    .ctrl
    .alt
    .shift
    .meta	Windows上就是window键, Mac上是command 键
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="./js/vue.js"></script>
</head>
<body>
<div id="app">
	<!--  当敲回车,弹出输入的内容-->
    <input type="text" v-model="msg" @keyup.enter="handleUp($event)">
    <input type="text" v-model="msg" @keyup.esc="handleUp($event)">

    <input type="text" v-model="msg" @keyup.esc="handleUp">  # 也可以不传参,不知道为啥

</div>
</body>
<script>
    new Vue({
        el: '#app',
        data: {
            msg:''
        },
        methods: {
            handleUp(event){
                console.log(event.code)
            }
        }
    })
</script>
</html>

补充

JS数组的过滤方法

// .filter(匿名函数)   函数中,返回true就保留数据,false就去除数据


var l=['a', 'at', 'atom', 'be', 'beyond', 'cs', 'csrf']
var new_l=l.filter(function (item) {
    // 写逻辑
    var res=item.indexOf('at')  // indexOf 检测某个字符串在另一个字符串的索引位置,如果不在字符串中就返回-1,如果在就返回位置
    if (res>-1){
        return true
    }else {
		return false
    }
})

console.log(new_l)


// es6语法,箭头函数 替换原来匿名函数,箭头函数内的this和外部的是一个this,普通匿名函数内部的this和外部的this不是一个
// 箭头函数: (参数) => {}

var new_l=l.filter( (item) => {
    var res=item.indexOf('at') 
    if (res>-1){
        return true
    }else {
         return false
    }
})
posted @ 2021-12-27 16:53  Edmond辉仔  阅读(92)  评论(0编辑  收藏  举报