Vue.js知识点学习的一点笔记

一、虚拟DOM

1、原生JS是命令式编程,当渲染在页面的数据发生一点点变化,需要整个重新渲染一编。vue.js渐进式框架有个虚拟DOM的概念,运用diff算法,比较新旧数据,相同的数据不变不重渲染,不同的部分新数据覆盖旧数据。

二、MVVM

1、MV:M是数据‘模块’,V是DOM元素‘视图’

2、VM:是指Vue对象实例。是M和V联系的桥梁

三、数据代理

1、Object.defineProperty()

let a={x:9};

let b={y:1};

Object.defineProperty(b,'x',{

                         get(){

                                  return a.x ;

                                  } ,

                           set(value){

                                  a.x=value

                                   } ,                             

})

 2、输出vue实例对象,data下的数据存放在vm的_data对象中。而dom元素插值数据是从vm下的取的属性值。也就是说vue封装了数据代理机制(底层用了Object.defineProperty()方法)。

四、事件修饰

0、@click=handle(event)等价于@click=handle($event)

1、prevent:阻止默认行为,比如a表亲啊加链接的跳转行为会被阻止;

2、stop:阻止冒泡事件;

3、onece:事件只能执行一次;

4、capture:冒泡模式切换成捕获模式;

5、self:只有事件发生在自己身上(不是因为冒泡或者捕获触发的事件)才会触发事件;

6、passive:比如@wheel事件,只有执行完方法里的代码才会回调滚动滚动条,加了passive,会先滚动滚动条再执行方法里的行为。

7、事件修饰可以连着写,比如:@click.prevent.stop=handle()

五、键盘事件

1、event.key获取键盘按键的名称,evant.keycode获取键盘按键的代码

2、@keydown,@keyup

3、常用按键名称:enter、tab(只对@keydown有效)、eac、delete、space、top、bottom、left、right

4、特殊用法的几个按键:ctrl、alt、shift、meta

配合@keyup使用:按下按键,配合其他按键再释放其他按键,触发事件,比如ctrl+s再释放s键

配合@keydown用:正常使用

当配合@keyup使用的时候,可以指定另一个按键,如:@keyup.ctrl.k=handle(),这样就只能配合k使用了。

5、也可以配合使用按键的keycode(随时会停止维护,不推荐)

6、自定义键名:vue实例外,Vue.keycodes.自定义建名=按键编码

六、插值语法{{}}、方法methods、计算属性computed

1、当任意数据发生改变时,dom元素和插值语法中的数据或者方法(写插值语法中的防范必须带括号)会重新解析一遍

2、而计算属性只会初次加载和相关联数据发生改变的时候才会触发计算属性重新解析,因为计算属性可以缓存数据

3、计算属性中有getter方法和setter方法,当只有getter方法,没有setter方法的时候,计算属性可以简写,写在插值语法中的方法名可以不带括号

computed:{

           get:function handle(){

                return this.a;

},

}

简写:

computed:{

          handle() {

              return this.a;

},

}

七、 监视、深度监视、另一种写法、简写

1、监视:当data中的属性或者computed计算属性发生改变回调的方法。如果将immediate属性改为true,则每次进入页面的时候自动对该属性进行一次监视。

data:{

    a:1,

},

watch:{

   a:{

     immediate:true,

      handler(newValue,oldValue){

             console.log("a发生改变了!")

                 }

   }

}

2、 深度监视:当属性是嵌套的对象,监视属性中的某个属性变化,就是深度监视

data:{

   a:{

     b:2,

     c:3,

    }

}

//1、此时要监视a属性中的b发生变化后的回调,则加引号,读取对象a的b值

watch:{

   "a.b":{

      handler(newValue,oldValue){

             console.log("a的b发生改变了!")

                 }

   }

}

//2、那如果是监测a对象(a对象地址,即a={o:9})发生改变的回调呢?

watch:{

   a:{

     immediate:true,

      handler(newValue,oldValue){

             console.log("a发生改变了!")

                 }

   }

}

//3、那如果是监测a对象中任一值发生改变的回调呢?答:将deep属性改为true值。

watch:{

   a:{

     deep:true,

      handler(newValue,oldValue){

             console.log("a的某某值发生改变了!")

                 }

   }

}

3、深度监视:

    【1】Vue中的watch默认不监测对象内部值的改变(只监测一层) 

    【2】加deep属性,改为true值,watch可以检测对象内部值的改变(可以检测对象多层嵌套层里面的值)

    【3】但是,Vue自身是可以检测到对象内部多层数据的改变,只是Vue提供的watch属性不允许。

4、监视、深度监视,还可以这样写:

const vm=new Vue({

data:{

    a:1,

        }

});

vm.$watch(a,(

   handle(newValue,oldValue){

      console.log("a发生改变")    

      }

))

5、监视的简写:当只有handle回调,没有immediate、deep等其他配置项的时候,监视是可以像getter一样监视的

简写1:

 watch:{

       a(newValue,oldValue){

         console.log("a发生改变了!")  

         }    

}

简写2:

vm.$watch(a,function(newValue,oldValue){

   console.log("a发生改变了!")  

})

八、computed计算属性和watch侦听

1、computed能办到的,watch也能办到,watch能办到的computed不一定能办到,比如,watch中可以写异步函数,computed中不能写异步函数

九、什么时候用箭头函数

1、非Vue管理的函数(定时器、Promise、axios等回调函数),里面用箭头函数,这样用的this指向的是vm Vue实例或组件实例对象。

2、所有Vue管理的函数,最好写成普通函数

十、Vue侦听和watch侦听原理

1、一斑窥豹

【1】未添加setter和getter方法的对象打印出来是这样的:

【2】添加setter和getter方法的对象打印出来是这样的:

2、如果在对象本身上添加setter会造成无线递归,内存溢出,所以封装一个类似Observer的构造函数在另一人身上复刻属性并添加setter和getter方法

[异常:RangeError: Maximum call stack size exceeded at Object.get [as name]

范围错去:name属性超过Object处的最大调用堆栈大小。

3、Vue封装了一个递归查询,可以找出对象嵌套多层中的对象,并为之添加setter和getter方法,直到最后不是对象类型的数据为止,如数组、字符串、数字、Boolean、null、undefined等等。

4、 为所有哪怕深层嵌套的对象添加setter和getter之后,会将其拷贝到vm._data中,紧接着,将vm._data数据代理到vm自身上。实现Vue框架上的dom元素可实时获取vm身上的数据。如{{information.name}}。

十一、从Vue侦听原理得出,未添加setter和getter方法的非对象类属性,是不可被直接更改的

问题 一:

点击按钮,往对象a中添加一个属性b,页面不呈现b的值。是因为Vue没有侦听到b属性,b属性不具备getter和setter操作。

点击之后,数据不呈现:

2、解决办法:

【1】把a对象这个数据更新一遍,因为a身上有getter和setter:this.a={......}。

【2】用Vue自身上的set方法添加属性:Vue.set(target,key,value)。比如:Vue.set(a,'b','你很好真的很好!')。或者:this.$set(target,key,value)。效果一样。

【3】注意不能再vm自身或者根目录上,比如vm._data用set方法。

问题二:

同理,直接添加或者修改不被setter和getter的数组呢?

比如:对象里面放数组,数组里面对象,但凡对象都有setter和getter,那么中间一层的数组没有setter二号getter,那么,直接改变数组的话,页面不呈现改变后端信息!

解决办法:

【1】用this.$set(persons,0,{id:"001},name:"马老师",age:50,sex:"男")

【2】用Vue封装的操作数组:push()  pop()  shift() unshift()  splice()  sort()  reserve()

        <1>这些方法本质做了两件事:1、包裹Array原型链上的原生方法;2、重新解析解析模板进而更新页面。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

python 连接Redis 数据库

pip install redis python代码 import redis# 连接数据库 r redis.Redis(host192.168.56.15, port6379, db0)# 存储数据 #r.set(key, value) r.set(name, zaraNet)# 获取数据 value r.get(name) print(value)# 关闭连接&#xff08;可选&#xff09; r.close()

spring boot 整合mongodb

1、安装依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-mongodb</artifactId></dependency>2、配置数据库连接 spring:data:mongodb:host: localhostport: 27017username: xxxxxxp…

.fargo后缀勒索病毒|勒索病毒解密恢复|fargo勒索病毒解密|勒索病毒解密恢复|数据库恢复

fargo勒索病毒概述&#xff0c;fargo勒索病毒解密恢复及日常防护建议 目录&#xff1a; fargo勒索病毒介绍感染fargo勒索病毒后的表现fargo勒索病毒的感染形式如何恢复.fargo后缀勒索病毒fargo勒索病毒日常防护建议 简介&#xff1a; 河北某有限公司的财务系统&#xff0c;由…

拼多多商品详情API接入站点,实时数据json格式示例

作为国内最大的电商平台之一&#xff0c;拼多多数据采集具有多个维度。 有人需要采集商品信息&#xff0c;包括品类、品牌、产品名、价格、销量等字段&#xff0c;以了解商品销售状况、热门商品属性&#xff0c;进行市场扩大和重要决策&#xff1b; 商品数据&#xff1a;拼…

【数字实验室】时钟切换

大部分开发者使用 BUFGCTRL 或 BUFGMUX进行时钟切换&#xff0c;它们在时钟切换上可以提供无毛刺输出。然而&#xff0c;了解所涉及的原理是有好处的。 当然&#xff0c;无论我们在同步逻辑中使用哪种技术&#xff0c;重要的是要确保在进行时钟切换时输出上没有毛刺。任何故障都…

docker安装Oracle11gR2

文章目录 目录 文章目录 前言 一、前期准备 二、具体配置 2.1 配置oracle容器 2.2 配置navicat连接 总结 前言 使用docker模拟oracle环境 一、前期准备 安装好docker #拉取镜像 docker pull registry.cn-hangzhou.aliyuncs.com/helowin/oracle_11g #启动 docker run -…

YOLOv5改进系列(22)——替换主干网络之MobileViTv1(一种轻量级的、通用的移动设备 ViT)

【YOLOv5改进系列】前期回顾: YOLOv5改进系列(0)——重要性能指标与训练结果评价及分析 YOLOv5改进系列(1)——添加SE注意力机制

安防监控/视频集中存储/云存储平台EasyCVR v3.3增加首页告警类型

安防监控/视频集中存储/云存储EasyCVR视频汇聚平台&#xff0c;可支持海量视频的轻量化接入与汇聚管理。平台能提供视频存储磁盘阵列、视频监控直播、视频轮播、视频录像、云存储、回放与检索、智能告警、服务器集群、语音对讲、云台控制、电子地图、平台级联、H.265自动转码等…

亚马逊搜索关键词下单怎么操作

亚马逊鲲鹏系统可以根据产品关键词搜索后进行下单购买&#xff0c;多个亚马逊买家号搜索关键词下单可以帮助关键词上首页&#xff0c;具体操作如下&#xff1a; 首先需要先准备好一批能下单的买家账号及代理ip&#xff0c;准备好之后就可以设置需要下单的关键词及asin进行货比…

Navicat 蝉联 2023年度 DBTA 读者选择奖的“最佳数据库管理员解决方案”奖项和 DBTA 100 强名单

近日&#xff0c;Database Trends and Applications (简称 DBTA) 颁发的“读者选择奖”获奖名单新鲜出炉&#xff0c;Navicat 蝉联 2023 年度 DBTA 读者选择奖的“最佳数据库管理员&#xff08;DBA&#xff09;解决方案”奖项和 DBTA 100 强名单&#xff0c;我们感到无比荣幸和…

AutoHotkey:定时删除目录下指定分钟以前的文件,带UI界面

删除指定目录下&#xff0c;所有在某个指定分钟以前的文件&#xff0c;可以用来清理经常生成很多文件的目录&#xff0c;但又需要保留最新的一部分文件 支持拖放目录到界面 能够记忆设置&#xff0c;下次启动后不用重新设置&#xff0c;可以直接开始 应用场景比如&#xff1a…

Python制作爱心并打包成手机端可执行文件

前言 本文是想要将python代码打包成在手机上能执行的文件 尝试了几个库&#xff0c; 有这也那样的限制&#xff0c;最终还是选了BeeWare 环境&#xff1a;python3.7.x 开始 找到打包有相关工具os-android-apk-builder&#xff0c;buildozer&#xff0c;cx_Freeze&#xff…

三、Kafka生产者

目录 3.1 生产者消息发送流程3.1.1 发送原理 3.2 异步发送 API3.3 同步发送数据3.4 生产者分区3.4.1 kafka分区的好处3.4.2 生产者发送消息的分区策略3.4.3 自定义分区器 3.5 生产者如何提高吞吐量3.6 数据可靠性 3.1 生产者消息发送流程 3.1.1 发送原理 3.2 异步发送 API 3…

uniapp 顶部头部样式

<u-navbartitle"商城":safeAreaInsetTop"true"><view slot"left"><image src"/static/logo.png" mode"" class"u-w-50 u-h-50"></image></view></u-navbar>

深入了解 Java 中 Files 类的常用方法及抽象类的 final 修饰

文章目录 Files 类常用方法抽象类的 final 修饰 &#x1f389;欢迎来到Java学习路线专栏~深入了解 Java 中 Files 类的常用方法及抽象类的 final 修饰 ☆* o(≧▽≦)o *☆嗨~我是IT陈寒&#x1f379;✨博客主页&#xff1a;IT陈寒的博客&#x1f388;该系列文章专栏&#xff1a…

JetBrains IDE远程开发功能可供GitHub用户使用

JetBrains与GitHub去年已达成合作&#xff0c;提供GitHub Codespaces 与 JetBrains Gateway 之间的集成。 GitHub Codespaces允许用户创建安全、可配置、专属的云端开发环境&#xff0c;此集成意味着您可以通过JetBrains Gateway使用在 GitHub Codespaces 中运行喜欢的IDE进行…

数字化赋能高质量施工,成企业创新转型新方向

建筑行业是一个需要投入大量资金、能源消耗大、风险高且劳动力密集的行业&#xff0c;传统施工管理方式存在着“无法实时控制进度、无法实时控制质量、材料浪费、常需返工、安全事件频发”等问题。 为了自身的转型升级&#xff0c;也为了响应国家战略规划落地对建筑行业提出的要…

Java源码分析(一)Integer

当你掌握Java语言到了一定的阶段&#xff0c;或者说已经对Java的常用类和API都使用的行云流水。你会不会有一些思考&#xff1f;比如&#xff0c;这个类是如何设计的&#xff1f;这个方法是怎么实现的&#xff1f;接下来的一系列文章&#xff0c;我们一起学习下Java的一些常见类…

day-27 代码随想录算法训练营(19)part03

78.子集 画图分析&#xff1a; 思路&#xff1a;横向遍历&#xff0c;每次遍历的时候都进行一次添加&#xff0c;然后进行纵向递归&#xff0c;递归完之后进行回溯。 注意&#xff1a;空集也是子集。 90.子集|| 分析&#xff1a;和上题一样&#xff0c;区别在于有重复数字 …

docker导出、导入镜像、提交

导出镜像到本地&#xff0c;然后可以通过压缩包的方式传输。 导出&#xff1a;docker image save 镜像名:版本号 > /home/quxiao/javatest.tgz 导入&#xff1a;docker image load -i /home/quxiao/javatest.tgz 删除镜像就得先删除容器&#xff0c;当你每运行一次镜像&…