当前位置: 首页 > news >正文

Vue计算属性和监听属性

一、计算属性

  计算属性关键词: computed。计算属性在处理一些复杂逻辑时是很有用的。

  可以看下以下反转字符串的例子:

<div id="app">
  {{ message.split('').reverse().join('') }}
</div>
//模板变的很复杂起来,也不容易看懂理解

  使用了计算属性的实例:

<div id="app">
  <p>原始字符串: {{ message }}</p>
  <p>计算后反转字符串: {{ reversedMessage }}</p>
</div>
 
<script>
var vm = new Vue({
  el: '#app',
  data: {
    message: 'Runoob!'
  },
  computed: {
    // 计算属性的 getter
    reversedMessage: function () {
      // `this` 指向 vm 实例
      return this.message.split('').reverse().join('')
    }
  }
})
</script>

  实例中声明了一个计算属性 reversedMessage 。提供的函数将用作属性 vm.reversedMessage 的 getter 。vm.reversedMessage 依赖于 vm.message,在 vm.message 发生改变时,vm.reversedMessage 也会更新。

1、computed vs methods

  我们可以使用 methods 来替代 computed,效果上两个都是一样的,但是 computed 是基于它的依赖缓存,只有相关依赖发生改变时才会重新取值。而使用 methods ,在重新渲染的时候,函数总会重新调用执行。

methods: {
  reversedMessage2: function () {
    return this.message.split('').reverse().join('')
  }
}

{{reversedMessage2()}}

  可以说使用 computed 性能会更好,但是如果你不希望缓存,你可以使用 methods 属性。

  此外,computed 对象内的方法如果在初始化时绑定到元素上的事件会先执行一次这个方法 ,而 methods 内的方法则不会。

2、computed setter

  computed 属性默认只有 getter ,不过在需要时你也可以提供一个 setter :

<div id="app">
  <p>{{ site }}</p>
</div>

<script>
var vm = new Vue({
  el: '#app',
  data: {
    name: 'Google',
    url: 'http://www.google.com'
  },
  computed: {
    site: {
      // getter
      get: function () {
        return this.name + ' ' + this.url
      },
      // setter
      set: function (newValue) {
        var names = newValue.split(' ')
        this.name = names[0]
        this.url = names[names.length - 1]
      }
    }
  }
})
// 调用 setter, vm.name 和 vm.url 也会被对应更新
vm.site = '测试计算属性 setter';
document.write('name: ' + vm.name);
document.write('<br>');
document.write('url: ' + vm.url);
</script>

  结果显示的就不是默认的name和url值,而不是 vm.site 的 setter 的值。

  setter 会被调用, vm.name 和 vm.url 也会被对应更新。

二、监听属性

  监听属性 watch,我们可以通过 watch 来响应数据的变化。

<div id = "computed_props">
    千米 : <input type = "text" v-model = "kilometers">
    米 : <input type = "text" v-model = "meters">
</div>
<p id="info"></p>
<script type = "text/javascript">
    var vm = new Vue({
    el: '#computed_props',
    data: {
        kilometers : 0,
        meters:0
    },
    methods: {
    },
    computed :{
    },
    watch : {
        kilometers:function(val) {
            this.kilometers = val;
            this.meters = val * 1000;
        },
        meters : function (val) {
            this.kilometers = val/ 1000;
            this.meters = val;
        }
    }
    });
    // $watch 是一个实例方法
    vm.$watch('kilometers', function (newValue, oldValue) {
    // 这个回调将在 vm.kilometers 改变后调用
    document.getElementById ("info").innerHTML = "修改前值为: " + oldValue + ",修改后值为: " + newValue;
})
</script>

  以上代码中我们创建了两个输入框,data 属性中, kilometers 和 meters 初始值都为 0。

  watch 对象创建了两个方法 kilometers 和 meters。

  当我们再输入框输入数据时,watch 会实时监听数据变化并改变自身的值。

 

转载于:https://www.cnblogs.com/goloving/p/8516870.html

相关文章:

  • Apple激活日期查询
  • numpy教程
  • 常见设计模式,总结的不错(转)
  • 数据schemaAvro简介
  • 在C++的函数中如何指定一个数组,使得这个数组的大小由函数的输入值来决定...
  • 电感(29)之铁氧体磁珠工作原理透彻详解
  • 访问控制2php相关配置
  • java web添加mysql过程中遇到的错误及解决办法
  • 软件架构师 如何工作
  • 常见前端知识摘要
  • 3 - 9 字典里的各种;;;;;集
  • git学习--远程分支删除
  • Hibernate【与Spring整合】
  • Jenkins之发送html附件邮件配置
  • 零散Linux命令
  • android高仿小视频、应用锁、3种存储库、QQ小红点动画、仿支付宝图表等源码...
  • isset在php5.6-和php7.0+的一些差异
  • vue--为什么data属性必须是一个函数
  • 百度地图API标注+时间轴组件
  • 诡异!React stopPropagation失灵
  • 基于组件的设计工作流与界面抽象
  • 猫头鹰的深夜翻译:JDK9 NotNullOrElse方法
  • 通过来模仿稀土掘金个人页面的布局来学习使用CoordinatorLayout
  • 物联网链路协议
  • puppet连载22:define用法
  • #define 用法
  • #FPGA(基础知识)
  • (LeetCode C++)盛最多水的容器
  • (Python第六天)文件处理
  • (zhuan) 一些RL的文献(及笔记)
  • (动手学习深度学习)第13章 计算机视觉---图像增广与微调
  • (附源码)SSM环卫人员管理平台 计算机毕设36412
  • (附源码)ssm教师工作量核算统计系统 毕业设计 162307
  • (附源码)计算机毕业设计SSM疫情社区管理系统
  • (亲测)设​置​m​y​e​c​l​i​p​s​e​打​开​默​认​工​作​空​间...
  • (使用vite搭建vue3项目(vite + vue3 + vue router + pinia + element plus))
  • (顺序)容器的好伴侣 --- 容器适配器
  • (译) 函数式 JS #1:简介
  • .Net 4.0并行库实用性演练
  • .NET CORE 3.1 集成JWT鉴权和授权2
  • .NET 指南:抽象化实现的基类
  • .net6解除文件上传限制。Multipart body length limit 16384 exceeded
  • .NET教程 - 字符串 编码 正则表达式(String Encoding Regular Express)
  • .net流程开发平台的一些难点(1)
  • .pub是什么文件_Rust 模块和文件 - 「译」
  • @EventListener注解使用说明
  • @软考考生,这份软考高分攻略你须知道
  • [100天算法】-实现 strStr()(day 52)
  • [Angular] 笔记 8:list/detail 页面以及@Input
  • [AutoSAR系列] 1.3 AutoSar 架构
  • [boost]使用boost::function和boost::bind产生的down机一例
  • [BZOJ4554][TJOI2016HEOI2016]游戏(匈牙利)
  • [C/C++]数据结构----顺序表的实现(增删查改)
  • [Delphi]一个功能完备的国密SM4类(TSM4)[20230329更新]
  • [GYCTF2020]Ez_Express