【VUE2-02】vue2的指令和vue2的缺点

news2025/1/19 14:40:16

文章目录

  • 一、vue条件渲染 v-if
  • 二、vue循环渲染 v-for
  • 三、vue的事件 v-on
  • 四、vue的双向绑定 v-model
  • 五、VUE2的缺点
    • 5.1 vue底层原理
      • 解决方案

在上节 【VUE2-01】vue2的起步,中写hello world!例子的时候使用了一个指令 v-bind绑定元素属性

一、vue条件渲染 v-if

v-if控制切换一个元素是否显示

<!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>条件渲染</title>
</head>

<body>
  <div id="app-3">
    <p v-if="seen">现在你看到我了</p>
  </div>
  <script src="vue.js"></script>
  <script>
    var app3 = new Vue({
      el: '#app-3',
      data: {
        seen: true
      }
    })
  </script>

</body>

</html>

注意: 可以在控制台中输入app3.seen = false可以发现文字消失了,也可以在dom节点中使用,隐藏dom节点

也可以用 v-else 添加一个“else 块”:

 <p v-if="seen">现在你看到我了</p>
 <p v-else>Oh no !<p>

注意: v-else 元素必须紧跟在带 v-if 或者 v-else-if 的元素的后面,否则它将不会被识别。

v-else-if,顾名思义,充当 v-if 的“else-if 块”,可以连续使用:

<div v-if="type === 'A'">
  A
</div>
<div v-else-if="type === 'B'">
  B
</div>
<div v-else-if="type === 'C'">
  C
</div>
<div v-else>
  Not A/B/C
</div>

注意: 类似于 v-else,v-else-if 也必须紧跟在带 v-if 或者 v-else-if 的元素之后。

v-show根据条件展示元素

v-show与v-if的不同:

v-if 是“真正”的条件渲染,因为它会确保在切换过程中条件块内的事件监听器和子组件适当地被销毁和重建。

v-if 也是惰性的:如果在初始渲染时条件为假,则什么也不做——直到条件第一次变为真时,才会开始渲染条件块。

相比之下,v-show 就简单得多——不管初始条件是什么,元素总是会被渲染,并且只是简单地基于 CSS 进行切换。

一般来说,v-if 有更高的切换开销,而 v-show 有更高的初始渲染开销。因此,如果需要非常频繁地切换,则使用 v-show 较好;如果在运行时条件很少改变,则使用 v-if 较好。

二、vue循环渲染 v-for

v-for可以绑定数组的数据来渲染一个项目列表

v-for 指令需要使用 item in items 形式的特殊语法,其中 items 是源数据数组,而 item 则是被迭代的数组元素的别名。

<!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>循环渲染</title>
</head>

<body>
  <div id="app-4">
    <ol>
      <li v-for="todo in todos">
        {{ todo.text }}
      </li>
    </ol>
  </div>
  <script src="vue.js"></script>
  <script>
    var app4 = new Vue({
      el: '#app-4',
      data: {
        todos: [
          { text: '学习 JavaScript' },
          { text: '学习 Vue' },
          { text: '整个牛项目' }
        ]
      }
    })
  </script>

</body>

</html>

注意: 尽可能的v-for和v-if不能同时使用,v-for是渲染数组或者对象的,v-for的优先级高,这会导致每循环一次就会去v-if一次,又因为v-if是通过创建和销毁来完成显示隐藏的,所以就会不停的去创建和销毁,造成页面的卡顿

三、vue的事件 v-on

v-on指令添加一个事件监听器

<!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>事件</title>
</head>

<body>
  <div id="app-5">
    <!-- 插值语法:里面的内容是要显示的内容 -->
    <p>{{ message }}</p>
    <!-- 在button中添加一个名为reverseMessage的点击事件 -->
    <button v-on:click="reverseMessage">反转消息</button>
  </div>
  <script src="vue.js"></script>
  <script>

    var app5 = new Vue({
      //el指的是绑定的vue的某一块区域,此例中是绑定的id名,要唯一
      el: '#app-5',
      data: {
        message: 'Hello Vue.js!'
      },
      // 新的对象methods对象中的内容是各种方法
      methods: {
        reverseMessage: function () {
          this.message = this.message.split('').reverse().join('')
        }
      }
    })
  </script>

</body>

</html>

注意: vue的优势在此处可以显示出来,reverseMessage 方法中,我们更新了应用的状态,但没有触碰 DOM——所有的 DOM 操作都由 Vue 来处理,你编写的代码只需要关注逻辑层面即可。

四、vue的双向绑定 v-model

v-model实现表单输入和应用状态之间的双向绑定

v-model 指令在表单 、 及 元素上创建双向数据绑定。它会根据控件类型自动选取正确的方法来更新元素。尽管有些神奇,但 v-model 本质上不过是语法糖。它负责监听用户的输入事件以更新数据,并对一些极端场景进行一些特殊处理。

v-model 在内部为不同的输入元素使用不同的 property 并抛出不同的事件:
text 和 textarea 元素使用 value property 和 input 事件;
checkbox 和 radio 使用 checked property 和 change 事件;
select 字段将 value 作为 prop 并将 change 作为事件。

<!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>双向绑定</title>
</head>

<body>
  <div id="app-6">
    <p>{{ message }}</p>
    <input v-model="message">
  </div>
  <script src="vue.js"></script>
  <script>

    var app6 = new Vue({
      el: '#app-6',
      data: {
        message: 'Hello Vue!'
      }
    })
  </script>

</body>

</html>

修饰符:
.lazy 类似于change事件,当焦点发生改变的时候才会触发
.number 将输入的字符转为有效数字,不加则是字符串类型
.trim 过滤首尾空格

注意: 此处的写入输入框的内容,并不能实际改变message中的内容,也就是不能触碰到vue的数据,此处也是vue2的一大缺点,面试题中会经常问道,原本笔者想重新开一节讲述这个缺点,但是在此遇上了,便简述一下,后续可能会开启一个更详细讲述该经过的章节

五、VUE2的缺点

5.1 vue底层原理

当把一个普通的JavaScript对象传入Vue实例作为data选项,Vue将遍历对象所有的property,并使用Object.defineProperty把这些property全部转为getter/setter方法
getter/setter 对用户来说是不可见的,但是在内部它们让 Vue 能够追踪依赖,在 property 被访问和修改时通知变更。这里需要注意的是不同浏览器在控制台打印数据对象时对 getter/setter 的格式化并不同,所以建议安装 vue-devtools 来获取对检查数据更加友好的用户界面。goole
在这里插入图片描述
此处可以写个demo来实现数据劫持,通过vue开发者工具可以看到劫持的数据内容以及原始数据是否修改

<!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>Vue2的缺点</title>
  <script src="./vue.js"></script>
</head>

<body>
  <div id="app">
    <div v-for="val in obj">{{val}}</div>
    <!-- <div v-for="val in arr">{{val}}</div> -->
    <button @click="handle">添加一个属性</button>
  </div>
  <script>
    //通过手动修改的(get\set方法进行修改),不能动态添加,不会自动刷新,检测到页面有内容刷新的时候才会刷新
    var vm = new Vue({
      el: "#app",
      data: {
        obj: {
          name: "你好",
          age: "23"
        },
        arr: [11, 22, 33, 44, 55]
      },
      methods: {
        handle () {
          this.obj.id = "123321";
          this.obj.name = "更改的name值";
          // console.log(this.obj);


         
        }

      }
    })
    // 数据劫持
    let perser = {
      name: "张三",
      age: 22
    }
    let p = {};
    //底层会加两个object,为name和age值,检测到name改变之后才会重新在加载一下,数据劫持,修改原有的属性才会更新视图
    Object.defineProperty(p, "name", {
      get () {
        console.log("name被查询了");
        return perser.name;
      },
      set (val) {
        console.log("name被修改了");
        perser.name = val;
      }
    });
  </script>


</body>

</html>

 

在这里插入图片描述

在控制台打印p对象中的某个属性值的时候,会出现数据劫持的情况,其中get方法是数据被查询时触发的方法,set方法是数据被修改触发的方法,但是此时数据修改并没有动态添加,不会自动刷新,也就是初始的值并没有被修改

解决方案

因为vue2通过使用Object.defineProperty()方法,所以存在下列问题,对象新增属性时,删除属性时,界面不会更新,直接通过下标修改数组界面不会自动更新
解决方式:
1.$set
2.数组使用内置的方法

$ set的三个参数

this.$set(要改变的数组或者对象,下标或者键名,要添加的数据)

数组的内置方法详情请看【JavaScirpt-06】数组的内置方法(重点!)

综上: 所有的指令有v-model、v-for、v-if、v-show、v-on、v-bind

另还有v-html和v-text,类似于innerHTML和innerText;
v-once:定义它的标签或者组件,只会初始化渲染一次包含子节点,首次渲染后,不会再随着数据的改变而改变,变成静态内容
v-once所在节点在初次动态渲染后,就视为静态内容了
以后数据的改变不会引起v-once所在的解构的更新,可以用于优化性能

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

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

相关文章

米筐量化终端是什么?

米筐量化终端大家应该也能想象到是应用的终端&#xff0c;是系统执行的终端环节&#xff0c;如果是用在量化方面&#xff0c;那它就是策略定制的终端&#xff0c;是方便投资者输入量化策略执行出来发最终优质目的&#xff0c;精确到细分股票的账户成交量&#xff0c;股价以及融…

java8 第七章-----多线程

7.1、线程基本知识 进程与线程&#xff1a; 进程&#xff08;Process&#xff09;是系统进行资源分配和调度的基本单位&#xff0c;是操作系统结构的基础。在早期面向进程设计的计算机结构中&#xff0c;进程是程序的基本执行实体&#xff1b;在当代面向线程设计的计算机结构…

cobaltstrike的安装与基础使用

数据来源 本文仅用于信息安全学习&#xff0c;请遵守相关法律法规&#xff0c;严禁用于非法途径。若观众因此作出任何危害网络安全的行为&#xff0c;后果自负&#xff0c;与本人无关。 Cobalt Strike是什么? Cobalt Strike&#xff08;简称CS&#xff09;是一款团队作战渗…

Python学习笔记——列表

Python列表函数&方法函数&#xff1a;len(list)&#xff1a;列表元素个数max(list)&#xff1a;返回列表元素最大值min(list)&#xff1a;返回列表元素最小值list(seq)&#xff1a;将元组转换为列表方法list.append(obj)&#xff1a;在列表末尾添加新的对象list.count(obj)…

字典树总结

字典树 一、概念 字典树 (Trie) 是一种用于实现字符串快速存储和检索的多叉树结构&#xff1b; Trie 的每个节点都拥有若干个字符指针&#xff0c;若在插入或检索字符串时扫描到一个字符 ccc &#xff0c;就沿着当前节点的 ccc 字符指针&#xff0c;走向该指针指向的节&…

支持向量机(SVM)入门(六,解决遗留问题)

但也出现了如下结果&#xff0c;看来任务没完没了&#xff08;svm深似海&#xff1f;&#xff09;&#xff0c;还得下功夫&#xff1a;前面我们的支持向量机到此便止步了&#xff0c;一晃两年&#xff0c;这几天有空&#xff0c;顺便研究了一下&#xff0c;问题有进展&#xff…

基于yolov5-v7.0开发构建汽车车损实例分割检测识别分析系统

在之前的文章中我们已经做了很多基于yolov5完成实例分割的项目&#xff0c;感兴趣的话可以自行移步阅读&#xff1a;《基于YOLOv5-v7.0的药片污染、缺损裂痕实例分割检测识别分析系统》《基于yolov5-v7.0开发构建裸土实例分割检测识别模型》《基于yolov5-v7.0开发实践实例分割模…

NSThead的进阶使用和简单探讨

概述 NSThread类是一个继承于NSObjct类的轻量级类。一个NSThread对象就代表一个线程。它需要管理线程的生命周期、同步、加锁等问题&#xff0c;因此会产生一定的性能开销。 使用NSThread类可以在特定的线程中被调用某个OC方法。当需要执行一个冗长的任务&#xff0c;并且不想…

文件minio进阶 分页查询

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录前言一、minio使用二、代码1.mino版本是最新的,那么pom中也要最新的2. 部分代码总结前言 就是现在通过minio管理文件,然后不需要其他信息,所以我也就没有用传统方式…

探究视频标注如何支持自动驾驶汽车

自动驾驶汽车技术有望使我们的道路更安全&#xff0c;同时提高运输和交付服务的效率。安全性和可靠性是自动驾驶汽车广泛采用所必需的关键因素。为了保证汽车在现实复杂的交通条件下导航能够有效运行&#xff0c;必须使用标注数据来训练基于计算机视觉的模型&#xff0c;这些数…

verilog学习笔记- 10)按键控制 LED 灯实验

目录 简介&#xff1a; 实验任务&#xff1a; 硬件设计&#xff1a; 程序设计&#xff1a; 下载验证 &#xff1a; 总结与反思&#xff1a; 简介&#xff1a; 按键开关是一种电子开关&#xff0c;属于电子元器件类。我们的开发板上有两种按键开关&#xff1a;第一种是本实…

NeRF制作数据集最后的踩坑

之前对数据集渲染的时候一直出现模糊的问题&#xff1a; 学长说可能是摄像机和poses没有对应。但是为什么会这样呢 后来我发现&#xff0c;确实在制作的过程中&#xff0c;某一步出了问题&#xff0c;导致下标的数字&#xff0c;跟理想的不一样&#xff1a; 原来的12&#xf…

基于yolov5-v7.0开发构建工业机械齿轮瑕疵实例分割检测识别分析系统

在之前的文章中我们已经做了很多基于yolov5完成实例分割的项目&#xff0c;感兴趣的话可以自行移步阅读&#xff1a;《基于YOLOv5-v7.0的药片污染、缺损裂痕实例分割检测识别分析系统》《基于yolov5-v7.0开发构建裸土实例分割检测识别模型》《基于yolov5-v7.0开发实践实例分割模…

深度学习PyTorch 之 DNN-回归(多变量)

深度学习&PyTorch 之 DNN-回归中使用HR数据集进行了实现&#xff0c;但是HR数据集中只有一个变量&#xff0c;这里我们使用多变量在进行模拟一下 流程还是跟前面一样 #mermaid-svg-LN8ayy7UjtqZ6dSj {font-family:"trebuchet ms",verdana,arial,sans-serif;font…

计算机原理三_进程管理

目录儿四、进程管理4.1 什么是进程4.1.1 进程的结构4.1.2 进程的特征4.1.3 进程与线程4.1.4 线程的实现方式用户级线程内核支持线程组合线程的调度4.2 进程是怎么运行的4.2.1 进程状态4.2.2 进程控制4.2.2.1 原语的概念4.2.2.2 挂起与激活4.2.3 进程调度4.2.3.1 调度层次4.2.3.…

CSS入门一、初识

零、文章目录 文章地址 个人博客-CSDN地址&#xff1a;https://blog.csdn.net/liyou123456789个人博客-GiteePages&#xff1a;https://bluecusliyou.gitee.io/techlearn 代码仓库地址 Gitee&#xff1a;https://gitee.com/bluecusliyou/TechLearnGithub&#xff1a;https:…

【BP靶场portswigger-服务端9】服务端请求伪造SSRF漏洞-7个实验(全)

前言&#xff1a; 介绍&#xff1a; 博主&#xff1a;网络安全领域狂热爱好者&#xff08;承诺在CSDN永久无偿分享文章&#xff09;。 殊荣&#xff1a;CSDN网络安全领域优质创作者&#xff0c;2022年双十一业务安全保卫战-某厂第一名&#xff0c;某厂特邀数字业务安全研究员&…

Episode 02 对称密码基础

一、从文字密码到比特序列密码 1、使用对称密钥进行加密 为了使原来的明文无法被推测出来&#xff0c;就要尽可能地打乱密文&#xff0c;这样才能达到加密的目的。密文打乱的是比特序列&#xff0c;无论是文本&#xff0c;图片还是音乐&#xff0c;只要能够将数据转换比特序列…

MSF后渗透持续后门

持续后门 ○ 利用漏洞取得的meterpreter shell运行于内存中&#xff0c;重启失效 ○ 重复exploit漏洞可能造成服务崩溃 ○ 持久后门保证漏洞修复后仍可远程控制 Meterpreter后门 run metsvc -A #删除-r use exploit/multi/handler set PAYLOAD windows/metsvc_bind_tcp se…

[22]. 括号生成

[22]. 括号生成题目算法设计&#xff1a;回溯算法设计&#xff1a;空间换时间题目 传送门&#xff1a;https://leetcode.cn/problems/generate-parentheses/ 算法设计&#xff1a;回溯 括号问题可以分成俩类&#xff1a; 括号的合法性判断&#xff0c;主要是用栈括号的合法生…