一文弄清楚vue中的computed和methods

news2024/11/28 8:35:22

1.实现业务

我们现在需要实现一个业务,就是我们有一个输入框,之后我们修改输入框的值,就在此时输入框的值会呈现到页面中的h1标签上去

2.利用Vue中的插值语法实现业务

2.1什么是插值语法?

插值语法就是vue中用来存放预留值得方法,利用双大括号展现出来( {{}} ),它可以在页面上保留一个值,该值与vue实例的data属性里面的属性值紧密相连

2.2利用插值语法实现业务逻辑

因为要将输入框的值与页面的h1标签进行一个实时连接,所以我们需要用到v-model标签,让输入框的值与vue实例的data属性值进行一个双向绑定,就能实现数据的一个实时呈现。

<body>
  <!-- 给一个容器 -->
  <div id="root">
    请输入信息:<input type="text" v-model="inputText">
    <br>
    <h1>{{inputText}}</h1> // 插值语法,因为vue实例中的属性值都是能直接运用在html文件里的,所以不需要写 vm.inputText
  </div>
  <script>
    Vue.config.productionTip = false; // config是Vue的配置选项,这里表示不让vue产生额外的提示信息
    const vm = new Vue({
      el:'#root', // el属性值,可以让vue知道去单独管理哪一个页面
      data:{ // data标签存放着页面可以直接使用的数据
        inputText: '我们是努力的人儿'
      }
    })
  </script>
</body>

编辑切换为居中

插入语法实现业务

实时更新步骤,当我们使用v-model语法时,我们更改输入框的值,那么就会实时更新vue实例里面的_data中的inputText的值,之后vue再更新页面,使插入语法的inputText进行更新。

2.3这种方式的问题在哪?

问题在于,假如业务还有扩展,说是想将输入框的值再换种别的方式呈现在h1标签上,例如只展现3个字符、或者变成大小写等等业务扩展,那么业务一旦多了,我们再页面的插值语法中就会出现代码冗长的情况(虽然不报错),但是极度不符合Vue的风格指南的标准,所以我们还是老老实实去学习别的方法实现该业务

3.利用Vue中的methods搭配插入语法实现业务

3.1Vue中的methods是什么?

我们可以使用methods属性给 Vue 定义方法,将所有方法放到这个属性里头,我们可以直接利用方法名称就可以直接调用这个方法

3.2利用Vue中的methods属性与插值语法实现业务

<body>
  <!-- 给一个容器 -->
  <div id="root">
    请输入信息:<input type="text" v-model="inputText">
    <br>
    <h1>{{fullText()}}</h1> // 这里当Vue的数据改变时,就会重新解析模板,这个方法就会自行调用
  </div>
  <script>
    Vue.config.productionTip = false; // config是Vue的配置选项,这里表示不让vue产生额外的提示信息
    const vm = new Vue({
      el:'#root',
      data:{
        inputText: '我们是努力的人儿'
      },
      methods:{
        fullText(){ // 方法的定义
          console.log('@----','fullText()') // 用于测试该方法存在的问题
          console.log(this) // 这里面的this是指向Vue实例的
          return this.inputText // 这里的this是关键
        }
      }
    })
  </script>
</body>

编辑切换为居中

methods属性搭配插入语法实现业务

注意:

当我们利用该方式实现业务时,方法里面的this是关键,该方法里面的this指向Vue实例,因为该方法是由普通函数定义的,且被挂载在Vue实例上,所以this指向Vue实例,说明这个时候的方法定义千万不能用箭头函数,因为箭头函数没有自己的this,如果用箭头函数的话,this存在不确定性,不方便业务的实现

总结:

我们在methods属性定义方法时,我们需要利用定义普通函数的方式定义方法,千万不能使用箭头函数定义方法,因为this存在不确定性,对于实现业务不友好

该方式解决了单个插入语法实现业务时所遇到的问题,利用methods属性,将扩展业务写入方法中,满足Vue的风格指南标准

3.3这种方式的问题在哪?

因为methods属性定义的方法是以函数调用的方式展现在文件中的,那么只要Vue中任意数据改变,那么Vue就会重新解析模板,顺带就会将它一起调用,也就是说使用这种方式实现这类计算业务是有损耗的,因为只要Vue有数据变动,那么就需要无限制的重新调用,浪费资源,所以我们继续探讨新的方法来实现这类计算业务

<body>
  <!-- 给一个容器 -->
  <div id="root">
    请输入信息:<input type="text" v-model="inputText">
    <br>
    <!-- 这里假设页面有多个地方使用到了这个方法 -->
    <h1>{{fullText()}}</h1>
    <h1>{{fullText()}}</h1>
    <h1>{{fullText()}}</h1>  
    <h1>{{fullText()}}</h1>
  </div>
  <script>
    Vue.config.productionTip = false; // config是Vue的配置选项,这里表示不让vue产生额外的提示信息
    const vm = new Vue({
      el:'#root',
      data:{
        inputText: '我们是努力的人儿'
      },
      methods:{
        fullText(){
          console.log('@----','fullText')
          return this.inputText
        }
      }
    })
  </script>
</body>

编辑切换为居中

展现了methods属性实现业务的问题

4.利用Vue中的computed属性搭配插入语法实现业务

4.1Vue中的computed属性是什么?

所谓computed属性,就是我们常说的计算属性,计算属性是说,我们对已有的属性(Vue实例中的data属性的属性值)进行加工得到的全新属性,我们就称之为是计算属性

注意

因为computed计算属性可能计算的比较复杂,所以在Vue定义computed计算属性时需要将计算属性定义为一个对象,且对象里面必须包含getter,如果不包含getter的话,那么就会报错,提示警告

const vm = new Vue({
  el:'#root',
  data:{
    inputText: '我们是努力的人儿'
  },
  computed:{
    fullText:{ //定义了一个计算属性为fullText对象,但此时里面没有存放getter,所以会报错
      
    }
  }
})

编辑切换为居中

错误提示

4.2利用Vue中的computed属性搭配插入语法实现业务

<body>
  <!-- 给一个容器 -->
  <div id="root">
    请输入信息:<input type="text" v-model="inputText">
    <br>
    <!-- 因为fullText是挂载在Vue实例上面的计算属性,所以不需要使用fullText.get(),而可以直接使用它的名称来完成计算属性的运行 -->
    <!-- 这里因为fullText是一个对象,触发效果的是里面的getter,所以这里不需要打括号 -->
    <h1>{{fullText}}</h1>
  </div>
  <script>
    Vue.config.productionTip = false; // config是Vue的配置选项,这里表示不让vue产生额外的提示信息
    const vm = new Vue({
      el:'#root',
      data:{
        inputText: '我们是努力的人儿'
      },
      computed:{
        fullText:{ 
          get(){
            console.log('@----','fullText')
            return this.inputText //这里的this也是关键,指向Vue实例
          }
        }
      }
    })
  </script>
</body>

当我们定义了计算属性时,我们会发现在Vue工具中会多出一个computed

编辑切换为居中

computed搭配插入语法实现业务

这个方法就打破了前两种方法的弊端,利用这个方法可以解决光用插入语法而实现不了业务扩展、使用methods对计算业务而导致资源浪费等问题

<body>
  <!-- 给一个容器 -->
  <div id="root">
    请输入信息:<input type="text" v-model="inputText">
    <br>
    <!-- 这里假设页面有多个地方使用到了这个计算属性 -->
    <h1>{{fullText}}</h1>
    <h1>{{fullText}}</h1>
    <h1>{{fullText}}</h1>  
    <h1>{{fullText}}</h1>
  </div>
  <script>
    Vue.config.productionTip = false; // config是Vue的配置选项,这里表示不让vue产生额外的提示信息
    const vm = new Vue({
      el:'#root',
      data:{
        inputText: '我们是努力的人儿'
      },
      computed:{
        fullText:{ 
          get(){
            console.log('@----','fullText')
            return this.inputText //这里的this也是关键,指向Vue实例
          }
        }
      }
    })
  </script>
</body>

编辑切换为居中

展现了computed对于计算属性的优点

注意

getter有什么用?当有人读取fullText时,get就会被调用,且返回值就作为fullText的值

getter什么时候调用?1.初次读取fullText时,2.所以来的数据发生变化时

4.3计算属性的简写方式

当我们确定了不需要对计算属性进行修改(setter)而只去读取(getter)它的值时,我们才能使用简写方法

<body>
  <!-- 给一个容器 -->
  <div id="root">
    请输入信息:<input type="text" v-model="inputText">
    <br>
    <h1>{{fullText}}</h1>
  </div>
  <script>
    Vue.config.productionTip = false; // config是Vue的配置选项,这里表示不让vue产生额外的提示信息
    const vm = new Vue({
      el:'#root',
      data:{
        inputText: '我们是努力的人儿'
      },
      computed:{
        fullText(){
          console.log('@----','fullText');
          return this.inputText
        }
      }
    })
  </script>
</body>
注意

虽然看着fullText是一个函数了,但是它其实并不是一个函数,只是将计算属性名和getter结合了,所以在页面插入语法中调用时,依旧是调用它的计算属性名就行了

5.总结

计算属性:

要用的属性不存在,要通过已有的属性(Vue实例上的data属性值)计算得来

原理:底层借助了Object.defineProperty方法提供的getter和setter

优势:与methods属性相比,computed内部有缓存机制(数据复用),效率更高,调试更方便

计算属性最终会出现在vm上,直接读取使用即可

如果计算属性要被修改,那必须写setter去响应修改,且setter要引起计算时依赖的数据发生变化

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/142865.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【前端】CSS盒子模型

五、盒子模型 1.1盒子模型的介绍 盒子的概念 页面中的每一个标签&#xff0c;都可看做是一个“盒子”&#xff0c;通过盒子的视角方便的进行布局浏览器在渲染&#xff08;显示&#xff09;网页时&#xff0c;会奖网页中的元素看作是一个个的矩形区域&#xff0c;我们也形象地…

<Python的函数(1)>——《Python》

目录 1. 函数 2. 语法格式 2.1 创建函数/定义函数 ​2.2 调用函数/使用函数 3. 函数参数 4. 函数返回值 5. 变量作用域 后记&#xff1a;●由于作者水平有限&#xff0c;文章难免存在谬误之处&#xff0c;敬请读者斧正&#xff0c;俚语成篇&#xff0c;恳望指教&…

Android input 事件分发 -- inputReader

inputReaderinputReaderinputReader 这个章节主要是围绕inputReader 、inputReaderThread进行的&#xff0c;老规矩先上时序图通过前面我们已经知道了InputReader和InputReaderThread都是在InputManager的构造函数里面new出来的&#xff0c;然后InputReaderThread的启动是在Sys…

图文详解:内存总是不够,我靠HBase说服了Leader为新项目保驾护航

最近在工作中用到了 Hbase 这个数据库&#xff0c;也顺便做了关于 Hbase 的知识记录来分享给大家。其实 Hbase的内容体系真的很多很多&#xff0c;这里介绍的是小羽认为在工作中会用到的一些技术点&#xff0c;希望可以帮助到大家。 可以这么说互联网都是建立在形形色色的数据…

剑指offer----C语言版----第十天

目录 1. 二进制中 1 的个数 1.1 题目描述 1.2 可能引起错误的解法 1.3 常规解法 1.4 思路优化 1. 二进制中 1 的个数 原题链接: 剑指 Offer 15. 二进制中1的个数 - 力扣&#xff08;LeetCode&#xff09;https://leetcode.cn/problems/er-jin-zhi-zhong-1de-ge-shu-lcof…

电路方案分析(十五)符合 EMC 标准的汽车制动灯和尾灯设计方案

符合 EMC 标准的汽车制动灯和尾灯设计方案 tips&#xff1a;TI设计方案参考分析&#xff1a;TI Designs&#xff1a;TIDA-01374 1.系统描述 1.1关键参数 2.系统概述 2.1系统框图 2.2关键元器件 3.设计原理 3.1双重亮度设计 3.2 电荷泵设计 3.4 LED故障设计 3.3 MOSFET驱动电…

LeetCode Hot 100 笔记

文章目录链表21. 合并两个有序链表栈20. 有效的括号Java栈链表 链表的题目一般都不太难&#xff0c;画图&#xff0c;别怕麻烦 21. 合并两个有序链表 解法一&#xff1a;迭代 用一个指针cur跟踪当前节点&#xff0c;每次从list1和list2中选取小的节点&#xff0c;链接起来建…

什么是轻量化,轻量化模型is all your need hhh

其实学了几个小月&#xff0c;我们肯定知道&#xff0c;MLP有多deeper &#xff0c;卷积层有多少层呀 抑或是Transformer架构&#xff0c;大量的参数&#xff0c;只能用huge 来描述&#xff0c; 可实际上我们的设备&#xff0c;有时候并没有服务器那么厉害&#xff0c;所以人…

阿里云认证为什么那么多人考?考试内容难不难?

我国人口密集&#xff0c;每年有大量的毕业生涌进社会&#xff0c;除此之外还有很多进入社会很久的打工人&#xff0c;想要跳槽&#xff0c;到更加挣钱的岗位&#xff0c;待遇更好的公司去。为了能够早日买房、买车&#xff0c;很多人会选择社会热门行业去学习&#xff0c;甚至…

sqli-labs 第七关 多命通关攻略

sqli-labs 第七关 多命通关攻略描述字符串与数值之间的转换判断注入类型返回结果正常输入不正常输入错误输入总结判断注入类型判断是否为字符型注入判断是否为单引号字符型注入判断是否为双引号字符型注入判断是否为数值型注入总结判断注入类型&#xff08;修正版&#xff09;字…

二十六、Docker (2)

&#x1f33b;&#x1f33b; 目录一、Docker的常用命令 (阶段A)1.1 帮助命令1.2 镜像命令1.3 容器命令1.3.1 新建容器并启动1.3.2 列出所有运行的容器1.3.3 退出容器1.3.4 删除容器1.3.5 启动和停止容器的操作1.4 常用的其它命令1.4.1 后台启动容器1.4.2 查看日志1.4.3 查看容器…

如何搭建私域流量?

如今已经进入存量用户时代&#xff0c;越来越多的企业也明白了存量用户的重要性&#xff0c;因此企业都非常重视私域流量的搭建&#xff0c;以挖掘客户的价值。 前言 如今已经进入存量用户时代&#xff0c;越来越多的企业也明白了存量用户的重要性&#xff0c;因此企业都非常重…

安卓搭建好的模拟机,为调试准备

​ 这一节直接分享制作好的虚拟机&#xff0c;镜像系统&#xff0c;以及安卓源码&#xff0c;直接节省你的时间去配置&#xff0c;编译。 下来我来分享下搭建步骤&#xff1a; 1 虚拟机下载vm 12 pro &#xff0c;这个网上百度就可以&#xff0c;原则13,14也都是可以的。 2 下…

移动魔百盒CM311-3-YST-晨星MSO9385-语音首页正常-TTL刷机包

移动魔百盒CM311-3-YST-晨星MSO9385-语音首页正常-TTL刷机包 固件特点&#xff1a; 1、三网通用&#xff1b; 2、开放原厂固件屏蔽的市场安装和u盘安装apk&#xff1b; 3、无开机广告&#xff0c;无系统更新&#xff0c;不在被强制升级&#xff1b; 4、大量精简内置的没用…

熬夜搞了 17000 字,终于把你这个 ES 玩明白了

平常经常用ES(ElasticSearch), 觉得这真是个好玩意儿&#xff0c;所以来分享一篇文章&#xff0c;希望通过这篇文章能让读者大致了解ES是做什么的以及它的使用和基本原理。 可能有的读者航海不知道ES是个啥玩儿&#xff0c;别着急&#xff0c;看完本文后&#xff0c;相信你会了…

import...from... 和 require 如何找到模块位置?

import Vue from "vue"; 为什么不用写相对地址和绝对地址就能够导出 Vue 呢&#xff1f;似乎也没有配置路径&#xff1f;也没有配置映射&#xff0c;那么究竟 from "vue"; 对应的究竟是那个路径呢&#xff1f; 先提出两个可能的方案 1.VS Code/WebStorm …

【每天学习一点新知识】nmap端口扫描

nmap所识别的6个端口状态open(开放的)应用程序正在该端口接收TCP 连接或者UDP报文。发现这一点常常是端口扫描 的主要目标。安全意识强的人们知道每个开放的端口 都是攻击的入口。攻击者或者入侵测试者想要发现开放的端口。 而管理员则试图关闭它们或者用防火墙保护它们以免妨碍…

Java封装公共Result结果返回类

前言 在使用Java开发接口请求中&#xff0c;我们需要对请求进行进行统一返回值&#xff0c;这时候我们自己封装一个统一的Result返回类&#xff0c;下面就介绍下我用的这种的这个类 当然&#xff0c;也可以使用第三方库封装的Result结果返回类&#xff0c;根据个人喜好选择即可…

学习笔记之Vue脚手架(三)

&#xff08;三&#xff09;使用Vue脚手架 使用Vue脚手架&#xff08;三&#xff09;使用Vue脚手架一、创建Vue脚手架1.1 说明1.2 具体步骤二、分析脚手架结构2.1 配置文件2.2 src文件夹2.3 public文件夹一、创建Vue脚手架 1.1 说明 1.Vue脚手架是Vue官方提供的标准开发工具&…

电脑技巧:分享常用的电脑快捷键

❤️作者主页&#xff1a;IT技术分享社区 ❤️作者简介&#xff1a;大家好,我是IT技术分享社区的博主&#xff0c;从事C#、Java开发九年&#xff0c;对数据库、C#、Java、前端、运维、电脑技巧等经验丰富。 ❤️个人荣誉&#xff1a; 数据库领域优质创作者&#x1f3c6;&#x…