Vue 基础语法之计算属性(computed)、侦听器(watch)、过滤器(filters)详解

目录
  • 1、Vue 实例选项
  • 2、计算属性(computed)
    • 2.1、computed 的基本用法
    • 2.2、computed 作为函数传参
    • 2.3、计算属性和函数的区别
  • 3、侦听器(watch)
    • 3.1、watch 的基本用法
    • 3.2、侦听器的配置项
  • 4、过滤器(filter)
    • 4.1、过滤器有什么用
    • 4.2、全局过滤器
    • 4.3、局部过滤器
    • 4.4、过滤器串联
    • 4.5、过滤器传参

1、Vue 实例选项

在实例化Vue对象时,需要为Vue的构造函数提供一系列的配置信息,代码如下:

new Vue({
	//选项
})

当使用 new 操作符创建 Vue 实例时,可以为实例传入一个选项对象,选项对象中有很多类型的数据,具体内容如下:

  • 数据选项:data、props、propsData、computed、methods、watch
  • DOM选项:el、template、render、renderError
  • 生命周期选项:beforeCreate、created、beforeMount、mounted、beforeUpdate、updated、beforeDestroy、destroyed、activated、deactivated、errorCaptured
  • 资源选项:directives、filters、components
  • 组合选项:parent、mixins、extends、provide、inject
  • 其他选项:name、delimiters、functional、model、inheritAttrs、comments

对于选项的学习,大家可以参考 Vue 官网的 API 文档,本章教程中只对 Vue 中的计算属性、过滤器、侦听器三个核心的选项做讲解。

2、计算属性(computed)

2.1、computed 的基本用法

计算属性就是 Vue 实例选项中的 computed,computed 的值是一个对象类型,对象中的属性值为函数,而且这个函数没办法接收参数,如果想为某个计算属性传参的话,可以使用闭包的方式。

这里需要注意的是,计算属性不能声明为箭头函数! 因为箭头函数中的 this 指向的是上下文中的 this,这样就不能在计算属性的函数中获取 Vue 实例对象 this 了。

计算属性有以下特点:

  • 模板中放入太多的逻辑会让模板过重且难以维护,使用计算属性可以让模板更加的简洁。
  • 计算属性是基于它们的响应式依赖进行缓存的。
  • computed比较适合对多个变量或者对象进行处理后返回一个结果值,也就是数多个变量中的某一个值发生了变化则我们监控的这个值也就会发生变化。

示例代码:

<div id="app">
	<p>{{ total }}</p>
</div>
<script type="text/javascript">
	new Vue({
		el: '#app',
		data: {
			a: 1
		},
		computed: {
			total(n) {
				return this.a + 5
			}
		}
	})
</script>

在浏览器中运行的结果如下:

2.2、computed 作为函数传参

computed 对象的属性值虽然是声明为函数,computed 的用法是和 data 一样的,作为属性使用,如果要把 computed 作为函数使用,可以返回一个闭包函数。示例代码如下:

<div id="app">
	<p>{{ total(6) }}</p>
</div>
<script type="text/javascript">
	new Vue({
		el: '#app',
		data: {
			a: 1
		},
		computed: {
			total() {
				return (n) => {
					return this.a + n
				}
			}
		}
	})
</script>

在浏览器中运行的效果如下:

2.3、计算属性和函数的区别

虽然计算属性(computed)和函数(methods)的声明过程是很相似的,但是功能上还是有所差别的,其中最大的区别就是 计算属性可以根据它所依赖的响应式数据进行缓存 ,简单来说,就是在计算属性声明的函数中,如果染回值依赖了 data 中声明的响应式数据的话,只有当依赖的 data 中的数据发生变化时,当前的计算属性函数才会重新执行,否则的话就直接获取上次执行后缓存的结果。这样做的好处是可以提高性能,减少不必要的重复运算。

示例代码如下:

<div id="app">
     <!--
        当多次调用 reverseString  的时候
        只要里面的 num 值不改变 他会把第一次计算的结果直接返回
    直到data 中的num值改变 计算属性才会重新发生计算
     -->
    <div>{{reverseString}}</div>
    <div>{{reverseString}}</div>
     <!-- 调用methods中的方法的时候  他每次会重新调用 -->
    <div>{{reverseMessage()}}</div>
    <div>{{reverseMessage()}}</div>
  </div>
  <script type="text/javascript">
    /*
      计算属性与方法的区别:计算属性是基于依赖进行缓存的,而方法不缓存
    */
    var vm = new Vue({
      el: '#app',
      data: {
        msg: 'Nihao',
        num: 100
      },
      methods: {
        reverseMessage: function(){
          console.log('methods')
          return this.msg.split('').reverse().join('');
        }
      },
      //computed属性的声明和data属性、methods属性是平级关系
      computed: {
        //reverseString属性名称是自定义的
        reverseString: function(){
          console.log('computed')
          var total = 0;
          // 当data中num 属性的值发生改变时,reverseString 函数会自动进行计算
          for(var i=0;i<=this.num;i++){
            total += i;
          }
         // 在reverseString函数中必须要有return,否则在页面中无法获取到计算后的值
          return total;
        }
      }
    });
  </script>

2.4、计算属性的 getter 和 setter 函数

计算属性虽然可以像 data 属性一样取值,但是如果要对计算属性赋值的话,必须使用 setter 方法,示例代码如下:

<div id="app">
     <!--
        当多次调用 reverseString  的时候
        只要里面的 num 值不改变 他会把第一次计算的结果直接返回
    直到data 中的num值改变 计算属性才会重新发生计算
     -->
    <div>{{reverseString}}</div>
    <div>{{reverseString}}</div>
     <!-- 调用methods中的方法的时候  他每次会重新调用 -->
    <div>{{reverseMessage()}}</div>
    <div>{{reverseMessage()}}</div>
  </div>
  <script type="text/javascript">
    /*
      计算属性与方法的区别:计算属性是基于依赖进行缓存的,而方法不缓存
    */
    var vm = new Vue({
      el: '#app',
      data: {
        msg: 'Nihao',
        num: 100
      },
      methods: {
        reverseMessage: function(){
          console.log('methods')
          return this.msg.split('').reverse().join('');
        }
      },
      //computed属性的声明和data属性、methods属性是平级关系
      computed: {
        //reverseString属性名称是自定义的
        reverseString: function(){
          console.log('computed')
          var total = 0;
          // 当data中num 属性的值发生改变时,reverseString 函数会自动进行计算
          for(var i=0;i<=this.num;i++){
            total += i;
          }
         // 在reverseString函数中必须要有return,否则在页面中无法获取到计算后的值
          return total;
        }
      }
    });
  </script>

点击重新计算按钮之前:

点击重新计算按钮之后:

在 reset() 函数中为计算属性 total 赋值,会被计算属性中的 set() 函数接收,然后再把值传给 data 中的 a 变量,那么此时获取到的计算属性值就是更新后的 a 变量 +5 之后的结果。

3、侦听器(watch)

3.1、watch 的基本用法

watch是监听器,其值为一个对象,对象中的属性值可以为函数、对象和数组。当data中的一个属性需要被观察期内部值的改变时,可以通过watch来监听data属性的变化。

watch监听器的基本用法如下:

  • 使用watch来响应数据的变化
  • 一般用于异步或者开销较大的操作
  • watch 中的属性 一定是data 中 已经存在的数据
  • 当需要监听一个对象的改变时,普通的watch方法无法监听到对象内部属性的改变,只有data中的数据才能够监听到变化,此时就需要deep属性对对象进行深度监听

示例代码:

<!-- 验证用户名 -->
<div id="app">
  <div>
    姓:<input type="text" v-model='lastName'>
  </div>
  <div>
    名:<input type="text" v-model='firstName'>
  </div>
  <div>
  	全名:{{fullName}}
  </div>
</div>

<script type="text/javascript">
  var vm = new Vue({
    el: '#app',
    data: {
      firstName: '张',
      lastName: '三'
    },
    // 计算属性
    watch: {
      firstName(val) {
        this.fullName = val + ' ' + this.lastName;
      },
      lastName(val) {
        this.fullName = this.firstName + ' ' + val;
      }
    }
  });
</script>

watch 对象中的 firstName 对应着 data 中的 firstName ,当 firstName 值发生改变时会自动触发 watch 中的 firstName() 函数的执行。同理,watch 中的 lastName 对应的也是 data 中的 lastName。

watch 对象中的函数属性的参数有两个,参数一是对应 data 中相同变量名属性被修改后的新值,参数二是该 data 属性修改前的旧值。

3.2、侦听器的配置项

如果要监听的 data 属性值是一个对象或者是数组,如果对象嵌套层级比较深的情况下,需要开启 watch 的深度监听。示例代码如下:

new Vue({
	el: '#app',
	data: {
		num: {
			a: 1,
			b: 2,
			c: {
				d: 3
			}
		}
	},
	watch: {
		num: {
			deep: true, // 开启深度监听
			handler(val, oldVal) {
				//...
			}
		}
	}
})

4、过滤器(filter)

4.1、过滤器有什么用

  • Vue.js允许自定义过滤器,可被用于一些常见的文本格式化。
  • 过滤器可以用在两个地方:双花括号插值和v-bind表达式。
  • 过滤器应该被添加在JavaScript表达式的尾部,由“管道”符号指示

4.2、全局过滤器

Vue 的全局 API 中提供了注册全局过滤器的函数 Vue.filter(),全局过滤器注册好之后所有的组件可以使用。

全局过滤器示例代码:

<div id="app">
    <input type="text" v-model='msg'>
      <!-- upper 被定义为接收单个参数的过滤器函数,表达式  msg  的值将作为参数传入到函数中 -->
    <div>{{msg | upper}}</div>
    <!--
      支持级联操作
      upper  被定义为接收单个参数的过滤器函数,表达式msg 的值将作为参数传入到函数中。
	  然后继续调用同样被定义为接收单个参数的过滤器 lower ,将upper 的结果传递到lower中
 	-->
    <div>{{msg | upper | lower}}</div>
    <div :abc='msg | upper'>测试数据</div>
  </div>

<script type="text/javascript">
  //  lower  为全局过滤器
  Vue.filter('lower', function(val) {
    return val.charAt(0).toLowerCase() + val.slice(1);
  });

  new Vue({
  	el: '#app'
  })
</script>

4.3、局部过滤器

局部过滤器被声明在 Vue 实例对象选项中的 filters 中,这里需要注意的是,全局注册时是filter,没有s的,而局部过滤器是filters,是有s的。

局部过滤器注册好之后只能在注册的组件内使用,示例代码如下:

var vm = new Vue({
  el: '#app',
  data: {
    msg: ''
  },
  filters: {
    upper: function(val) {
      return val.charAt(0).toUpperCase() + val.slice(1);
    }
  }
});

filters 属性 定义 和 data 已经 methods 平级,定义 filters 中的过滤器为局部过滤器。上面代码中的 upper 是自定义的过滤器名字,upper 被定义为接收单个参数的过滤器函数,表达式 msg 的值将作为参数传入到函数中。过滤器中一定要有返回值,这样外界使用过滤器的时候才能拿到结果。

4.4、过滤器串联

并且过滤器可以串联使用, 在此处是将filter1的值作为filter2的参数。

{{  data | filter1 | filter2  }}

4.5、过滤器传参

示例代码如下:

<div id="box">
  {{ message | filterA('arg1', 'arg2') }}
</div>
<script>
	  Vue.filter('filterA',function(n,a,b){
		 if(n<10){
		   return n+a;
		 }else{
		   return n+b;
		 }
	});

	new Vue({
	  el:"#box",
	  data:{
	    message: "哈哈哈"
	  }
	})
</script>

上面代码中,filterA 被定义为接收三个参数的过滤器函数。其中 message 的值作为第一个参数,普通字符串 ‘arg1’ 作为第二个参数,表达式 arg2 的值作为第三个参数。

在过滤器中第一个参数 对应的是管道符前面的数据 n 此时对应 message,第2个参数 a 对应 实参 arg1 字符串,第3个参数 b 对应 实参 arg2 字符串。

到此这篇关于Vue 基础语法之计算属性(computed)、侦听器(watch)、过滤器(filters)详解的文章就介绍到这了,更多相关vue计算属性侦听器内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Vue2和Vue3如何使用watch侦听器详解

    watch:侦听数据变化 (某个值的change事件) vue2.x data(){ return{ num:10 } }, watch:{ num:{ /* * newValue:当前值 * oldValue:修改上一刻的值 */ handler(newValue,oldValue){ // doSomething }, /* * deep:Boolean : 深度监听 * true: 监听堆的改变就 * false:只监听栈的改变(默认) */ deep:true/false, /* * i

  • 详解Vue3中侦听器watch的使用教程

    目录 watch 侦听器使用. 侦听器监听 reactive 监听多个参数执行各自逻辑 监听多个参数执行相同逻辑 上一节我们简单的介绍了一下vue3 项目中的计算属性,这一节我们继续 vue3 的基础知识讲解. 这一节我们来说 vue3 的侦听器. 学过 vue2 的小伙伴们肯定学习过侦听器,主要是用来监听页面数据或者是路由的变化,来执行相应的操作,在 vue3里面呢,也有侦听器的用法,功能基本一样,换汤不换药的东西. 侦听器是常用的 Vue API 之一,它用于监听一个数据并在数据变动时做一些

  • 一篇文章教你简单使用Vue的watch侦听器

    目录 侦听器watch  格式 设置侦听器: 总结 侦听器watch  函数名就是要侦听的元素的名字 传入的参数第一个是变化后的新值newval,第二个是变化前的旧值oldval  格式 方法格式的侦听器 无法在刚进入页面时自动触发,只有在侦听到变化才会触发 如果侦听的是对象,当对象的属性发生变化时,不会侦听到 对象格式的侦听器 通过immediate选项,可以让侦听器自动触发 通过deep选项,使侦听器深度侦听到对象中属性的变化 这是Vue实例中的data对象: 设置侦听器: 下面分别是方法格

  • 一文搞懂Vue3中watchEffect侦听器的使用

    目录 watchEffect 侦听器 watchEffect 侦听器使用 watchEffect 监听基本数据 watchEffect 监听复杂数据 watchEffect 啥时候执行 关闭 watchEffect 监听 上一节我们学习了 watch 侦听器的基础用法,用来监听页面数据的变化,那么今天呢,我们来学习一下 watch 侦听器的好兄弟 watchEffect 侦听器.这个相对来说比较简单,用的不是很多,当然了,根据自己的项目情况自行决定使用.这个就不详细说了,简单过一下子. watc

  • Vue数据监听器watch和watchEffect的使用

    目录 watch()函数 watchEffect()函数 watch与watchEffect之间的联系与区别 我们都知道监听器的作用是在每次响应式状态发生变化时触发,在组合式 API 中,我们可以使用 watch()函数和watchEffect()函数, 当你更改了响应式状态,它可能会同时触发 Vue 组件更新和监听器回调. 默认情况下,用户创建的监听器回调,都会在 Vue 组件更新之前被调用.这意味着你在监听器回调中访问的 DOM 将是被 Vue 更新之前的状态. 那么,我们来看一下,怎么才能

  • Vue 2.0 侦听器 watch属性代码详解

    用法 -------------------------------------------------------------------------------- 先来看看官网的介绍: 官网介绍的很好理解了,也就是监听一个数据的变化,当该数据变化时执行我们的watch方法,watch选项是一个对象,键为需要观察的表达式(函数),还可以是一个对象,可以包含如下几个属性: handler        ;对应的函数                          ;可以带两个参数,分别是新的值

  • Vue.js中关于侦听器(watch)的高级用法示例

    Vue侦听器watch 虽然计算属性在大多数情况下更合适,但有时也需要一个自定义的侦听器.这就是为什么 Vue 通过 watch 选项提供了一个更通用的方法,来响应数据的变化.当需要在数据变化时执行异步或开销较大的操作时,这个方式是最有用的.例如: <div id="watch-example"> <p> Ask a yes/no question: <input v-model="question"> </p> &l

  • Vue3源码分析侦听器watch的实现原理

    目录 watch 的本质 watch 的函数签名 侦听多个源 侦听单一源 watch 的实现 watch 函数 source 参数 cb 参数 options 参数 doWatch 函数 doWatch 函数签名 初始化变量 递归读取响应式数据 定义清除副作用函数 封装 scheduler 调度函数 设置 job 的 allowRecurse 属性 flush 选项指定回调函数的执行时机 创建副作用函数 执行副作用函数 返回匿名函数,停止侦听 总结 watch 的本质 所谓的watch,其本质就

  • 详解Vue3中的watch侦听器和watchEffect高级侦听器

    目录 1watch侦听器 2watchEffect高级侦听器 清除副作用:就是在触发监听之前会调用一个函数可以处理你的逻辑例如防抖 停止跟踪 watchEffect 返回一个函数 调用之后将停止更新 1watch侦听器 watch 需要侦听特定的数据源,并在单独的回调函数中执行副作用 watch第一个参数监听源 watch第二个参数回调函数cb(newVal,oldVal) watch第三个参数一个options配置项是一个对 { immediate:true //是否立即调用一次 deep:t

  • Vue学习笔记之计算属性与侦听器用法

    本文实例讲述了Vue计算属性与侦听器用法.分享给大家供大家参考,具体如下: vue之所以加载速度非常块,是因为在数据改变时,它并不是将所有组件都刷新,而是在重用代码的基础上对发生改变的地方进行渲染.同时,还得益于计算属性的使用: 1.计算属性 像绑定普通属性一样在模板中绑定计算属性.例如reverseName属性依赖于firstName和lastName,当firstName或lastName发生改变时,依赖于它的 reverseName 也会更新. 利用函数方法也可以实现类似的效果,不同的是计

  • Vue计算属性与侦听器和过滤器超详细介绍

    目录 1. 计算属性 1.1 使用方法 1.2 案例-购物车合计使用计算属性 2. 侦听器 3. 过滤器 1. 计算属性 1.1 使用方法 概述: 模板中放入太多的逻辑会让模板过重且难以维护,使用计算属性可以让模板变得简洁易于维护.计算属性是基于它们的响应式依赖进行缓存的,计算属性比较适合对多个变量或者对象进行处理后返回一个结果值,也就是数多个变量中的某一个值发生了变化则我们监控的这个值也就会发生变化. 计算属性定义在Vue对象中,通过关键词computed属性对象中定义一个个函数,并返回一个值

  • 深入浅析Vue.js计算属性和侦听器

    一. 概述 计算属性 模板内的表达式非常便利,但是设计它们的初衷是用于简单运算的.在模板中放入太多的逻辑会让模板过重且难以维护.例如: <div id="example"> {{ message.split('').reverse().join('') }} </div> 在这个地方,模板不再是简单的声明式逻辑.你必须看一段时间才能意识到,这里是想要显示变量 message 的翻转字符串.当你想要在模板中多次引用此处的翻转字符串时,就会更加难以处理. 所以,对于

  • vue 计算属性和侦听器的使用小结

    1. 计算属性和侦听器 1.1 计算属性 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <script src="https://cdn.staticfile.org/vue/2.4.2/vue.min.js"></script> </head> <body> <div id="app"

  • 计算属性和侦听器详情

    目录 1.计算属性 1.1 基础例子 1.2 计算属性缓存 vs 方法 1.3 计算属性 vs 侦听属性 1.4 计算属性的 setter 2.侦听器 1.计算属性 模板内的表达式非常便利,但是设计它们的初衷是用于简单运算的.在模板中放入太多的逻辑会让模板过重且难以维护. 例如: <div id="example"> {{ message.split('').reverse().join('') }} </div> 在这个地方,模板不再是简单的声明式逻辑.你必须

  • 详解Vue3 中的计算属性及侦听器

    目录 计算属性 缓存 getter 和 setter 侦听器 配置选项 其它写法 计算属性 我们知道,在模板中可以直接通过插值语法显示一些data中的数据,但是在某些情况,我们可能需要对数据进行一些转化后再显示,或者需要将多个数据结合起来进行显示 在模板中使用表达式,可以非常方便的实现,但是设计它们的初衷是用于简单的运算,在模板中放入太多的逻辑会让模板过重和难以维护,并且如果多个地方都使用到,那么会有大量重复的代码 所以我们希望将业务逻辑和UI界面进行分离,其中一种方式就是将逻辑抽取到一个met

  • vue中的计算属性和侦听属性

    计算属性 计算属性用于处理复杂的业务逻辑 计算属性具有依赖性,计算属性依赖 data中的初始值,只有当初始值改变的时候,计算属性才会再次计算 计算属性一般书写为一个函数,返回了一个值,这个值具有依赖性,只有依赖的那个值发生改变,他才会重新计算 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewpo

  • 深入了解Vue3中侦听器watcher的实现原理

    目录 watch API 的用法 watch API实现原理 标准化source 构造回调函数 创建scheduler 创建effect 返回销毁函数 异步任务队列的设计 异步任务队列的创建 异步任务队列的执行 检测循环更新 优化:只用一个变量 watchEffect 注册无效回调函数 总结 在平时的开发工作中,我们经常使用侦听器帮助我们去观察某个数据的变化然后去执行一段逻辑. 在 Vue.js 2.x 中,你可以通过 watch 选项去初始化一个侦听器,称作 watcher: export d

  • 详解vue 计算属性与方法跟侦听器区别(面试考点)

    计算属性 模板内的表达式非常便利,但是设计它们的初衷是用于简单运算的.在模板中放入太多的逻辑会让模板过重且难以维护.例如: <div id="example"> {{ message.split('').reverse().join('') }} </div> 在这个地方,模板不再是简单的声明式逻辑.你必须看一段时间才能意识到,这里是想要显示变量 message 的翻转字符串.当你想要在模板中多次引用此处的翻转字符串时,就会更加难以处理. 所以,对于任何复杂逻辑

  • Vue.js第三天学习笔记(计算属性computed)

    今天给大家分享下vue.js中的计算属性(computed) 示例一 computed的get属性 html: <template> <div class="input-text"> <input type="text" v-model='firstName'> <input type="text" v-model='lastName'> {{fullName}} </div> <

随机推荐