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

相关文章

Vue3 的 shallowRef 和 shallowReactive:优化性能

大家对 Vue3 的 ref 和 reactive 都很熟悉,那么对 shallowRef 和 shallowReactive 是否了解呢? 在编程和数据结构中,“shallow”(浅层)通常指对数据结构的最外层进行操作,而不递归地处理其内部或嵌套的数据。这种处理方式关注的是数据结构的第一层属性或元素,而忽略更深层次的嵌套内容。 1. 浅层与深层的对比 1.1 浅层(Shallow) 定义

这15个Vue指令,让你的项目开发爽到爆

1. V-Hotkey 仓库地址: github.com/Dafrok/v-ho… Demo: 戳这里 https://dafrok.github.io/v-hotkey 安装: npm install --save v-hotkey 这个指令可以给组件绑定一个或多个快捷键。你想要通过按下 Escape 键后隐藏某个组件,按住 Control 和回车键再显示它吗?小菜一碟: <template

【 html+css 绚丽Loading 】000046 三才归元阵

前言:哈喽,大家好,今天给大家分享html+css 绚丽Loading!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏+关注哦 💕 目录 📚一、效果📚二、信息💡1.简介:💡2.外观描述:💡3.使用方式:💡4.战斗方式:💡5.提升:💡6.传说: 📚三、源代码,上代码,可以直接复制使用🎥效果🗂️目录✍️

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

day-51 合并零之间的节点

思路 直接遍历链表即可,遇到val=0跳过,val非零则加在一起,最后返回即可 解题过程 返回链表可以有头结点,方便插入,返回head.next Code /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}*

计算机毕业设计 大学志愿填报系统 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试

🍊作者:计算机编程-吉哥 🍊简介:专业从事JavaWeb程序开发,微信小程序开发,定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事,生活就是快乐的。 🍊心愿:点赞 👍 收藏 ⭐评论 📝 🍅 文末获取源码联系 👇🏻 精彩专栏推荐订阅 👇🏻 不然下次找不到哟~Java毕业设计项目~热门选题推荐《1000套》 目录 1.技术选型 2.开发工具 3.功能

cross-plateform 跨平台应用程序-03-如果只选择一个框架,应该选择哪一个?

跨平台系列 cross-plateform 跨平台应用程序-01-概览 cross-plateform 跨平台应用程序-02-有哪些主流技术栈? cross-plateform 跨平台应用程序-03-如果只选择一个框架,应该选择哪一个? cross-plateform 跨平台应用程序-04-React Native 介绍 cross-plateform 跨平台应用程序-05-Flutte

Vue3项目开发——新闻发布管理系统(六)

文章目录 八、首页设计开发1、页面设计2、登录访问拦截实现3、用户基本信息显示①封装用户基本信息获取接口②用户基本信息存储③用户基本信息调用④用户基本信息动态渲染 4、退出功能实现①注册点击事件②添加退出功能③数据清理 5、代码下载 八、首页设计开发 登录成功后,系统就进入了首页。接下来,也就进行首页的开发了。 1、页面设计 系统页面主要分为三部分,左侧为系统的菜单栏,右侧

【VUE】跨域问题的概念,以及解决方法。

目录 1.跨域概念 2.解决方法 2.1 配置网络请求代理 2.2 使用@CrossOrigin 注解 2.3 通过配置文件实现跨域 2.4 添加 CorsWebFilter 来解决跨域问题 1.跨域概念 跨域问题是由于浏览器实施了同源策略,该策略要求请求的域名、协议和端口必须与提供资源的服务相同。如果不相同,则需要服务器显式地允许这种跨域请求。一般在springbo

HTML提交表单给python

python 代码 from flask import Flask, request, render_template, redirect, url_forapp = Flask(__name__)@app.route('/')def form():# 渲染表单页面return render_template('./index.html')@app.route('/submit_form',