Vue(事件处理、计算属性、监视属性)

news2024/9/21 23:28:30

一、事件处理

 1. 语法

Vue模板

  • v-on:xxx="处理函数"

  • @xxx(作为绑定事件的简写)="处理函数"

  • xxx指代的都是事件名

Vue实例

  • 必须使用methods配置对象(配置多个函数方法)

  • methods中配置函数,都是Vue所管理,this的指向是vm或组件实例对象

  • 不能使用箭头函数,否则this指向不是vm

  • 注意事件处理函数可以分为带参和不带参数,带参如果是事件对象就用“,$”分割

    • @click="demo"

    • @click="demo($event)

 <div id="root">
      <h2>欢迎来到{{name}}</h2>
      <!-- 简写:v-on: 相当于@ -->
      <button @click="showInfo1">点我提示信息</button>
      <!-- ,隔开可以使用$获取事件对象 -->
      <button @click="showInfo2(66,$event)">点我提示信息</button>
    </div>
  </body>
  <script>
    Vue.config.production = false;
    /*
    注意绑定事件的执行函数不能直接在script标签内声名(报错)
    function showInfo() {
      alert("你好");
    } */
    const vm = new Vue({
      el: "#root",
      data: {
        name: "云贵川",
      },
      methods: {
        showInfo1() {
          alert("你好");
          //   console.log(a, b, c, d);
          //   console.log(this === vm); //普通函数此处的this指向的是vm
        },
        // 如果使用箭头函数this会指向window
        /*  showInfo: (e) => {
          console.log(this);
        }, */
        showInfo2(number, event) {
          console.log(number, event);
          alert("同学!!");
        },
      },
    });
  </script>

2. 事件修饰符

  • prevent:阻止默认事件

  • stop:阻止事件冒泡

  • once:事件只触发一次(常用)

  • capture:使用事件的捕获模式

  • self:只有event.target是当前操作元素时才触发事件

  • passive:事件的默认行为立即执行(比如滚轮执行无需等待回调执行就会执行事件),无需等待事件回调执行完毕

  • 修饰符可以连续写

 <div id="root">

      <!-- 阻止默认事件 -->
      <a href="http://www.baidu.com" @click.prevent="showInfo">点击提示</a>

      <!-- 阻止事件冒泡:使用在内层事件-->
      <div class="demo1" @click="showInfo">
        <button @click.stop="showInfo">点击提示</button>
        <a href="http://www.baidu.com" @click.stop.prevent="showInfo">点击提示</a>
      </div>

      <!-- 事件只触发一次 -->
      <button @click.once="showInfo">点击提示</button>

      <!-- 使用事件的捕获模式:使用在外层事件 -->
      <div class="box1" @click.capture="showMsg(1)">
        div1
        <div class="box2" @click="showMsg(2)">div2</div>
      </div>

      <!-- 只有event.target是当前操作元素时才触发事件 -->
      <div class="demo1" @click.self="showInfo">
        <button @click="showInfo">点击提示</button>
      </div>

      <!-- 事件的默认行为立即执行:优先使用滚动(移动端使用) -->
      <!-- scroll:(滚动条)滚动到最后位置就会停止 -->
      <!-- wheel:(滚轮)鼠标滚动轮滚动:会一直触发 -->
      <ul @wheel.passive="demo" class="list">
        <li>1</li>
        <li>2</li>
        <li>3</li>
        <li>4</li>
      </ul>
    </div>
<script>
    Vue.config.production = false;
    const vm = new Vue({
      el: "#root",
      data: {
        name: "xue",
      },
      methods: {
        showInfo(e) {
          alert("同学你好");
          //   e.stopPropagation(); //阻止事件冒泡
          console.log(e.target);
        },
        showMsg(msg) {
          console.log(msg);
        },
        demo() {
          for (let i = 0; i < 10000; i++) {
            console.log("#");
          }
          console.log("运行结束");
        },
      },
    });
  </script>

 3. 键盘事件(按下键盘或者键盘弹起执行事件)

  • 回车: => enter

  • 删除: => delete (捕获“删除”和“退格键”)

  • 退出: => esc

  • 空格: => space

  • 换行: => tab  (注意使用keydown事件进行配合)

  • 上: => up

  • 下: => down

  • 左: => left

  • 右: => right

  • Vue未提供别名的按键,可以使用按键原始的key值去绑定,但注意要为kebab-case(横线拼接小写英文命名)

<input type="text" placeholder="按下回车提示输入" @keyup.caps-lock="showInfo" />
系统修饰键:ctrl 、 alt、shift、meta(通过链式指定配合按键)
            (1)配合keyup使用,按下修饰键的同时,再按下(任意)其他键,最后释放其他键,事件才被触发(不太好:键盘事件弹起就会执行修饰键工作)
            (2)配合keydown使用,正常触发事件(简便)
<input type="text" placeholder="按下回车提示输入" @keyup.ctrl="showInfo" />
<input type="text" placeholder="按下回车提示输入" @keydown.ctrl="showInfo" />
  • (NO)也可以使用keyCode指定具体的按键值(不推荐键码)

<input type="text" placeholder="按下回车提示输入" @keydown.13="showInfo" />
  • (NO)Vue.config.keyCodes.自定义键名 = 键码,可以定制按键别名

<input type="text" placeholder="按下回车提示输入" @keydown.13="showInfo" />

<!--以下是在vue中自定义键名-->
Vue.config.keyCodes.huiche = 13; //自定义按键别名

二、计算属性

输入并实现插值语法拼接效果

 1.使用插值语法进行拼接:优势:缓存优势

 <body>
    <div id="root">
      姓:<input type="text" v-model="firstName" />
      <br />
      名:<input type="text" v-model="lastName" />
      <br />
      <!-- 截取指定位置的字符串拼接 -->
      全名:<span>{{firstName.slice(0,3)}}-{{lastName}}</span>
    </div>
  </body>
  <script>
    Vue.config.production = false;
    const vm = new Vue({
      el: "#root",
      data: {
        firstName: "张",
        lastName: "三",
      },
    });
  </script>

 2. 使用methods实现拼接(插值语法调用方法需要带()

 <div id="root">
      姓:<input type="text" v-model="firstName" />
      <br />
      名:<input type="text" v-model="lastName" />
      <br />
      <!-- 插值语法中使用方法必须使用() -->
      全名:<span>{{fullName()}}</span> <br />
       <!--调用多少次methods就会执行多少次:没有缓存-->
      全名:<span>{{fullName()}}</span> <br />
      全名:<span>{{fullName()}}</span> <br />
      全名:<span>{{fullName()}}</span>
  </div>
 
<script>
    Vue.config.production = false;
    const vm = new Vue({
      el: "#root",
      data: {
        firstName: "张",
        lastName: "三",
      },
      methods: {
        fullName() {
          // 以下输出语句证明:data数据修改之后函数重新调用(说明模板重新解析)
          console.log("@-------------------");
          return this.firstName + "-" + this.lastName;
        },
      },
    });
  </script>

3. 计算属性实现拼接:cumputed注意要有返回值

  • 底部规则使用的还是definedefineproperty中的getter

  • 优势:计算属性中的方法的依赖数据有缓存属性,在执行多次输出相同结果调用时候只需要执行一次计算

    <div id="root">
      姓:<input type="text" v-model="firstName" />
      <br />
      名:<input type="text" v-model="lastName" />
      全名:<span>{{fullName}}</span><br />
    </div>
 computed: {
        // 具有缓存属性,当出现模板中相同代码片段时候直接从缓存处读取
        fullName: {
          // get作用:当有人读取fullName,get就会被调用,并且返回值就是fullName的值
          // get什么时候调用
          /* 
          1. 初次读取fullName时候调用
          2. 所依赖的数据发生变化
          */
          //  ----------------------
          // 注意以下的get和set不可以使用箭头函数,this的指向变成window
          get() {
            // console.log(this);//此处的this指向vm
            console.log("get调用");
            return this.firstName + "-" + this.lastName + a;
          },
          // 如果计算属性会被修改就必须存在setter
          //当fullName被修改时候会被调用
          set(value) {
            console.log("set", value);
            // 字符产转为数组
            const arr = value.split("-");
            this.firstName = arr[0];
            this.lastName = arr[1];
          },
        },
      },

 

 定义:要用的属性不存在,要通过已有的属性计算得来

  • 原理:底层借用了Object.defineproperty方法提供的getter和setter

  • get函数什么时候执行

            (1)初次读取会执行一次

            (2)当数据发生变化时候会被再次调用

  • 优势:与methods实现相比,内部有缓存机制(可复用),效率高,调用方便

  • 备注:

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

          2. 如果计算属性要被修改,必须写set函数相应修改,并且set中要应用引起计算时依赖的数据发生改变

如果计算属性确定只读不改:那么久只编译getter

 全名:<span>{{fullName}}</span>

//
computed: {
  // 简写:没有set  只读不取
  // 将原先的函数简写以下格式
  // 此处将函数放在vm实例中
  fullName() {
    console.log("get调用");
    return this.firstName + "-" + this.lastName;
  },
},

三、监视属性

实现效果

 1. 利用计算属性进行:三元表达式利用方法切换布尔值

  <div id="root">
      <h2>今天天气很{{info}}</h2>
      <button @click="changeWeather">切换</button>
    </div>
  </body>
  <script>
    Vue.config.production = false;
    const vm = new Vue({
      el: "#root",
      data: {
        isHot: true,
      },
      // 方法执行取反布尔值
      methods: {
        changeWeather() {
          this.isHot = !this.isHot;
        },
      },
      // 利用三元表达式进行计算并返回结果,也可以将计算表达式直接写入插值语法
      computed: {
        info() {
          return this.isHot ? "炎热" : "凉爽";
        },
      },
    });
  </script>

 2.理解:监视属性

watch:{

监视属性:{

innediate:true(默认false):初始化就调用一次

监视回调函数

}

}

  <div id="root">
      <h2>今天的天气很{{info}}</h2>
      <button @click="changeWeather">切换天气</button>
    </div>
    watch: {
        isHot: {
          immediate: true, //默认fasle,设置为true会初始化时候调用handler
          // 注意之前没有值就是undefined
          // handler什么时候调用?当isHot发生变化时候调用
          handler(newVlaue, oldValue) {
            console.log("inHot被修改了", newVlaue, oldValue);
          },
        },
      },
//在Vue实例之外配置watch属性
vm.$watch("isHot", {
  immediate: true,
  handler(newVlaue, oldValue) {
    console.log("inHot被修改了", newVlaue, oldValue);
  },
});

 简写监视属性:在没有immedit属性的时候才可以使用

  // 简写:绝不允许使用箭头函数(改变了this指向)
    vm.$watch("isHot", function (newVlaue, oldValue) {
      console.log("inHot被修改了", newVlaue, oldValue);
    });

 

3. 深度监视:监测到data对象中更深层对象的数据

deep:true : 监测深层

"numbers.a" :监测指定深层某个数据

<div id="root">
      <h2>今天的天气很{{info}}</h2>
      <button @click="changeWeather">切换天气</button>
      <hr />
      <h3>a的值是{{numbers.a}}</h3>
      <button @click="numbers.a++">点击让我+1</button>
      <h3>b的值是{{numbers.b}}</h3>
      <button @click="numbers.b++">点击让我+1</button>
      <!-- 此处使用新的对象:就更改了原先的地址值 -->
      <button @click="numbers = {a:666,b:888}">彻底替换number</button>
    </div>
 <script>
    Vue.config.production = false;
    const vm = new Vue({
      el: "#root",
      data: {
        isHot: true,
        numbers: {
          a: 1,
          b: 1,
        },
      },
      computed: {
        info() {
          return this.isHot ? "炎热" : "寒冷";
        },
      },
      methods: {
        changeWeather() {
          this.isHot = !this.isHot;
        },
      },
      watch: {
        isHot: {
          handler(newVlaue, oldValue) {
            console.log("inHot被修改了", newVlaue, oldValue);
          },
        },

        // 以下是多级结构进行监视
        // 注意存在多个属性:所有的属性都添加到下main(太麻烦)
        "numbers.a": {
          handler() {
            console.log("a发生改变");
          },
        },
        "numbers.b": {
          handler() {
            console.log("b发生改变");
          },
        }, 
        // 此处检测的是整个对象(一个地址):但是添加deep属性就不一样了
        numbers: {
          deep: true,
          handler() {
            console.log("numbers改变了");
          },
        },
      },
    });
  </script>

4. 对比计算属性和监视属性

  • computed能完成的功能watch都可以完成

  • watch能完成的功能(主要优势异步任务),computed不一定能完成

  • 注意:

    • 所有被Vue管理的函数,最好写成普通函数,这样this的指向才是vm或者组件实例对象。

    • 所有不被Vue管理的函数(定时器回调函数,ajax回调函数,promise的回调函数),最好写成箭头函数,这样this的指向才是vm或组件实例对象

<div id="root">
      姓:<input type="text" v-model="firstName" />
      <br />
      名:<input type="text" v-model="lastName" />
      <br />
      全名:<span>{{fullName}}</span>
    </div>
  </body>
  <script>
    Vue.config.production = false;
    const vm = new Vue({
      el: "#root",
      data: {
        firstName: "张",
        lastName: "三",
        fullName: "张-三",
      },

      // 监视属性:拼接字符
      // 既需要监视姓也需要监视名(繁琐)
      // 优势:可以开启异步任务(计算属性不可以添加异步任务)
      // 注意:添加定时器时候回调函数应该是箭头函数:普通函数this指向window,箭头函数会向上找this,指向的是vm
      watch: {
        firstName(val) {
          setTimeout(() => {
            console.log(this);
            this.fullName = val + "-" + this.lastName;
          }, 1000);
        },
        lastName(val) {
          this.fullName = this.lastName + "-" + val;
        },
      },
    });
  </script>

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

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

相关文章

哈希表题目:网格照明

文章目录 题目标题和出处难度题目描述要求示例数据范围 解法思路和算法代码复杂度分析 题目 标题和出处 标题&#xff1a;网格照明 出处&#xff1a;1001. 网格照明 难度 6 级 题目描述 要求 在 n n \texttt{n} \times \texttt{n} nn 的二维网格 grid \texttt{grid}…

【C++技能树】原来比C方便这么多 --引用、内联函数、Auto、NULL与nullptr

Halo&#xff0c;这里是Ppeua。平时主要更新C语言&#xff0c;C&#xff0c;数据结构算法......感兴趣就关注我吧&#xff01;你定不会失望。 &#x1f308;个人主页&#xff1a;主页链接 &#x1f308;算法专栏&#xff1a;专栏链接 我会一直往里填充内容哒&#xff01; &…

【软考备战·希赛网每日一练】2023年4月24日

文章目录 一、今日成绩二、错题总结第一题第二题第三题第四题第五题 三、知识查缺 题目及解析来源&#xff1a;2023年04月24日软件设计师每日一练 一、今日成绩 二、错题总结 第一题 解析&#xff1a; 第二题 解析&#xff1a; DPI表示每英寸像素点的个数。 300DPI表示每英寸…

ESP32学习六-构建系统

一、简介 如果想要新建一个ESP32项目&#xff0c;需要包含很多其他的文件夹和文件&#xff0c;如果对ESP32的勾线系统原理不理解&#xff0c;就会产生出很多编译不通过的问题。这里就对ESP-IDF构建系统的实现原理做一个简单的总结。 测试环境&#xff1a;Ubuntu18.4 ESP-IDF&am…

Observability:添加免费和开放的 Elastic APM 作为 Elastic 可观察性部署的一部分 - 8.x

作者&#xff1a;David Hope 在最近的一篇博文中&#xff0c;我们向你展示了如何开始使用 Elastic 可观察性的免费开放层。 下面&#xff0c;我们将介绍你需要做些什么来扩展你的部署&#xff0c;这样你就可以开始免费从应用程序性能监控&#xff08;APM&#xff09;或跟踪集群…

我国直播电商行业市场增速下降 核心竞争力发生转变 新一轮洗牌变革步伐将加快

1、直播电商概念及其产业链图解 直播电商是属于网络直播的一个分支&#xff0c;属于一种泛娱乐类直播&#xff0c;电商店铺的店家或模特主播在直播间通过借助视频录制工具&#xff0c;将店铺所售的商品展示给用户&#xff0c;并为用户答疑解惑&#xff0c;提供实时的客服服务&…

【JavaEE初阶】多线程(二)线程状态以及多线程安全问题

摄影分享~~ 文章目录 线程的状态多线程带来的风险线程安全线程安全的原因解决线程不安全问题&#xff08;加锁&#xff09;synchronized关键字-监视器锁monitor locksynchronized的特性 java中的死锁问题死锁死锁的三个典型情况死锁的四个必要条件如何避免死锁&#xff1f; J…

家用洗地机怎么选?2023高性价比家用洗地机推荐

相信大家和我一样是妥妥的“懒人一族”了&#xff0c;不喜欢做家务、不喜欢碰脏水、不喜欢花费过多的时间在家务上&#xff0c;但是却想有一个整洁干净的家居环境。而作为家务清洁中面积最大、耗时耗力最多的就是扫地拖地了。传统的地面清洁方式&#xff0c;要先用扫把扫一遍&a…

Git上传本地代码到Github

参考 https://zhuanlan.zhihu.com/p/138305054 文章目录 上传本地代码到github仓库&#xff08;1&#xff09;创建一个空文件夹&#xff0c;在该文件夹下右键&#xff0c;Git bash here&#xff08;2&#xff09;初始化仓库&#xff08;3&#xff09; 建立本地与github上项目的…

ChatGPT 速通手册——让 ChatGPT 来写正则表达式

regex 生成 正则表达式可谓是一门让广大程序员们又爱又恨的技术。它易学难精&#xff0c;而且可维护性又差&#xff0c;别说交接给其他同事&#xff0c;同一个人写的正则表达式&#xff0c;三个月后回头再看&#xff0c;也可能完全不知所云。 因此&#xff0c;让 ChatGPT 来写…

【计网 从头自己构建协议】一、libpcap 介绍 手撕以太网帧

上一篇&#xff1a;IndexError: list index out of range 下一篇&#xff1a;[【计网 从头自己构建协议】二、收发 ARP 请求帧与响应帧] 介绍 理论的学习总是枯燥的&#xff0c;想要加深对理论的理解&#xff0c;最好的方法就是自己实践一遍。 想要亲手实现各种协议&#xf…

通讯方式连接成功,其他原因导致的连接失败解决方案

一、电脑中有其他品牌visa导致的冲突&#xff08;以tekvisa为例&#xff09; 1、删除tekvisa 2、下载一个NI Package Manager&#xff0c;卸载里面所有NI的东西 &#xff08;https://www.ni.com/zh-cn/support/downloads/software-products/download.package-manager.html#32…

❀五一劳动节来啦❀

今年“五一”&#xff0c;4月29日至5月3日放假调休&#xff0c;共5天。 如果你在5月4日到5月6日请假3天&#xff0c;加上5月7日周日&#xff0c;就可以形成9天的假期。 一&#xff0c;五一劳动节的由来⭐ 国际劳动节又称“五一国际劳动节”“国际示威游行日”&#xff08;英语…

人生中最好的等待叫做来日可期,社科院与杜兰大学金融管理硕士等你惊艳岁月

有句话说&#xff1a;“去日不可追&#xff0c;来日犹可期”。过去的已经过去&#xff0c;不管好的、坏的都已成为我们的回忆。人生中最好的等待就是未来可期。别辜负现在的好时光&#xff0c;努力做想做的事。社科院与杜兰大学金融管理硕士项目等你惊艳时光。 所有出众者的背…

【计算机网络:自顶向下方法】(三) 运输层 (TCP | UDP | 复用 | 传输原理rdt)

【计算机网络&#xff1a;自顶向下方法】 3.1 概述 传输层协议是在端系统中实现的传输层将发送的应用程序进程接受到的报文转换成传输层分组 (运输层报文段)实现的方法/过程 &#xff1a; 将应用报文划分为较小的块&#xff0c;并为每块加上传输层首部以生成传输层报文段ff。I…

【C++】类和对象(中篇)—— 默认成员函数,const成员函数,运算符重载

前言 类和对象没有技巧&#xff0c;只有多加练习&#xff0c;多多尝试自己完成代码&#xff0c;例如各种运算符的重载&#xff0c;或是实现一个自己的日期类 目录 一、类的六个默认成员函数 二、构造函数 2.1 概念 2.2 特点 2.3 默认无参的构造函数 三、析构函数 3.1 概…

ORB305与CISCO路由器构建L2TP over IPSec VPN操作手册

1、网络拓扑在思科路由器与ORB305之间建立一个安全隧道&#xff0c;对客户路由器端设备子网&#xff0c;与思科路由器端服务器子网之间的数据流进行安全保护&#xff0c;组网拓扑图如图所示。 2、思科路由器端配置指导(此处以多数客户使用专线上网形式为例)Cisco&#xff08;AR…

90年三本程序员,8年5跳,年薪4万变92万……

很多时候&#xff0c;虽然跳槽可能带来降薪的结果&#xff0c;但依然有很多人认为跳槽可以涨薪。近日&#xff0c;看到一则帖子。 发帖的楼主表示&#xff0c;自己8年5跳&#xff0c;年薪4万到92万&#xff0c;现在环沪上海各一套房&#xff0c;再干5年码农&#xff0c;就可以…

2022年NOC大赛创客智慧编程赛道图形化scratch初赛题,包含答案解析

目录 一、单选题 二、多选题 三、判断题 下载打印文档做题: 一、单选题

项目干系人是什么?如何有效管理项目干系人?

项目干系人是指对项目具有利益关系或影响力的个人、团体或组织。他们可能会对项目的目标、范围、进度、成本、质量等方面产生影响&#xff0c;因此&#xff0c;有效地管理项目干系人是项目管理成功的关键之一。 一、干系人识别和分类 项目经理应该首先识别和分类所有与项目有关…