热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

【VUE202】vue2的指令和vue2的缺点

文章目录一、vue条件渲染v-if二、vue循环渲染v-for三、vue的事件v-on四、vue的双向绑定v-model五、VUE2的缺点5.1vue底层原理解决方案在上节【VU


文章目录


  • 一、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&#61;"en">
<head>
<meta charset&#61;"UTF-8">
<meta http-equiv&#61;"X-UA-Compatible" content&#61;"IE&#61;edge">
<meta name&#61;"viewport" content&#61;"width&#61;device-width, initial-scale&#61;1.0">
<title>条件渲染title>
head>
<body>
<div id&#61;"app-3">
<p v-if&#61;"seen">现在你看到我了p>
div>
<script src&#61;"vue.js">script>
<script>
var app3 &#61; new Vue({
el: &#39;#app-3&#39;,
data: {
seen: true
}
})
script>
body>
html>

注意&#xff1a; 可以在控制台中输入app3.seen &#61; false可以发现文字消失了&#xff0c;也可以在dom节点中使用&#xff0c;隐藏dom节点

也可以用 v-else 添加一个“else 块”&#xff1a;

<p v-if&#61;"seen">现在你看到我了p>
<p v-else>Oh no !<p>

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

v-else-if&#xff0c;顾名思义&#xff0c;充当 v-if 的“else-if 块”&#xff0c;可以连续使用&#xff1a;

<div v-if&#61;"type &#61;&#61;&#61; &#39;A&#39;">
A
div>
<div v-else-if&#61;"type &#61;&#61;&#61; &#39;B&#39;">
B
div>
<div v-else-if&#61;"type &#61;&#61;&#61; &#39;C&#39;">
C
div>
<div v-else>
Not A/B/C
div>

注意&#xff1a; 类似于 v-else&#xff0c;v-else-if 也必须紧跟在带 v-if 或者 v-else-if 的元素之后。

v-show根据条件展示元素

v-show与v-if的不同&#xff1a;



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




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




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




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



二、vue循环渲染 v-for

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

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

DOCTYPE html>
<html lang&#61;"en">
<head>
<meta charset&#61;"UTF-8">
<meta http-equiv&#61;"X-UA-Compatible" content&#61;"IE&#61;edge">
<meta name&#61;"viewport" content&#61;"width&#61;device-width, initial-scale&#61;1.0">
<title>循环渲染title>
head>
<body>
<div id&#61;"app-4">
<ol>
<li v-for&#61;"todo in todos">
{{ todo.text }}
li>
ol>
div>
<script src&#61;"vue.js">script>
<script>
var app4 &#61; new Vue({
el: &#39;#app-4&#39;,
data: {
todos: [
{ text: &#39;学习 Javascript&#39; },
{ text: &#39;学习 Vue&#39; },
{ text: &#39;整个牛项目&#39; }
]
}
})
script>
body>
html>

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


三、vue的事件 v-on

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

DOCTYPE html>
<html lang&#61;"en">
<head>
<meta charset&#61;"UTF-8">
<meta http-equiv&#61;"X-UA-Compatible" content&#61;"IE&#61;edge">
<meta name&#61;"viewport" content&#61;"width&#61;device-width, initial-scale&#61;1.0">
<title>事件title>
head>
<body>
<div id&#61;"app-5">

<p>{{ message }}p>

<button v-on:click&#61;"reverseMessage">反转消息button>
div>
<script src&#61;"vue.js">script>
<script>
var app5 &#61; new Vue({
//el指的是绑定的vue的某一块区域&#xff0c;此例中是绑定的id名&#xff0c;要唯一
el: &#39;#app-5&#39;,
data: {
message: &#39;Hello Vue.js!&#39;
},
// 新的对象methods对象中的内容是各种方法
methods: {
reverseMessage: function () {
this.message &#61; this.message.split(&#39;&#39;).reverse().join(&#39;&#39;)
}
}
})
script>
body>
html>

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


四、vue的双向绑定 v-model

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

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



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


DOCTYPE html>
<html lang&#61;"en">
<head>
<meta charset&#61;"UTF-8">
<meta http-equiv&#61;"X-UA-Compatible" content&#61;"IE&#61;edge">
<meta name&#61;"viewport" content&#61;"width&#61;device-width, initial-scale&#61;1.0">
<title>双向绑定title>
head>
<body>
<div id&#61;"app-6">
<p>{{ message }}p>
<input v-model&#61;"message">
div>
<script src&#61;"vue.js">script>
<script>
var app6 &#61; new Vue({
el: &#39;#app-6&#39;,
data: {
message: &#39;Hello Vue!&#39;
}
})
script>
body>
html>


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


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


五、VUE2的缺点

5.1 vue底层原理

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

DOCTYPE html>
<html lang&#61;"en">
<head>
<meta charset&#61;"UTF-8">
<meta http-equiv&#61;"X-UA-Compatible" content&#61;"IE&#61;edge">
<meta name&#61;"viewport" content&#61;"width&#61;device-width, initial-scale&#61;1.0">
<title>Vue2的缺点title>
<script src&#61;"./vue.js">script>
head>
<body>
<div id&#61;"app">
<div v-for&#61;"val in obj">{{val}}div>

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

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

在这里插入图片描述

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


解决方案



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


$ set的三个参数

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

数组的内置方法详情请看【JavaScirpt-06】数组的内置方法&#xff08;重点&#xff01;&#xff09;

综上&#xff1a; 所有的指令有v-model、v-for、v-if、v-show、v-on、v-bind

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







推荐阅读
  • Voicewo在线语音识别转换jQuery插件的特点和示例
    本文介绍了一款名为Voicewo的在线语音识别转换jQuery插件,该插件具有快速、架构、风格、扩展和兼容等特点,适合在互联网应用中使用。同时还提供了一个快速示例供开发人员参考。 ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • 移动端常用单位——rem的使用方法和注意事项
    本文介绍了移动端常用的单位rem的使用方法和注意事项,包括px、%、em、vw、vh等其他常用单位的比较。同时还介绍了如何通过JS获取视口宽度并动态调整rem的值,以适应不同设备的屏幕大小。此外,还提到了rem目前在移动端的主流地位。 ... [详细]
  • SpringMVC接收请求参数的方式总结
    本文总结了在SpringMVC开发中处理控制器参数的各种方式,包括处理使用@RequestParam注解的参数、MultipartFile类型参数和Simple类型参数的RequestParamMethodArgumentResolver,处理@RequestBody注解的参数的RequestResponseBodyMethodProcessor,以及PathVariableMapMethodArgumentResol等子类。 ... [详细]
  • Nginx使用(server参数配置)
    本文介绍了Nginx的使用,重点讲解了server参数配置,包括端口号、主机名、根目录等内容。同时,还介绍了Nginx的反向代理功能。 ... [详细]
  • Java实战之电影在线观看系统的实现
    本文介绍了Java实战之电影在线观看系统的实现过程。首先对项目进行了简述,然后展示了系统的效果图。接着介绍了系统的核心代码,包括后台用户管理控制器、电影管理控制器和前台电影控制器。最后对项目的环境配置和使用的技术进行了说明,包括JSP、Spring、SpringMVC、MyBatis、html、css、JavaScript、JQuery、Ajax、layui和maven等。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • 目录实现效果:实现环境实现方法一:基本思路主要代码JavaScript代码总结方法二主要代码总结方法三基本思路主要代码JavaScriptHTML总结实 ... [详细]
  • 猜字母游戏
    猜字母游戏猜字母游戏——设计数据结构猜字母游戏——设计程序结构猜字母游戏——实现字母生成方法猜字母游戏——实现字母检测方法猜字母游戏——实现主方法1猜字母游戏——设计数据结构1.1 ... [详细]
  • 本文介绍了解决IE678伪类不兼容问题的方法,包括少用CSS3和HTML5独有的属性,使用CSS hacker,使用last-child清除浮动、批量添加标签、去掉list item最后一个的border-right等技巧。同时还介绍了使用after清除浮动时加上IE独有属性zoom:1的处理方法。另外,本文还提到可以使用jQuery代替批量添加标签的功能,以及使用负边距和CSS2选择器element+element去掉list item最后一个的border-right的方法。 ... [详细]
  • FineReport平台数据分析图表显示部分系列接口的应用场景和实现思路
    本文介绍了FineReport平台数据分析图表显示部分系列接口的应用场景和实现思路。当图表系列较多时,用户希望可以自己设置哪些系列显示,哪些系列不显示。通过调用FR.Chart.WebUtils.getChart("chartID").getChartWithIndex(chartIndex).setSeriesVisible()接口,可以获取需要显示的系列图表对象,并在表单中显示这些系列。本文以决策报表为例,详细介绍了实现方法,并给出了示例。 ... [详细]
  • 在JavaScript中,函数没有重载的概念,如果声明了多个重名的函数,不管函数的形参个数是否一样,只有最后一个有效。如果调用函数时传入的参数个数与函数定义时的参数个数不符,会出现不同的情况。函数调用时,传入的参数个数少于函数定义时的参数个数,未传入的参数会被当做undefined处理,可能会导致错误。而传入的参数个数多于函数定义时的参数个数,多余的参数不会被使用,但不会报错。 ... [详细]
  • 本文详细解析了JavaScript中相称性推断的知识点,包括严厉相称和宽松相称的区别,以及范例转换的规则。针对不同类型的范例值,如差别范例值、统一类的原始范例值和统一类的复合范例值,都给出了具体的比较方法。对于宽松相称的情况,也解释了原始范例值和对象之间的比较规则。通过本文的学习,读者可以更好地理解JavaScript中相称性推断的概念和应用。 ... [详细]
  • 高质量SQL书写的30条建议
    本文提供了30条关于优化SQL的建议,包括避免使用select *,使用具体字段,以及使用limit 1等。这些建议是基于实际开发经验总结出来的,旨在帮助读者优化SQL查询。 ... [详细]
  • 本文介绍了使用Python解析C语言结构体的方法,包括定义基本类型和结构体类型的字典,并提供了一个示例代码,展示了如何解析C语言结构体。 ... [详细]
author-avatar
会说话的鱼911
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有