Vue day-03

2024-09-08 12:04
文章标签 javascript vue 03 frontend day

本文主要是介绍Vue day-03,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

Vue常用特性

一.响应更新

1. 1 v-for更新监测

1.2 v-for就地更新

1.3 什么是虚拟DOM

1.4 diff算法更新虚拟DOM

总结:key值的作用和注意点:

二.过滤器

2.1 vue过滤器-定义使用

2.2 vue过滤器-传参和多过滤器

三. 计算属性(computed)

3.1 计算属性-定义使用

3.2 计算属性-缓存

3.3 计算属性和方法的区别

四. 侦听器(watch)

4.1 侦听器-定义使用

4.2 vue侦听器-深度侦听和立即执行

4.3 计算属性(computed)和侦听器( watch)的区别

五.Vue中响应式系统的原理

六.Vue中双向数据绑定的原理


Vue常用特性

一.响应更新

1. 1 v-for更新监测

当v-for遍历的目标结构改变, Vue触发v-for的更新

  • 情况1: 数组翻转
  • 情况2: 数组截取
  • 情况3: 更新值

总结:

数组变更方法, 就会导致v-for更新, 页面更新

数组非变更方法, 返回新数组, 就不会导致v-for更新, 可采用覆盖数组或this.$set()

多学一招:

1.动态响应数据处理(数组、对象)

  • Vue.set(data,index,newvalue);vm.$set(data,index,newvalue);

2.总结:这些方法会触发数组改变, v-for会监测到并更新页面

push()pop()shift()unshift()splice()sort()reverse()

这些方法不会触发v-for更新

slice()filter()concat() 等

1.2 v-for就地更新

v-for 的默认行为会尝试原地修改元素而不是移动它们

这样的虚拟DOM对比方式, 可以提高性能 - 但是还不够高

1.3 什么是虚拟DOM

浏览器渲染页面的原理及流程

什么是虚拟DOM

真实DOM

虚拟DOM

1.4 diff算法更新虚拟DOM

  • 无key:就地更新

  • key为index:还是就地更新

  • 有key (唯一): 按key比较更新

  • Diff算法演示:

  • 总结:key值的作用和注意点:

  • key来给每个节点做一个唯一标识

  • key的作用主要是为了高效的更新虚拟DOM

  • 不用key也不影响功能(就地更新), 添加key可以提高更新的性能

  • 关于v-for的key值设置

    1. 如果已渲染的列表元素下标不会有变化,key值设置为index即可(防止eslint警告)

    2. 如果已渲染的列表元素下标会有变化,key值请设置为唯一标识

      • diff算法默认使用“就地复用”的策略,是一个首尾交叉对比的过程。

      • 用index作为key和不加key是一样的,都采用“就地复用”的策略

      • “就地复用”的策略,只适用于不依赖子组件状态或临时 DOM 状态 (例如:表单输入值) 的列表渲染输出。

      • 将与元素唯一对应的值作为key,可以最大化利用dom节点,提升性能。

二.过滤器

  • 过滤器就是一个函数, 传入值返回处理后的值

  • 过滤器可以用在两个地方:双花括号插值和v-bind表达式。

  • 过滤器应该被添加在JavaScript表达式的尾部,由“管道”符号指示 |

  • 过滤器不改变真正的data,而只是改变渲染的结果,并返回过滤后的版本

  • 全局注册时是filter,没有s的。而局部过滤器是filters,是有s的

2.1 vue过滤器-定义使用

语法:

  • Vue.filter("过滤器名", (值) => {return "返回处理后的值"})

  • filters: {过滤器名字: (值) => {return "返回处理后的值"}

例如:

  • 全局定义字母都大写的过滤器

  • 局部定义字符串翻转的过滤器

<template><div><p>原来的样子: {{ msg }}</p><!-- 2. 过滤器使用语法: {{ 值 | 过滤器名字 }}--><p>使用翻转过滤器: {{ msg | reverse }}</p><p :title="msg | toUp">鼠标长停</p></div>
</template>
​
<script>
export default {data(){return {msg: 'HelloVue'}},// 方式2: 局部 - 过滤器// 只能在当前vue文件内使用/*语法: filters: {过滤器名字 (val) {return 处理后的值}}*/filters: {toUp (val) {return val.toUpperCase()}}
}
</script>
​
<style>
​
</style>

总结: 把值转成另一种形式, 使用过滤器, Vue3用函数替代了过滤器.

全局注册最好在main.js中注册, 一处注册到处使用

2.2 vue过滤器-传参和多过滤器

可同时使用多个过滤器, 或者给过滤器传参

  • 语法:

    • 过滤器传参: vue变量 | 过滤器(实参)

    • 多个过滤器: vue变量 | 过滤器1 | 过滤器2

<template><div><p>原来的样子: {{ msg }}</p><!-- 1.给过滤器传值语法: vue变量 | 过滤器名(值)--><p>使用翻转过滤器: {{ msg | reverse('&') }}</p><!-- 2.多个过滤利使用语法: vue变量 | 过滤器1 | 过滤器2--><p :title="msg | toUp | reverse('|')">鼠标长停</p></div>
</template>
​
<script>
export default {data(){return {msg: 'Hello, Vue'}},filters: {toUp (val) {return val.toUpperCase()}}
}
</script>
​
<style>
​
</style>

总结: 过滤器可以传参, 还可以对某个过滤器结果, 后面在使用一个过滤器

三. 计算属性(computed)

3.1 计算属性-定义使用

  • 模板中放入太多的逻辑会让模板过重且难以维护,使用计算属性可以让模板更加的简洁

  • 一个数据, 依赖另外一些数据计算而来的结果

  • computed比较适合对多个变量或者对象进行处理后返回一个结果值,也就是数多个变量中的某一个值发生了变化则我们监控的这个值也就会发生变化

语法:

computed: {"计算属性名" () {return "值"}
}

3.2 计算属性-缓存

  • 计算属性是基于它们的依赖项的值结果进行缓存的,只要依赖的变量不变, 都直接从缓存取结果

  • 计算属性根据依赖变量结果缓存, 依赖变化重新计算结果存入缓存, 比普通方法性能更高

3.3 计算属性和方法的区别

  • 计算属性是基于他们的依赖进行缓存的,只有在相关依赖发生改变时,他们才会重新求值,也就是说,只要他的依赖没有发生变化,那么每次访问的时候计算属性都会立即返回之前的计算结果,不再执行函数

  • 每次触发重新渲染时,调用方法将总会再次执行函数

四. 侦听器(watch)

4.1 侦听器-定义使用

使用watch可以侦听data/computed属性值改变

语法:

watch: {"被侦听的属性名" (newVal, oldVal){}}
  • 一般用于异步或者开销较大的操作

  • watch 中的属性,一定是data/computed中,已经存在的数据

4.2 vue侦听器-深度侦听和立即执行

  • 侦听复杂类型, 或者立即执行侦听函数

  • 当需要监听一个对象的改变时,普通的watch方法无法监听到对象内部属性的改变,只有data中的数据才能够监听到变化,此时就需要deep属性对对象进行深度监听

    语法:

    watch: {变量名 (newVal, oldVal){// 变量名对应值改变这里自动触发},变量名: {handler(newVal, oldVal){
    ​},deep: true, // 深度侦听(对象里面层的值改变)immediate: true // 立即侦听(网页打开handler执行一次)}
    }

4.3 计算属性(computed)和侦听器( watch)的区别

  • 计算属性computed :

  1. 支持缓存,只有依赖数据发生改变,才会重新进行计算

  2. 不支持异步,computed内不写异步操作

  3. computed 属性值会默认走缓存,计算属性是基于它们的响应式依赖进行缓存的,也就是基于data中声明过或者父组件传递的props中的数据通过计算得到的值

  4. 如果一个属性是由其他属性计算而来的,这个属性依赖其他属性,是一个多对一或者一对一,一般用computed

  • 侦听属性watch:

  1. 不支持缓存,数据变化,直接会触发相应的操作;

  2. watch支持异步;

  3. 监听的函数接收两个参数,第一个参数是最新的值;第二个参数是输入之前的值;

  4. 当一个属性发生变化时,需要执行对应的操作;一对多;

  • computed和watch的使用场景并不一样,computed的话是通过几个数据的变化,来影响一个数据,而watch,则是可以一个数据的变化,去影响多个数据。

五.Vue中响应式系统的原理

  • 观察者模式又被称为 发布者-订阅者 模式,这种模式定义了对象间的一种一对多的依赖关系。当一个对象的状态发生改变时,所有依赖于它的对象都将得到通知,并完成自动更新。

  • ES5提供的Object.defineProperty() 方法来劫持 (监控) 各属性的getter、setter,并在数据(对象)发生变动时通知订阅者,触发相应的监听回调。并且,由于是在不同的数据上触发同步,可以精确的将变更发送给绑定的视图,而不是对所有的数据都执行一次检测。

  • Vue中的响应式处理中,大致可以划分三个模 块:Observer(观察者)、Watcher(订阅者)、Compile(指令解析)

  • Observer 数据监听器,通过Object.defineProperty去劫持对象的访问器(getter、setter)数据对象的所有属性进行监听(数据劫持),监听到数据发生变化后通知订阅者。

  • Dep:依赖收集器,添加订阅者,维护使用数据的各个依赖Watcher。

  • Watcher 订阅者,关联Observer和Compile,Observer通知数据变化,Watcher 接收数据变更及时通知视图进行更新。Updater是它自身的一个方法,用于执行Compile中绑定的回调,更新视图。

  • Compile主要作用就是解析template模板,对每个元素节点的指令进行扫描解析,根据指令模板替换数据,绑定Watcher的更新函数达到更新视图。

  • 总结: vue采用的是观察者模式,vue在解析渲染时,会进行依赖收集,会将渲染的data数据,计算属性computed、侦听器watcher等,都收集到对应的dep中,当Object.defineProperty监听到数据变化,就根据依赖关系,派发更新。

    在Vue2.x中,利用的是 Object.defineProperty去劫持对象的访问器(getter、setter) ,当对象属性值发生变化时可获取变化,然后根据变化来作后续响应;

    在Vue3.0中,则是通过Proxy 代理对象进行类似的操作。劫持的是整个对象,只要对象中的属性变化了,都能劫持到变化。

六.Vue中双向数据绑定的原理

总结: vuejs是采取数据劫持结合发布者-订阅者模式的方式实现model-->view的数据绑定,通过Object.defineProperty()或Proxy来劫持各个属性的setter,getter,在数据变动时发布消息给订阅者,触发相应的数据回调。

双向数据绑定的实现流程:

  • 双向数据绑定是建立在单向数据绑定(model==>View)的基础之上的

  • 在解析v-model指令时, 给当前元素添加input监听 当input的value发生改变时, 将最新的值赋值给当前表达式所对应的data属性

这篇关于Vue day-03的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1148063

相关文章

全面解析HTML5中Checkbox标签

《全面解析HTML5中Checkbox标签》Checkbox是HTML5中非常重要的表单元素之一,通过合理使用其属性和样式自定义方法,可以为用户提供丰富多样的交互体验,这篇文章给大家介绍HTML5中C... 在html5中,Checkbox(复选框)是一种常用的表单元素,允许用户在一组选项中选择多个项目。本

HTML5 搜索框Search Box详解

《HTML5搜索框SearchBox详解》HTML5的搜索框是一个强大的工具,能够有效提升用户体验,通过结合自动补全功能和适当的样式,可以创建出既美观又实用的搜索界面,这篇文章给大家介绍HTML5... html5 搜索框(Search Box)详解搜索框是一个用于输入查询内容的控件,通常用于网站或应用程

CSS3中的字体及相关属性详解

《CSS3中的字体及相关属性详解》:本文主要介绍了CSS3中的字体及相关属性,详细内容请阅读本文,希望能对你有所帮助... 字体网页字体的三个来源:用户机器上安装的字体,放心使用。保存在第三方网站上的字体,例如Typekit和Google,可以link标签链接到你的页面上。保存在你自己Web服务器上的字

html 滚动条滚动过快会留下边框线的解决方案

《html滚动条滚动过快会留下边框线的解决方案》:本文主要介绍了html滚动条滚动过快会留下边框线的解决方案,解决方法很简单,详细内容请阅读本文,希望能对你有所帮助... 滚动条滚动过快时,会留下边框线但其实大部分时候是这样的,没有多出边框线的滚动条滚动过快时留下边框线的问题通常与滚动条样式和滚动行

使用vscode搭建pywebview集成vue项目实践

《使用vscode搭建pywebview集成vue项目实践》:本文主要介绍使用vscode搭建pywebview集成vue项目实践,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录环境准备项目源码下载项目说明调试与生成可执行文件核心代码说明总结本节我们使用pythonpywebv

使用Python和Tkinter实现html标签去除工具

《使用Python和Tkinter实现html标签去除工具》本文介绍用Python和Tkinter开发的HTML标签去除工具,支持去除HTML标签、转义实体并输出纯文本,提供图形界面操作及复制功能,需... 目录html 标签去除工具功能介绍创作过程1. 技术选型2. 核心实现逻辑3. 用户体验增强如何运行

CSS 样式表的四种应用方式及css注释的应用小结

《CSS样式表的四种应用方式及css注释的应用小结》:本文主要介绍了CSS样式表的四种应用方式及css注释的应用小结,本文通过实例代码给大家介绍的非常详细,详细内容请阅读本文,希望能对你有所帮助... 一、外部 css(推荐方式)定义:将 CSS 代码保存为独立的 .css 文件,通过 <link> 标签

使用Vue-ECharts实现数据可视化图表功能

《使用Vue-ECharts实现数据可视化图表功能》在前端开发中,经常会遇到需要展示数据可视化的需求,比如柱状图、折线图、饼图等,这类需求不仅要求我们准确地将数据呈现出来,还需要兼顾美观与交互体验,所... 目录前言为什么选择 vue-ECharts?1. 基于 ECharts,功能强大2. 更符合 Vue

Vue中插槽slot的使用示例详解

《Vue中插槽slot的使用示例详解》:本文主要介绍Vue中插槽slot的使用示例详解,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录一、插槽是什么二、插槽分类2.1 匿名插槽2.2 具名插槽2.3 作用域插槽三、插槽的基本使用3.1 匿名插槽

springboot+vue项目怎么解决跨域问题详解

《springboot+vue项目怎么解决跨域问题详解》:本文主要介绍springboot+vue项目怎么解决跨域问题的相关资料,包括前端代理、后端全局配置CORS、注解配置和Nginx反向代理,... 目录1. 前端代理(开发环境推荐)2. 后端全局配置 CORS(生产环境推荐)3. 后端注解配置(按接口