三、vue_options之data、methods属性选项

news2025/1/12 5:56:29

一、data属性

data属性是传入一个函数,并且该函数需要返回一个对象:

  • 在Vue2.x的时候,也可以传入一个对象(虽然官方推荐是一个函数);
  • 在Vue3.x的时候,必须传入一个函数,否则就会直接在浏览器中报错;

data中返回的对象会被Vue的响应式系统劫持,之后对该对象的修改或者访问都会在劫持中被处理 

  • 所以我们在template或者app中通过{{counter}}访问counter,可以从对象中获取到数据
  • 所以我们修改counter的值时,app中的{{counter}}也会发生改变

具体这种响应式的原理,我们后面会有专门的篇幅来讲解。

(1)案例

我们现在有个button按钮,我怎么通过点击这个button按钮去改变message的值?

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <div id="app">
      <h2>{{message}}</h2>
      <button @click="changeMessage">改变message</button>
    </div>
    <script src="./lib/vue.js"></script>

    <script>
      const app = Vue.createApp({
        // data: option api
        data: function () {
          return {
            message: 'Hello World',
          };
        },
        // methods: option api
        methods: {
          changeMessage: function () {
            this.message = '奥利给';
          },
        },
      });

      app.mount('#app');
    </script>
  </body>
</html>

 

二、methods属性

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <div id="app">
      <h2>当前计数: {{counter}}</h2>
      <button @click="increment">+1</button>
      <button @click="decrement">-1</button>
    </div>
    <script src="./lib/vue.js"></script>
    <script>
      const app = Vue.createApp({
        data: function () {
          return {
            counter: 0,
          };
        },
        methods: {
          increment: function () {
            console.log(this);
            this.counter++;
          },
          decrement: function () {
            this.counter--;
          },
        },
      });

      app.mount('#app');
    </script>
  </body>
</html>

有同学很好奇,这里methods里面的调用的this是什么?

如果我们只单纯这么看,这里的this能知道指向的是什么吗?很明显不能。因为这里的this具体是什么,取决于这个函数到底是如何被调用的。

  • 如果这个函数直接这么调用 increment() ,那这里的this指向的是window。
  • 那如果我们把increment函数放到obj里面,我们直接obj.increment,那就等同于increment。
  • 如果obj.increment(),这样子绑定的就是obj对象。(隐式绑定)

我们来重新考虑一下我们大概要实现一个什么样子的功能?因为我们需要改变counter的值,我们通过点击按钮触发increment这个函数,然后要在这个函数里面通过this去访问data里面的counter,改掉这个值之后上面的计数{{counter}}值才会发生改变。

 

那我们这里可以用window.counter++吗?明显不行。

  • window有counter吗?明显没有。
  • window可以改变上面的counter吗?明显也不可以。 

其实函数有下面三种写法, 方法1和方法2其实是一样的。我们重点看方法3。

methods: {
          // 方法1
          increment: function () {
            console.log(this);
            this.counter++;
          },
          // 方法2,es6的写法
          increment() {  
          },
          // 方法3
          increment: () => {
            console.log(this);
          },
        },

首先我们了解一下箭头函数是什么意思。

箭头函数是一种简写的函数语法,可以更容易地创建匿名函数。它通常使用箭头 => 来代替函数关键字和return语句。例如,(x) => x * 2 可以代替 function(x) { return x * 2 }。这使得代码更简洁、更容易理解。

箭头函数会绑定this吗?不会,那他就去找谁?他就会去找他上层作用域里面的this。那他上层作用域是什么?难道是methods吗?很明显不是,methods是一个对象类型,没有自己作用域这一说。我们继续往上找,methods上面是什么?是不是vue创建app实例的时候需要传入的一个对象?那他也是一个对象肯定也没有自己作用域这一说。然后他继续往上层作用域里面找,再上面一层是不是就是全局作用域了。所以你在全局作用域里面打印this,肯定和箭头函数打印的this是同一个this。

 

 


看完箭头函数中的this指向,我们再来看下下面这个this指向什么?我们点击触发一下。

 

大家看一下,是不是一个代理对象。为什么又是一个代理对象呢?其实本质上前面跟大家讲到过,

当前的这种对象会被代理,代理之后我们是不是可以通过这个代理对象对里面的counter进行修改?当然可以。(后续会更深层次的继续讲原理)。

其实这个this在内部,如果你是一个普通函数的话,他是可以绑定this的,也就是说在执行increment这个函数的时候,他是会给你绑定一个this的。

 

this到底指向什么?

 

  

  

 

 

 

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

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

相关文章

【Java开发】设计模式 12:解释器模式

1 解释器模式介绍 解释器模式是一种行为型设计模式&#xff0c;它提供了一种方法来解释语言、表达式或符号。 在该模式中&#xff0c;定义了一个表达式接口&#xff0c;并实现了对应的表达式类&#xff0c;这些类可以解释不同的符号组成的表达式&#xff0c;从而实现对语言的…

云原生之在kubernetes环境下部署wordpress

云原生之在kubernetes环境下部署wordpress 一、wordpress介绍1.wordpress简介2.wordpress特点 二、kubernetes集群介绍1.k8s简介2.k8s架构图 三、本次实践介绍1.本次实践简介2.本次环境规划 四、环境准备工作1.检查k8s环境2.检查系统pod状态 五、创建mysql的secret资源1.创建部…

OpenCV_contrib配置教程(详细版)

文章目录 一&#xff1a;前提准备1&#xff1a;OpenCV4.5.1、OpenCV_contrib4.5.1扩展库下载2&#xff1a;Cmake下载地址Download 二&#xff1a;cmake配置1&#xff1a;2&#xff1a; 三&#xff1a;vs2017编译OpenCV build文件四&#xff1a;环境配置 个人笔记&#xff1a; …

如何构建编译gopacket包的测试用例?(gopacket抓取数据包、类似于tcpdump、Wireshark)

本篇文章介绍一下&#xff0c;如何构建gopacket测试用例 1、构建过程中遇到的问题 问题1&#xff1a; -bash: ./gopacket-main: /lib/ld-musl-x86_64.so.1: bad ELF interpreter: No such file or directory问题2&#xff1a; #14 3.150 # github.com/google/gopacket/pcap …

Zimbra 远程代码执行漏洞(CVE-2019-9670)环境搭建

漏洞简介 Zimbra是著名的开源系统&#xff0c;提供了一套开源协同办公套件包括WebMail&#xff0c;日历&#xff0c;通信录&#xff0c;Web文档管理和创作。一体化地提供了邮件收发、文件共享、协同办公、即时聊天等一系列解决方案。此漏洞的主要利用手法是通过 XXE (XML 外部…

【附代码】SSVEP解码算法 - 多变量同步指数(MSI)

1 算法来源 该算法来自电子科技大学张杨松博士,针对该算法的计算在张博士的博士论文中有详细介绍,有兴趣的读者可以下载阅读,本文重点在对该方法的代码实现。Zhang, Yangsong, et al. “Multivariate synchronization index for frequency recognition of SSVEP-based brain…

JS和CSS实现的原生轮播图

文章目录 &#x1f357; 前言&#x1f356; JSCSS实现滑动轮播图&#x1f354; 纯CSS实现滑动轮播图&#x1f37f; JSCSS实现浅入浅出轮播图&#x1f96a; JSCSS实现滑动带遮罩轮播图&#x1f9c0; JSCSS实现卡片式轮播图 &#x1f357; 前言 图片来自百度图片&#xff0c;可以…

分析解决【No module named ‘triton‘】的问题

&#xff08;一&#xff09;现象 在Windows11下训练Stable-Diffusion的LoRA模型的时候&#xff0c;总是重复提示&#xff1a; A matching Triton is not available, some optimizations will not be enabled. Error caught was: No module named ‘triton’ 意思是&#xff1a…

RocketMQ之 Consumer,消费者消费原理解析

B站 https://www.bilibili.com/video/BV1rX4y1z72v在线学习文档 https://d9bp4nr5ye.feishu.cn/wiki/wikcnjjvso9uytlgVJBfKcJh1Kq 今天我们阅读源码的目的&#xff1a;在SpringBoot项目中&#xff0c;RocketMQ是如何通过 RocketMQMessageListener 来进行消费的。 在SpringBoot…

Python数据结构-----leetcode用队列实现栈

目录 前言&#xff1a; 方法步骤 示例 Python代码实现 225. 用队列实现栈 前言&#xff1a; 上一期学习了怎么去通过两个栈来实现队列&#xff0c;同样这一期我就来讲讲怎么去通过两个队列来实现栈的功能&#xff0c;一起来学习吧。&#xff08;上一期链接Python数据结构--…

【Git基础】常用git命令(一)

文章目录 1. 创建仓库1.1 创建仓库1.2 git add和git commit① git add② git commit③ 工作区、暂存区和仓库 2. 创建git服务器2.1 服务器&#xff1a;2.2 本地2.3 修改配置信息 3. git基础原理3.1 四个区域3.2 工作流程3.3 文件的四种状态① git rm② git checkout 4.优雅的提…

setup的两个注意点

setup的两个注意点 首先&#xff0c;我们原本在v2中&#xff0c;父组件给子组件传递参数时&#xff0c;使用props来接收&#xff0c;当然除了这个方法外&#xff0c;我们还可以通过$attr来接收&#xff0c;只不过使用$atter就不能对父组件传来的参数进行类型的限定&#xff0c…

你是一个资深API接口爬虫程序员,现在需要你介绍一下如何通过商品id来获取商品数据并读取出来

获取商品数据通常需要使用API接口&#xff0c;根据接口文档中的说明传递商品id参数&#xff0c;并使用相应的请求方式&#xff08;通常为GET请求&#xff09;向API服务器发送请求即可。 以下是一个获取商品数据的示例请求&#xff1a; 首先打开API接口文档&#xff0c;找到获…

小航助学答题系统编程等级考试scratch二级真题2023年3月(含题库答题软件账号)

青少年编程等级考试scratch真题答题考试系统请点击 电子学会-全国青少年编程等级考试真题Scratch一级&#xff08;2019年3月&#xff09;在线答题_程序猿下山的博客-CSDN博客_小航答题助手 1.小猫的程序如图所示&#xff0c;积木块的颜色与球的颜色一致。点击绿旗执行程序后&a…

USB TO SPI / USB TO I2C 软件概要 7 --- 专业版调试器

所需设备&#xff1a; 1、USB 转 SPI / I2C 适配器&#xff1b; 软件概述&#xff1a; SPI类: USB TO SPI 1.0-Slave SPI从机软件&#xff0c;适合单步调试&#xff0c;支持SPI工作模式0、1、2、3&#xff0c;自动跟随主机通讯速率&#xff0c;自动接收数据&#xff1b; …

【算法宇宙——在故事中学算法】背包dp之完全背包问题

学习者不灵丝相传&#xff0c;而自杖明月相反&#xff0c;子来此事却无得失。 文章目录 前言正文小明的探险之旅&#xff08;2&#xff09;最后的优化代码 前言 尽管计算机是门严谨的学科&#xff0c;但正因为严谨&#xff0c;所以要有趣味才能看得下去。在笔者的前几篇算法类…

C#基础学习--LINQ

什么是LINQ 从对象获取数据的方法一直都是作为程序的一部分而设计的&#xff0c;然而使用LINQ可以很轻松的查询对象集合 LINQ提供程序 匿名类型 匿名类型经常用于LINQ查询的结果之中 匿名类型的对象创建表达式&#xff1a; using System; using System.Collections; using …

BiFormer:基于双层路由注意力的视觉Transformer

文章目录 摘要1、简介2、相关工作3、我们的方法:BiFormer3.1、预备知识&#xff1a;注意力3.2、双层路由注意(BRA)3.3、BRA的复杂性分析 4、实验4.1、ImageNet-1K图像分类4.2. 目标检测与实例分割4.3. 基于ADE20K的语义分割4.4、消融研究4.5、注意图可视化 5、局限性和未来工作…

C++ -3- 类和对象(中) | (三)END

文章目录 6.日期类的实现构造函数赋值运算符 “”前置、后置日期 - 日期日期类实现—代码汇总流插入流提取 7.const成员const 与 权限放大 8.取地址及const取地址操作符重载 6.日期类的实现 #pragma once #include <stdbool.h> #include <iostream> using namespa…

vue vue-json-viewer 展示 JSON 格式数据

1、下载 vue-json-viewer npm 下载 vue-json-viewer &#xff1a; // Vue2 npm install vue-json-viewer2 --save // Vue3 npm install vue-json-viewer3 --saveyarn 下载 vue-json-viewer &#xff1a; // Vue2 yarn add vue-json-viewer2 // Vue3 yarn add vue-json-view…