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 相关文章推荐
jQuery中调用WebService方法小结
Mar 28 Javascript
在IE浏览器中resize事件执行多次的解决方法
Jul 12 Javascript
javascript中的=等号个数问题两个跟三个有什么区别
Oct 23 Javascript
jQuery中ajax的load()方法用法实例
Dec 26 Javascript
jQuery+html5实现div弹出层并遮罩背景
Apr 15 Javascript
跟我学习javascript的var预解析与函数声明提升
Nov 16 Javascript
Js动态设置rem来实现移动端字体的自适应代码
Oct 14 Javascript
微信小程序侧边栏滑动特效(左右滑动)
Jan 23 Javascript
JavaScript实现弹出广告功能
Mar 30 Javascript
react.js CMS 删除功能的实现方法
Apr 17 Javascript
Vue精简版风格指南(推荐)
Jan 30 Javascript
详解从买域名到使用pm2部署node.js项目全过程
Mar 07 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
PHP5.0对象模型探索之抽象方法和抽象类
2006/09/05 PHP
通过对php一些服务器端特性的配置加强php的安全
2006/10/09 PHP
浅析PHP中的字符串编码转换(自动识别原编码)
2013/07/02 PHP
PHP错误Allowed memory size of 67108864 bytes exhausted的3种解决办法
2014/07/28 PHP
作为程序员必知的16个最佳PHP库
2015/12/09 PHP
Yii调试查看执行SQL语句的方法
2016/07/15 PHP
php 利用socket发送GET,POST请求的实例代码
2020/07/04 PHP
js浏览器本地存储store.js介绍及应用
2014/05/13 Javascript
使用JavaScript为一张图片设置备选路径的方法
2017/01/04 Javascript
jQuery ajax实现省市县三级联动
2021/03/07 Javascript
微信小程序使用audio组件播放音乐功能示例【附源码下载】
2017/12/08 Javascript
vue如何解决循环引用组件报错的问题
2018/09/22 Javascript
Vue项目history模式下微信分享爬坑总结
2019/03/29 Javascript
微信小程序如何再次获取用户授权的方法
2019/05/10 Javascript
JS中call()和apply()的功能及用法实例分析
2019/06/28 Javascript
微信小程序分包加载代码实现方法详解
2019/09/23 Javascript
初学Python实用技巧两则
2014/08/29 Python
python实现发送邮件功能代码
2017/12/14 Python
pandas 小数位数 精度的处理方法
2018/06/09 Python
python 实现求解字符串集的最长公共前缀方法
2018/07/20 Python
Python实现蒙特卡洛算法小实验过程详解
2019/07/12 Python
基于pandas中expand的作用详解
2019/12/17 Python
css3.0 图形构成实例练习一
2013/03/19 HTML / CSS
详解HTML5中的元素与元素
2015/08/17 HTML / CSS
UGG美国官网:购买UGG雪地靴、拖鞋和鞋子
2017/12/31 全球购物
夏尔巴人登珠峰品牌:Sherpa Adventure Gear
2018/02/08 全球购物
俄罗斯名牌服装网上商店:UNIQUE FABRIC
2019/07/25 全球购物
优秀党员转正的自我评价
2013/10/06 职场文书
实习自我鉴定范文
2013/10/30 职场文书
《陋室铭》教学反思
2014/02/26 职场文书
纪念一二九运动演讲稿
2014/09/16 职场文书
个人向公司借款协议书
2014/10/09 职场文书
优秀班集体申报材料
2014/12/25 职场文书
赡养老人协议书范本
2015/08/06 职场文书
Html分层的box-shadow效果的示例代码
2021/03/30 HTML / CSS
Python pygame实现中国象棋单机版源码
2021/06/20 Python