vue系列教程-06vue的事件处理

本内容为系列内容,全部内容请看我的vue教程分类

点击事件

还记得jquery是怎么绑定点击事件的吗

$("button").click(function(){
  console.log('我被点击了')
});

那么vue是如何绑定点击事件呢?就要使用 v-on来监听dom的事件

首先实例化一个vue,定义一个数字 count

<script>
    let vm = new Vue({
        el: '#app',
        data() {
            return {
                count: 1
            }
        },
        created() {

        },
    })
</script>

然后我们在页面中设置一个按钮并绑定上点击事件,""里面也是可以直接写表达式的,这里我们点击事件就是增加 data在中 count的值,并且把count也渲染到页面中来

<div id="app">
    <button v-on:click="count++">click</button>
    <div>输出:{{count}}</div>
</div>

打开浏览器来看看效果

vue教程-lookroot

定义方法

那我们总不能一直将点击事件写在 ""里面吧,况且有些非常复杂的逻辑呢?

这里我们就可以在 methods中定义方法,这个methods也是实例化vue需要传递的属性,我们这里定义一个sayHello的方法

<script>
    let vm = new Vue({
        el: '#app',
        methods: {
            sayhello() {
                console.log('hello world');
            }
        },
        data() {
            return {
                count: 1
            }
        },
        created() {

        },
    })
</script>

然后在页面的 v-on中使用这个方法 ,注意 v-on可以简写为 @

<button @click="sayhello">click</button>

来到浏览器查看效果,是可以的

vue教程-lookroot

按键事件

那么vue的按键事件该如何监听呢?

这里举例一个场景:我们很多人有这个习惯,输入框输入完成后 点击键盘的回车键 提交表单是吧

首先我们在 methods中定义一个 submit方法

methods: {
    sayhello() {
        console.log('hello world');
    },
    submit() {
        console.log('我提交了');
    }
},

然后我们在页面中绑定监听按钮事件keyup就是按钮事件

<input type="text" @keyup.enter="submit">

查看效果

vue教程-lookroot

具体有哪些呢 这里有个官网的截图

vue教程-lookroot

讲了这么多了我们来个综合练习,我们把 v-bind那一节的代码拷贝过来,做一些简单的修改,一个正常开发的逻辑

首先我们将 data中的 userlist初始化为空数组,因为实际开发这个数组要从后端去取数据

data() {
    return {
        count: 1,
        userlist: [],
        user: {
            name: 'lookroot',
            age: 12,
            sex: 2,
            avatar: ''
        },
        sexlist: [
            { count: 1, name: '男' },
            { count: 2, name: '女' },
        ]
    }
},

然后是从后台加载数据,因为我们没有后台,所以加载假数据,也就是提前写死这个数据,这里只是实现这个过程

我们在 methods定义方法 loadData用来初始化数据

methods: {
    //模拟加载数据
    loadData() {
        //从后台加载中 实际开发这个 res 应该从后端获取....
        console.log('加载数据中');
        const res = [
            { name: 'lookroot', age: 20, sex: 1, avatar: 'https://dss3.bdstatic.com/70cFv8Sh_Q1YnxGkpoWK1HF6hhy/it/u=218375221,1552855610&fm=111
            { name: 'lili', age: 21, sex: 2, avatar: 'https://dss1.bdstatic.com/70cFvXSh_Q1YnxGkpoWK1HF6hhy/it/u=1305353222,2352820043&fm=26&gp=
        ];
        console.log('加载完成');
        // 赋值给 data中 userlist
        this.userlist = res;
    },
},

那么这么初始化数据定义好了 什么时候调用呢?这就要用到我们前面讲的 生命周期了

这里要使用到 created 这个周期,因为此时 data已经初始化成功了,如果你在这个生命周期前面调用的话,就会报错找不到 这个 userlist,那么我们就在这里调用刚刚的 loadData这个方法,完成初始化数据

// 在这个生命周期去后台读取数据
created() {
    //调用初始化数据的方法
    this.loadData();
},

那么现在我们在打开页面的时候就会自动初始化数据了

vue教程-lookroot

然后我们来操作这个表单,给存储按钮绑定一个点击事件,但是这个时候我们点击按钮会发现为啥页面刷新了?

<form action="">
    <input type="text" v-model="user.name">
    <input type="text" v-model="user.age">
    <input type="text" v-model="user.avatar">
    <select v-model="user.sex">
        <option :value="sex.count" v-for="(sex,index) in sexlist">{{sex.name}}</option>
    </select>
    <button @click="submit">存储</button>
</form>

这个原因是 buttonhtml表单中的默认提交,只要点了就会提交到指定页面,但是我们使用vue不想让它提交页面,也不需要提交页面,那么怎么做呢?

修改一下这个绑定的点击事件,这个prevent可以阻止页面的默认事件,这样页面就不会跳转了!

<button @click.prevent="submit">存储</button>

然后我们修改一下这个 submit事件,就是把当前表单的user对象插入到userlist

 submit() {
     //假装提交后台了
     this.userlist.push(this.user);
 }

然后我们来浏览器看看效果,这里细心的朋友会发现,我第一存储表单是没添加头像地址,第二次添加了头像,为啥第一次添加的用户也有同一个头像呢?

vue教程-lookroot

这就是因为我们直接插入的 this.user,没有拷贝数据,所以每次插入 userlist其实是同一个对象

所以这里我们需要进行一下拷贝 也可以使用 JSON.parse(JSON.stringify(obj))

submit() {
    let user = Object.assign({}, this.user);
    this.userlist.push(user);
}

好的再次查看效果发现没有这个

vue教程-lookroot

做到这里大家发现了没有 通过这上面的数据绑定 事件触发 数据更新 这不就是我前面讲的 mvvm 吗?大家认真体会啊!

posted @ 2020-06-23 19:30  lookroot  阅读(194)  评论(0编辑  收藏  举报