1、methods 方法
在创建的 Vue 应用程序实例中,可以通过 methods 选项定义方法。应用程序实例本身会代理 methods 选项中的所有方法,因此可以像访问 data 数据那样来调用方法。
【实例】在 Vue 应用程序中,使用 methods 选项定义获取用户信息方法和乘法计算方法。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="author" content="pan_junbiao的博客">
<title>Vue实例</title>
</head>
<body>
<div id="app">
<p>用户ID:{{userInfo.userId}}</p>
<p>用户名称:{{userInfo.userName}}</p>
<p>博客信息:{{userInfo.blogName}}</p>
<p>博客地址:{{userInfo.blogUrl}}</p>
<p>{{num1}} 乘以 {{num2}} 的结果:{{ multiplicine(num1, num2) }}</p>
</div>
</body>
<!-- 引入 Vue 框架 -->
<script src="../js/vue.global.js"></script>
<script type="text/javascript">
//使用 Vue.createApp 函数创建一个应用程序实例
const vueApp = Vue.createApp({
//数据
data() {
return {
userInfo: {}, //定义用户对象
num1: 20,
num2: 40
}
},
//初始化的入口
created: function () {
//调用方法:获取用户信息
this.getUserInfo();
},
//方法
methods: {
//获取用户信息
getUserInfo: function () {
this.userInfo = {
userId: 1,
userName: "pan_junbiao的博客",
blogName: "您好,欢迎访问 pan_junbiao的博客",
blogUrl: "https://blog.csdn.net/pan_junbiao"
}
},
//乘法计算
multiplicine: function (a, b) {
return a * b;
}
}
//使用 mount() 方法,装载应用程序实例的根组件
}).mount('#app');
</script>
</html>
执行结果:
2、computed 计算属性
在模板中绑定表达式只能用于简单的运算。如果运算比较复杂,可以使用 Vue.js 提供的计算属性,通过计算属性可以处理比较复杂的逻辑。
2.1 计算属性的应用
通过计算属性可以实现各种复杂的逻辑,包括运算、函数调用等,只要最后返回一个计算结果就可以。当计算属性依赖的数据发生变化时,计算属性的值会自动更新,所有依赖该计算属性的数据绑定也会同步进行更新。
【实例】使用 computed 计算属性,实现每个单词首字母大写。
<body>
<div id="app">
<p>原字符串:{{str}}</p>
<p>新字符串:{{newstr}}</p>
</div>
</body>
<!-- 引入 Vue 框架 -->
<script src="../js/vue.global.js"></script>
<script type="text/javascript">
//使用 Vue.createApp 函数创建一个应用程序实例
const vueApp = Vue.createApp({
//数据
data() {
return {
str:"my heart will go on"
}
},
//计算属性
computed: {
//首字母大写
newstr: function(){
let arr = this.str.split(' ');
for(let i = 0; i < arr.length; i++)
{
arr[i] = arr[i].charAt(0).toUpperCase() + arr[i].substr(1).toLowerCase();
}
return arr.join(' ');
}
}
//使用 mount() 方法,装载应用程序实例的根组件
}).mount('#app');
</script>
执行结果:
2.2 计算属性的 getter 和 setter
每一个计算属性都包含一个 getter 和一个 setter。getter 只要用来读取值,而 setter 主要用来设置值。getter 主要用来读取值,而 setter 主要用来设置值。当手动更新计算属性的值时,就会触发 setter,执行一些自定义的操作。
【实例】使用 计算属性的 getter 和 setter,重新设置人物姓名。
<body>
<div id="app">
<p>人物名称:{{fullname}}</p>
</div>
</body>
<!-- 引入 Vue 框架 -->
<script src="../js/vue.global.js"></script>
<script type="text/javascript">
//使用 Vue.createApp 函数创建一个应用程序实例
const vueApp = Vue.createApp({
//数据
data() {
return {
surname: 'Jim',
lastname: 'Carrey'
}
},
//计算属性
computed: {
fullname: {
// getter
get() {
return this.surname + ' ' + this.lastname;
},
// setter
set(value) {
let names = value.split(' ');
this.surname = names[0];
this.lastname = names[1];
}
}
}
//使用 mount() 方法,装载应用程序实例的根组件
}).mount('#app');
//重新设置人物名称
vueApp.fullname = 'Will Smith';
</script>
执行结果:
2.3 methods 与 computed 的区别
问:Vue 中的 methods 方法与 computed 计算属性有什么区别?
答:主要区别是 methods 方法会实时计算,而 computed 计算属性是使用缓存数据。
将相同的操作定义为一个方法,或者定义为一个计算属性,两种方式的结果完全相同。那么为什么还需要计算属性呢?因为计算属性是基于它们的依赖进行缓存的。当页面重新渲染时,如果依赖的数据未发生改变,使用计算属性获取的值就是一直是缓存值。只有依赖的数据发生改变时才会重新获取值。如果使用的是方法,在页面重新渲染时,方法中的函数总会被重新调用。
详情请浏览本博客的文章:《Vue中的methods方法与computed计算属性的区别》
3、watch 监听属性
监听属性是 Vue.js 提供的一种用来监听和响应数据变化的方式。在 监听 data 选项中的属性时,如果监听的属性发生变化,就会执行特定的操作。
3.1 监听属性的使用
监听属性可以定义在 watch 选项中。监听属性对应的函数可以接收一个或两个参数。如果只有一个参数,则该参数表示监听属性的新值;如果有两个参数,第一个参数表示监听属性的新值,第二个参数表示监听属性的原值。
【实例】在 watch 选项中定义监听属性,输出属性的原值和新值。
<body>
<div id="app">
<p>商品名称:{{name}}</p>
<p>{{text}}</p>
</div>
</body>
<!-- 引入 Vue 框架 -->
<script src="../js/vue.global.js"></script>
<script type="text/javascript">
//使用 Vue.createApp 函数创建一个应用程序实例
const vueApp = Vue.createApp({
//数据
data() {
return {
name: '华为手机',
price: 6999,
text: ''
}
},
//监听
watch: {
price(newValue, oldValue) {
this.text = `原价格:${oldValue}元,新价格:${newValue}元`;
}
}
//使用 mount() 方法,装载应用程序实例的根组件
}).mount('#app');
//修改属性值
vueApp.price = 3999;
</script>
执行结果:
3.2 监听属性的应用场景
监听属性通常用来实现数据之间的换算,如长度单位之间的换算、速度单位之间的换算、汇率之间的换算等。
【实例】使用 watch 监听属性,实现速度单位之间的换算。
<body>
<div id="app">
<label for="meter">米/秒:</label>
<input id="meter" type="number" v-model="meter"><p>
<label for="kilometer">千米/小时:</label>
<input id="kilometer" type="number" v-model="kilometer"><p>
{{meter}}米/秒={{kilometer}}千米/小时
</div>
</body>
<!-- 引入 Vue 框架 -->
<script src="../js/vue.global.js"></script>
<script type="text/javascript">
//使用 Vue.createApp 函数创建一个应用程序实例
const vueApp = Vue.createApp({
//数据
data() {
return {
meter : 0,
kilometer : 0
}
},
//监听
watch : {
meter : function(val){
this.kilometer = val * 3600 / 1000;
},
kilometer : function(val){
this.meter = val * 1000 / 3600;
}
}
//使用 mount() 方法,装载应用程序实例的根组件
}).mount('#app');
</script>
执行结果:
3.3 监听对象
如果要监听的属性值是一个对象,要想监听对象内部值的变化,需要在监听属性的选项参数中设置 deep 选项的值为 true。
【实例】使用 watch 监听属性,监听对象的属性。
<body>
<div id="app"></div>
</body>
<!-- 引入 Vue 框架 -->
<script src="../js/vue.global.js"></script>
<script type="text/javascript">
//使用 Vue.createApp 函数创建一个应用程序实例
const vueApp = Vue.createApp({
//数据
data() {
return {
userInfo: {
userId: 1,
userName: "pan_junbiao的博客",
blogName: "您好,欢迎访问 pan_junbiao的博客",
blogUrl: "https://blog.csdn.net/pan_junbiao",
position: '前端工程师'
}
}
},
//监听
watch : {
userInfo:{
handler: function(newValue){
alert(`用户名称:${newValue.userName}\n新的职位:${newValue.position}\n博客信息:${newValue.blogName}\n博客地址:${newValue.blogUrl}`);
},
deep: true //重点代码
}
}
//使用 mount() 方法,装载应用程序实例的根组件
}).mount('#app');
//修改对象中的属性值
vueApp.userInfo.position = "Java工程师";
</script>
执行结果:
注意:
当监听的数据是一个数组或者对象时,回调函数中的新值和旧值是相等的,因为这两个形参指向的是同一个数据对象。
3.4 computed 与 watch 的比较
computed 计算属性与 watch 监听属性的比较:
简体属性是 Vue.js 提供的一种用于监测和响应数据变化的更通用的方式。但是,使用监听属性的方式编写的代码是命令式的重复代码,所以在一般情况中,更好的做法是使用计算属性而不是命令式的监听属性。
4、filters 过滤器
关于 Vue.js 中的 filters 过滤器:从 Vue 3.0 版本开始,已被删除。Vue 3.0 为了精简与优化代码,删除了 filters 过滤器,因为 methods 方法和 computed 计算属性也能够实现 filters 过滤器的功能。