VUE学习笔记:4.vue的计算属性和v-on绑定监听事件

一.计算属性

1.什么是计算属性

在这里插入图片描述

2.计算属性的基本使用

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
</head>
<body>


<div id="app">
	<!--可以像使用data中的数据一样,获取计算属性中的数据内容-->
    <h2>{{fullName}}</h2>
</div>



<!--引入本地的vue.js文件-->
<script src="../vue.js"></script>

<script>
    // ES6中使用let定义变量,使用const定义常量
    let app = new Vue({
        el: '#app', // 讲这个vue实例与id为app的标签关联起来
        data: {
            firstName: 'zhang',
            lastName: 'san'
        },
        //计算属性中的数据可以跟data中的数据一样使用,不过它的数据的值是通过方法的运算后得出的
        computed: {
            fullName: function(){
                return this.firstName + ' ' + this.lastName;
            }
        }
    })
</script>
</body>
</html>

运行效果如下:
在这里插入图片描述

当然我们也可以使用methods来增加一个方法达到同样的效果。

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
</head>
<body>


<div id="app">
    <!--HTML页面中要使用一个方法必须在后面加上()-->
    <h2>{{getfullName()}}</h2>
</div>



<!--引入本地的vue.js文件-->
<script src="../vue.js"></script>

<script>
    // ES6中使用let定义变量,使用const定义常量
    let app = new Vue({
        el: '#app', // 讲这个vue实例与id为app的标签关联起来
        data: {
            firstName: 'li',
            lastName: 'si'
        },
        
        methods: {
            getfullName: function(){
                return this.firstName + ' ' + this.lastName;
            }
        }
    })
</script>
</body>
</html>

在这里插入图片描述

  • methods方法和计算属性computed都可以实现计算功能,但是它们也有些不同:

  • computed计算属性是一个属性,挂载点使用它不需要在后面加括号。例如:fullName1

  • methods是一个方法,挂载点使用它需要在后面加括号。例如:fullName1()

  • computed计算属性会将值存到缓存中,当它的值没变化时,则不会计算,而是使用缓存。而methods则不同,每调用一次方法都会计算一次。所以对于不太变化的内容使用计算属性可以大大减小系统的消耗。

3.计算属性的getter和setter

在这里插入图片描述

  • 每一个计算属性都有一个get方法和一个set方法。

  • 当我们获取计算属性的值时会调用get方法。当我们给计算属性赋值时会调用先调用set方法再调用get方法。

  • 我们前面的计算属性的写法都只是实现了计算属性的get方法。

  • 计算属性一般不设置set方法。

  • 实现计算属性的get方法:

    <!DOCTYPE html>
    <html>
    <head lang="en">
    	<meta charset="UTF-8">
    	<title></title>
    </head>
    <body>
    
    
    <div id="app">
        <h2>{{fullName}}</h2>
    </div>
    
    <!--引入本地的vue.js文件-->
    <script src="../vue.js"></script>
    
    <script>
        // ES6中使用let定义变量,使用const定义常量
        let app = new Vue({
            el: '#app', // 讲这个vue实例与id为app的标签关联起来
            data: {
                firstName: 'li',
                lastName: 'si'
            },
            computed:{
                fullName: {
                    get(){
                        return this.firstName + ' ' + this.lastName;
                    }
                }
    //           如果计算属性只实现get方法,那么一般简写为这种形式。
    //           fullName: function(){
    //               return this.firstName + ' ' + this.lastName;
    //           }
            }
    
        })
    </script>
    </body>
    </html>
    

    此时我们修改计算属性的值:
    在这里插入图片描述

  • 实现计算属性的set方法。

    <!DOCTYPE html>
    <html>
    <head lang="en">
        <meta charset="UTF-8">
        <title></title>
    </head>
    <body>
    
    
    <div id="app">
        <!--HTML页面中要使用一个方法必须在后面加上()-->
        <h2>{{fullName}}</h2>
    </div>
    
    <!--引入本地的vue.js文件-->
    <script src="../vue.js"></script>
    
    <script>
        // ES6中使用let定义变量,使用const定义常量
        let app = new Vue({
            el: '#app', // 讲这个vue实例与id为app的标签关联起来
            data: {
                firstName: 'li',
                lastName: 'si'
            },
            computed:{
                fullName: {
                    get(){
                        console.log('开始调用get方法');
                        return this.firstName + ' ' + this.lastName;
                    },
                    set(newValue){
                        console.log('开始调用set方法');
                        let name_list = newValue.split(' ');
                        this.firstName = name_list[0];
                        this.lastName = name_list[1];
                    }
                }
    
            }
    
        })
    </script>
    </body>
    </html>
    

修改计算属性的值效果如下:
在这里插入图片描述

4.计算属性与method的区别

在这里插入图片描述
我们用一个小案例来看看它们之间的区别:在一个页面上多次打印相同的计算属性或者方法。

使用method实现:

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
</head>
<body>


<div id="app">
    <h2>{{getfullName()}}</h2>
    <h2>{{getfullName()}}</h2>
    <h2>{{getfullName()}}</h2>
    <h2>{{getfullName()}}</h2>
    <h2>{{getfullName()}}</h2>
</div>

<!--引入本地的vue.js文件-->
<script src="../vue.js"></script>

<script>
    // ES6中使用let定义变量,使用const定义常量
    let app = new Vue({
        el: '#app', // 讲这个vue实例与id为app的标签关联起来
        data: {
            firstName: 'li',
            lastName: 'si'
        },
        methods: {
            getfullName: function(){
                console.log('调用方法+1');
                return this.firstName + ' ' + this.lastName;
            }
        }

    })
</script>
</body>
</html>

在这里插入图片描述
使用computed实现:

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
</head>
<body>


<div id="app">
    <h2>{{fullName}}</h2>
    <h2>{{fullName}}</h2>
    <h2>{{fullName}}</h2>
    <h2>{{fullName}}</h2>
    <h2>{{fullName}}</h2>
</div>

<!--引入本地的vue.js文件-->
<script src="../vue.js"></script>

<script>
    // ES6中使用let定义变量,使用const定义常量
    let app = new Vue({
        el: '#app', // 讲这个vue实例与id为app的标签关联起来
        data: {
            firstName: 'li',
            lastName: 'si'
        },
        computed: {
            fullName: function(){
                console.log('调用计算属性+1');
                return this.firstName + ' ' + this.lastName;
            }
        }

    })
</script>
</body>
</html>

在这里插入图片描述

二.v-on绑定监听事件

在这里插入图片描述

1.v-on的基本使用

在这里插入图片描述
语法格式:v-on:监听的事件="表达式/方法名"
简写格式:@监听的事件="表达式/方法名"

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
</head>
<body>


<div id="app">
    <h2>{{count}}</h2>
    <button v-on:click="jia">+</button>
    <button @click="jian">-</button>
</div>

<!--引入本地的vue.js文件-->
<script src="../vue.js"></script>

<script>
    // ES6中使用let定义变量,使用const定义常量
    let app = new Vue({
        el: '#app', // 讲这个vue实例与id为app的标签关联起来
        data: {
            count: 0
        },
        methods: {
            jia: function(){
                this.count++;
            },
            jian: function(){
                this.count--;
            }
        }

    })
</script>
</body>
</html>

运行效果如下:
在这里插入图片描述

2.v-on的传参问题

在这里插入图片描述

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
</head>
<body>


<div id="app">
    <!--如果绑定监听事件的方法没有形参,那么调用方法时可以加(),也可以不加-->
    <button v-on:click="btnclick1()">按钮1</button>
    <button v-on:click="btnclick2">按钮2</button>
    <!--如果绑定监听事件的方法有一个形参,如果不传参数则会默认将`事件对象`本身作为参数-->
    <button v-on:click="btnclick3('zhangsan')">按钮3</button>
    <button v-on:click="btnclick4">按钮4</button>
    <!--如果绑定监听事件的方法有多个形参,如果不传参数则会默认将`事件对象`本身作为第一个参数,其他参数会默认为undefined-->
    <button v-on:click="btnclick5('zhangsan','lisi')">按钮5</button>
    <button v-on:click="btnclick6">按钮6</button>
    <!--如果绑定监听事件的方法有多个参数,且其中的参数之一为事件对象本身,可以使用$event来获取-->
    <button v-on:click="btnclick7('zhangsan',$event)">按钮7</button>
</div>

<!--引入本地的vue.js文件-->
<script src="../vue.js"></script>

<script>
    // ES6中使用let定义变量,使用const定义常量
    let app = new Vue({
        el: '#app', // 讲这个vue实例与id为app的标签关联起来
        data: {
        },
        methods: {
            btnclick1: function(){
                console.log('btnclick1');
            },
            btnclick2: function(){
                console.log('btnclick2');
            },
            btnclick3: function(name){
                console.log(name);
            },
            btnclick4: function(name){
                console.log(name);
            },
            btnclick5: function(name1,name2){
                console.log(name1);
                console.log(name2);
            },
            btnclick6: function(name1,name2){
                console.log(name1);
                console.log(name2);
            },
            btnclick7: function(name,event){
                console.log(name);
                console.log(event);
            }

        }

    })
</script>
</body>
</html>

3.v-on的修饰符

在这里插入图片描述

(1)event事件.stop修饰符阻止事件冒泡

先看一个案例:

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
</head>
<body>


<div id="app" v-on:click="divclick">
    我是div
    <button v-on:click="btnclick">按钮1</button>
</div>

<!--引入本地的vue.js文件-->
<script src="../vue.js"></script>

<script>
    // ES6中使用let定义变量,使用const定义常量
    let app = new Vue({
        el: '#app', // 讲这个vue实例与id为app的标签关联起来
        data: {
        },
        methods: {
            divclick: function(){
                console.log('div被点击了')
            },
            btnclick: function(){
                console.log('button被点击了')
            }

        }

    })
</script>
</body>
</html>

运行效果如下:
在这里插入图片描述
使用event事件.stop修饰符阻止事件冒泡。

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
</head>
<body>


<div id="app" v-on:click="divclick">
    我是div
    <button v-on:click.stop="btnclick">按钮1</button>
</div>

<!--引入本地的vue.js文件-->
<script src="../vue.js"></script>

<script>
    // ES6中使用let定义变量,使用const定义常量
    let app = new Vue({
        el: '#app', // 讲这个vue实例与id为app的标签关联起来
        data: {
        },
        methods: {
            divclick: function(){
                console.log('div被点击了')
            },
            btnclick: function(){
                console.log('button被点击了')
            }

        }

    })
</script>
</body>
</html>

运行效果如下:
在这里插入图片描述

(2)event事件.prevent修饰符阻止标签的默认事件

还是先看一个案例:

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
</head>
<body>


<div id="app">
    <a href="https://www.baidu.com">百度一下</a>
</div>

<!--引入本地的vue.js文件-->
<script src="../vue.js"></script>

<script>
    // ES6中使用let定义变量,使用const定义常量
    let app = new Vue({
        el: '#app', // 讲这个vue实例与id为app的标签关联起来
        data: {
        },
        methods: {

        }

    })
</script>
</body>
</html>

效果如下:
在这里插入图片描述
使用event事件.prevent修饰符来阻止标签的默认事件

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
</head>
<body>


<div id="app">
    <a href="https://www.baidu.com" v-on:click.prevent="aclick">百度一下</a>
</div>

<!--引入本地的vue.js文件-->
<script src="../vue.js"></script>

<script>
    // ES6中使用let定义变量,使用const定义常量
    let app = new Vue({
        el: '#app', // 讲这个vue实例与id为app的标签关联起来
        data: {
        },
        methods: {
            aclick: function(){
                console.log('点击a标签');
            }
        }

    })
</script>
</body>
</html>

运行效果如下:
在这里插入图片描述

(3)键盘事件.键名 修饰符来监听特殊的键帽

老规矩还是先来看一个案例:

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
</head>
<body>


<div id="app">
    <input type="text" @keyup="keyUp">
</div>

<!--引入本地的vue.js文件-->
<script src="../vue.js"></script>

<script>
    // ES6中使用let定义变量,使用const定义常量
    let app = new Vue({
        el: '#app', // 讲这个vue实例与id为app的标签关联起来
        data: {
        },
        methods: {
            keyUp: function(){
                console.log('按键盘咯');
            }
        }

    })
</script>
</body>
</html>

运行效果如下:
在这里插入图片描述
使用键盘事件.键名修饰符来监听特殊的键位抬起。例如:回车键

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
</head>
<body>


<div id="app">
    <!--只监听回车键-->
    <input type="text" @keyup.enter="keyUp">
</div>

<!--引入本地的vue.js文件-->
<script src="../vue.js"></script>

<script>
    // ES6中使用let定义变量,使用const定义常量
    let app = new Vue({
        el: '#app', // 讲这个vue实例与id为app的标签关联起来
        data: {
        },
        methods: {
            keyUp: function(){
                console.log('按键盘咯');
            }
        }

    })
</script>
</body>
</html>

运行效果如下:
在这里插入图片描述

(4)event事件.once修饰符只触发一次事件方法

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
</head>
<body>


<div id="app">
    <button @click.once="btnclick">点点点</button>
</div>

<!--引入本地的vue.js文件-->
<script src="../vue.js"></script>

<script>
    // ES6中使用let定义变量,使用const定义常量
    let app = new Vue({
        el: '#app', // 讲这个vue实例与id为app的标签关联起来
        data: {
        },
        methods: {
            btnclick: function(){
                console.log('点击按钮咯');
            }
        }

    })
</script>
</body>
</html>

运行效果如下:
在这里插入图片描述

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值