Vue中computed、methods与watch的区别总结


Posted in Javascript onApril 10, 2019

前言

对于那些开始学习Vue的人来说,对于方法、计算属性和观察者之间的区别有点混淆。

尽管通常可以使用它们中的每一个来完成或多或少相同的事情,但了解每个人在哪里胜过其他人还是很重要的。

在这个快速提示中,我们将了解Vue应用程序的这三个重要方面及其用例。我们将通过使用这三种方法中的每一种构建相同的搜索组件来实现这一点。

Methods

在一个方法中,或多或少是您所期望的——一个对象属性的函数。您可以使用方法对发生在DOM中的事件作出反应,或者可以从组件中的其他位置调用它们,例如,从计算属性或观察者中调用它们。方法用于对公共功能进行分组-例如,处理表单提交,或构建可重用的功能,如发出Ajax请求。

在Vue实例中的methods对象内创建方法:

new Vue({
 el: "#app",
 methods: {
 handleSubmit() {}
 }
})

当您想在模板中使用它时,您可以这样做:

<div id="app">
 <button @click="handleSubmit">
 Submit
 </button>
</div>

我们使用v-on指令将事件处理程序附加到dom元素,该元素也可以缩写为@符号。

现在,每次单击按钮时都会调用handleSubmit方法。对于要传递方法体中需要的参数的实例,可以执行以下操作:

<div id="app">
 <button @click="handleSubmit(event)">
 Submit
 </button>
</div>

这里我们传递一个事件对象,例如,它允许我们在表单提交的情况下阻止浏览器的默认操作。

但是,当我们使用一个指令来附加事件时,我们可以使用一个修饰符来更优雅地实现相同的事情: @click.stop=“handleSubmit”

现在我们来看一个使用方法过滤数组中数据列表的示例。

In the demo, we want to render a list of data and a search box. The data rendered changes whenever a user enters a value in the search box. The template will look like this:

在演示中,我们要呈现一个数据列表和一个搜索框。每当用户在搜索框中输入值时,所呈现的数据都会发生更改。模板将如下所示:

<div id="app">
 <h2>Language Search</h2>

 <div class="form-group">
 <input
  type="text"
  v-model="input"
  @keyup="handleSearch"
  placeholder="Enter language"
  class="form-control"
 />
 </div>

 <ul v-for="(item, index) in languages" class="list-group">
 <li class="list-group-item" :key="item">{{ item }}</li>
 </ul>
</div>

如您所见,我们引用的是handlesearch方法,每次用户在搜索字段中键入内容时都会调用该方法。我们需要创建方法和数据:

new Vue({
 el: '#app',
 data() {
 return {
  input: '',
  languages: []
 }
 },
 methods: {
 handleSearch() {
  this.languages = [
  'JavaScript',
  'Ruby',
  'Scala',
  'Python',
  'Java',
  'Kotlin',
  'Elixir'
  ].filter(item => item.toLowerCase().includes(this.input.toLowerCase()))
 }
 },
 created() { this.handleSearch() }
})

handlesearch方法使用输入字段的值更新列出的项。需要注意的一点是,在methods对象中,不需要使用this.handlesearch引用该方法(正如在react中必须做的那样)

Computed Properties

虽然上面示例中的搜索可以按预期工作,但更优雅的解决方案是使用计算属性。计算属性对于从现有源组合新数据非常方便,与方法相比,它们的一大优点是缓存了输出。这意味着,如果独立于计算属性的某些内容在页面上发生更改,并且重新呈现UI,则会返回缓存的结果,并且不会重新计算计算计算属性,从而避免了可能代价高昂的操作。

计算属性使我们能够使用我们可用的数据进行即时计算。在本例中,我们有一个需要排序的项目数组。我们希望在用户在输入字段中输入值时进行排序。

我们的模板看起来几乎与前面的迭代相同,除了我们正在传递v-for指令一个计算属性(filteredlist):

<div id="app">
 <h2>Language Search</h2>

 <div class="form-group">
 <input
  type="text"
  v-model="input"
  placeholder="Enter language"
  class="form-control"
 />
 </div>

 <ul v-for="(item, index) in filteredList" class="list-group">
 <li class="list-group-item" :key="item">{{ item }}</li>
 </ul>
</div>

脚本部分略有不同。我们声明了数据属性中的语言(以前这是一个空数组),而不是方法,我们将逻辑移入了计算属性:

new Vue({
 el: "#app",
 data() {
 return {
  input: '',
  languages: [
  "JavaScript",
  "Ruby",
  "Scala",
  "Python",
  "Java",
  "Kotlin",
  "Elixir"
  ]
 }
 },
 computed: {
 filteredList() {
  return this.languages.filter((item) => {
  return item.toLowerCase().includes(this.input.toLowerCase())
  })
 }
 }
})

filteredList计算属性将包含包含输入字段值的项数组。在第一次渲染时(当输入字段为空时),将渲染整个数组。当用户在字段中输入值时,filteredList将返回一个数组,其中包含输入到字段中的值。

使用计算属性时,要计算的数据必须可用,否则将导致应用程序出错

computed属性创建了一个新的filteredlist属性,这就是为什么我们可以在模板中引用它。每次依赖项执行此操作时,filteredlist的值都会更改。这里容易改变的依赖项是输入值。

最后,请注意,计算属性允许我们在模板中创建一个变量,该变量是由一个或多个数据属性构建的。一个常见的例子是从这样一个用户的名字和姓氏创建一个全名:

computed: {
 fullName() {
 return `${this.firstName} ${this.lastName}`
 }
}

在模板中,您可以执行全名。每当名字或姓氏的值更改时,全名的值将更改。

Watchers

Watchers对于希望响应已发生的更改(例如,属性或数据属性)执行操作的情况非常有用。正如Vue文档所提到的,当您想要执行异步或昂贵的操作以响应不断变化的数据时,这是最有用的。

在搜索示例中,我们可以返回到方法示例,并为输入数据属性设置一个观察程序。然后我们可以对输入值的任何变化作出反应。

首先,让我们恢复模板以使用语言数据属性:

<div id="app">
 <h2>Language Search</h2>

 <div class="form-group">
 <input
  type="text"
  v-model="input"
  placeholder="Enter language"
  class="form-control"
 />
 </div>

 <ul v-for="(item, index) in languages" class="list-group">
 <li class="list-group-item" :key="item">{{ item }}</li>
 </ul>
</div>

然后我们的Vue实例将如下所示:

new Vue({
 el: "#app",
 data() {
 return {
  input: '',
  languages: []
 }
 },
 watch: {
 input: {
  handler() {
  this.languages = [
   'JavaScript',
   'Ruby',
   'Scala',
   'Python',
   'Java',
   'Kotlin',
   'Elixir'
  ].filter(item => item.toLowerCase().includes(this.input.toLowerCase()))
  },
  immediate: true
 }
 }
})

这里,我将观察者设置为一个对象(而不是一个函数)。这是为了我可以指定一个即时属性,它将导致观察程序在组件被装载后立即触发。这会产生填充列表的效果。然后运行的函数在handler属性中。

总结:

正如他们所说,拥有强大的力量,责任重大。Vue为您提供了构建伟大应用程序所需的超级能力。知道何时使用它们是构建用户喜爱的内容的关键。方法、计算属性和观察者是您可用的超级能力的一部分。往前走,一定要好好利用它们!

原文地址:https://www.sitepoint.com/the-difference-between-computed-properties-methods-and-watchers-in-vue/添加链接描述

好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对三水点靠木的支持。

Javascript 相关文章推荐
Javascript实例教程(19) 使用HoTMetal(5)
Dec 23 Javascript
Apply an AutoFormat to an Excel Spreadsheet
Jun 12 Javascript
比较详细的关于javascript中void(0)的具体含义解释
Aug 02 Javascript
js解决select下拉选不中问题
Oct 14 Javascript
基于AngularJS实现页面滚动到底自动加载数据的功能
Oct 16 Javascript
javascript作用域链(Scope Chain)用法实例解析
Nov 30 Javascript
简单三步实现报表页面集成天气
Dec 15 Javascript
jQuery实现拼图小游戏(实例讲解)
Jul 24 jQuery
使用pm2自动化部署node项目的方法步骤
Jan 28 Javascript
es6中比较有用的7个技巧小结
Jul 12 Javascript
vue列表数据发生变化指令没有更新问题及解决方法
Jan 16 Javascript
JavaScript实现串行请求的示例代码
Sep 14 Javascript
JavaScript 性能提升之路(推荐)
Apr 10 #Javascript
详解vue-cli3 中跨域解决方案
Apr 10 #Javascript
js中数组常用方法总结(推荐)
Apr 09 #Javascript
JS隐藏号码中间4位代码实例
Apr 09 #Javascript
vue 点击展开显示更多(点击收起部分隐藏)
Apr 09 #Javascript
详解axios中封装使用、拦截特定请求、判断所有请求加载完毕)
Apr 09 #Javascript
关于vue状态过渡transition不起作用的原因解决
Apr 09 #Javascript
You might like
PHP的FTP学习(二)[转自奥索]
2006/10/09 PHP
社区(php&amp;&amp;mysql)六
2006/10/09 PHP
PHP提取字符串中的图片地址[正则表达式]
2011/11/12 PHP
php和mysql中uft-8中文编码乱码的几种解决办法
2012/04/19 PHP
getElementById在任意一款浏览器中都可以用吗的疑问回复
2007/05/13 Javascript
JavaScript插入动态样式实现代码
2012/02/22 Javascript
js函数获取html中className所在的内容并去除标签
2013/09/08 Javascript
JS鼠标滑过图片时切换图片实现思路
2013/09/12 Javascript
javascript窗口宽高,鼠标位置,滚动高度(详细解析)
2013/11/18 Javascript
js运动动画的八个知识点
2015/03/12 Javascript
Bootstrap基本样式学习笔记之按钮(4)
2016/12/07 Javascript
详解jQuery中的事件
2016/12/14 Javascript
ajax图片上传,图片异步上传,更新实例
2016/12/30 Javascript
用原生js做单页应用
2017/01/17 Javascript
Angular.JS中指令ng-if、ng-show/ng-hide和ng-switch的使用教程
2017/05/07 Javascript
vue 组件 全局注册和局部注册的实现
2018/02/28 Javascript
微信小程序实现弹出菜单功能
2018/06/12 Javascript
Node.js log4js日志管理详解
2018/07/31 Javascript
vue移动端项目缓存问题实践记录
2018/10/29 Javascript
[01:07:21]NAVI vs VG Supermajor 败者组 BO3 第二场 6.5
2018/06/06 DOTA
使用python实现knn算法
2017/12/20 Python
Python基于socket模块实现UDP通信功能示例
2018/04/10 Python
异步任务队列Celery在Django中的使用方法
2018/06/07 Python
详解如何减少python内存的消耗
2019/08/09 Python
python解释器spython使用及原理解析
2019/08/24 Python
TensorFlow实现指数衰减学习率的方法
2020/02/05 Python
python中如何打包用户自定义模块
2020/09/23 Python
宝信软件JAVA工程师面试经历
2012/08/19 面试题
主管职责范文
2013/11/09 职场文书
分公司总经理岗位职责
2014/08/03 职场文书
银行柜员与客户起冲突检讨书
2014/09/27 职场文书
求职自我推荐信
2015/03/24 职场文书
趣味运动会简讯
2015/07/20 职场文书
消防宣传标语大全
2015/08/03 职场文书
信息技术研修心得体会
2016/01/08 职场文书
优秀范文:《但愿人长久》教学反思3篇
2019/10/24 职场文书