前端开发核心知识详解:Vue2、JavaScript 与 CSS
一、Vue2 核心知识点
1. Vue2 的双向绑定原理
Vue2 实现双向绑定主要依赖数据劫持与发布 - 订阅者模式。
利用Object.defineProperty方法对数据对象的属性进行劫持,为每个属性定义getter和setter。getter用于收集依赖,当视图中使用到该属性时,对应的Watcher会被添加到Dep(依赖)中;setter则在属性值发生变化时,触发Dep通知所有依赖该属性的Watcher,进而更新视图。
例如,在一个简单的数据对象上实现数据劫持:
function defineReactive(obj, key, value) {const dep = new Dep();Object.defineProperty(obj, key, {get() {Dep.target && dep.addSub(Dep.target);return value;},set(newVal) {if (value!== newVal) {value = newVal;dep.notify();}}});
}
而v-model指令实现的双向绑定,本质上是:value与@input的语法糖,在数据和视图之间建立起双向的联系。
2. Vue2 开发注意事项
在 Vue2 开发中,要特别关注响应式数据的问题。由于Object.defineProperty的局限性,对于对象新增属性,Vue 无法自动检测到变化。此时需要使用Vue.set()或this.$set()方法来添加属性,确保数据变化能被正确监听。
对于数组,直接通过索引修改元素或修改数组长度,Vue 也无法检测到变化。应使用push()、pop()、splice()等被 Vue 重写的数组方法,或者使用Vue.set()、splice()方法来更新数组元素。
3. Vue2 数据监听不到的处理
当出现数据监听不到的情况,除了上述提到的使用Vue.set()或this.$set()处理对象新增属性和数组元素修改外,对于批量更新数据,可以利用Vue.nextTick()方法。
它能在下次 DOM 更新循环结束之后执行延迟回调,确保在数据更新后,基于更新后的数据进行操作。
4. v-if 和 v-show 的区别与应用场景
v-if和v-show都能控制元素的显示与隐藏,但原理和应用场景有所不同。v-if是根据条件动态地创建或销毁 DOM 元素,当条件为假时,元素会从 DOM 树中彻底移除,初始渲染时若条件为假则不渲染。因此它适合用于低频切换的场景,比如根据用户权限控制某些功能模块的显示。
v-show则是通过 CSS 的display属性来控制元素的显示与隐藏,无论初始条件如何,元素都会被渲染到 DOM 中,只是通过样式来决定是否显示。这种方式切换开销较小,适用于高频切换的场景,例如选项卡的显示状态切换。
5. 计算属性 computed 和监听属性 watch 的区别
计算属性computed基于依赖缓存结果,只有当依赖的响应式数据发生变化时,才会重新计算。它适合用于将多个数据进行复杂逻辑处理后映射到视图的场景,例如根据firstName和lastName计算出fullName。
监听属性watch则专注于监听特定数据的变化,当监听的数据发生变化时,会执行对应的回调函数。它支持异步操作和深度监听,常用于处理数据变化后的副作用,比如在用户 ID 变化时,发起获取用户详情的请求。
6. Vue2 的生命周期
Vue2 的生命周期包括创建阶段、挂载阶段、更新阶段和卸载阶段。
- 创建阶段:
beforeCreate阶段,实例刚被创建,此时还未进行数据观测和事件初始化;created阶段,数据初始化完成,可以在这个阶段发起无 DOM 依赖的接口请求。 - 挂载阶段:
beforeMount阶段,模板编译完成,但尚未挂载到 DOM;mounted阶段,DOM 挂载完成,这是发起需要 DOM 的接口请求的最佳时机。 - 更新阶段:
beforeUpdate阶段,数据更新前,此时 DOM 尚未更新;updated阶段,DOM 更新完成。 - 卸载阶段:
beforeDestroy阶段,实例销毁前,可在此清理定时器等资源;destroyed阶段,实例销毁完成。

二、CSS 核心知识点
1. CSS3 新属性
CSS3 引入了众多强大的新属性。在选择器方面,新增了结构性伪类如nth-child(n)、first-of-type、not(),以及属性选择器如[data-type^="app"](开头匹配)、[class*="box"](包含匹配)。
视觉效果上,box-shadow用于添加盒阴影,background: linear-gradient(to bottom, #fff, #000)可创建渐变背景,border-radius实现圆角边框。
2D/3D 转换属性中,transform用于位移、旋转等操作,perspective则提供 3D 透视效果。动画与过渡方面,transition实现过渡效果,@keyframes定义关键帧动画。
2. flex 布局
flex布局是一种一维布局模型,通过display: flex在容器上启用。容器属性包括justify-content控制主轴对齐方式,align-items控制交叉轴对齐方式,flex-wrap决定是否换行。子元素通过flex-grow、flex-shrink和flex-basis属性,来控制在容器中的尺寸分配。
3. CSS 基本布局和定位
CSS 基本布局包括标准流布局、浮动布局、定位布局和 Grid 布局。
标准流布局中,块级元素垂直排列,行内元素水平排列;
浮动布局通过float: left/right使元素脱离标准流,常用于多列布局;
定位布局利用position: static/relative/absolute/fixed实现元素的精确定位,适用于模态框、固定导航栏等场景;
Grid 布局是二维网格系统,适合复杂的响应式布局。
4. 实现左中右三部分布局
要实现一个页面分成左中右 3 部分,中间 400px 固定,左右两边自适应平分,可以使用以下几种方法。
- Flex 弹性布局:
<div style="display: flex; height: 100vh;"><div style="flex: 1; background: #f0f0f0;"></div><div style="width: 400px; background: #e0e0e0;"></div><div style="flex: 1; background: #f0f0f0;"></div>
</div>
- Grid 网格布局:
.container {display: grid;grid-template-columns: 1fr 400px 1fr;
}
- 绝对定位 + margin(兼容性方案):
.left,
.right {position: absolute;width: 50%;height: 100%;
}
.left {left: 0;
}
.right {right: 0;
}
.center {margin: 0 50%;width: 400px;margin-left: calc(-200px);
}
三、JavaScript 核心知识点
1. JavaScript 基本数据类型
JavaScript 有 7 种基本数据类型
包括 ES5 中的string、number、boolean、null、undefined,以及 ES6 新增的Symbol(用于创建唯一标识符)和BigInt(处理大整数精度问题)
这些数据类型具有不可变性,存储在栈内存中
2. JavaScript 数组常用方法
JavaScript 数组提供了丰富的常用方法,可分为迭代方法、修改原数组方法和搜索判断方法。
迭代方法如map()用于映射转换,filter()用于过滤元素,slice()用于截取子数组;
修改原数组方法包括push()、pop()、shift()、unshift()、splice()等;
搜索判断方法有indexOf()查找元素索引,includes()判断数组是否包含某个元素。
3. 删除数组中间某一项
删除数组中间某一项,可以根据是否已知索引选择不同方法。
已知索引时,使用splice(index, 1)方法,它会修改原数组并返回被删除的元素;
若不知道索引,可先通过indexOf()找到索引再使用splice(),或者使用filter()方法过滤掉要删除的元素,返回一个新数组。
4. JavaScript 精度丢失问题解决
对于 JavaScript 精度丢失问题,处理大整数(>2^53)时可使用BigInt类型。
处理小数运算时,可将小数转换为整数进行运算,再将结果转换回小数;
也可以使用专业库如decimal.js,它能精确处理小数运算,避免精度丢失问题。
5. JavaScript 的作用域与作用域链
JavaScript 采用词法作用域,变量的作用域在定义时就确定下来。作用域链是当查找变量时,从当前作用域逐级向上级作用域查找,直到全局作用域的过程。闭包则是函数内部访问外部作用域变量,形成持久化引用的一种机制。
6. 实现自适应布局
实现自适应布局可通过多种方式。媒体查询@media能根据视口宽度切换样式;使用百分比单位设置元素宽度和内边距;借助 Flexbox 和 Grid 布局实现响应式分配;对于图片,使用srcset和picture标签适配不同设备。
7. 对同步和异步的理解
同步代码按顺序执行,前一个任务未完成时,后续任务会被阻塞;而异步代码不会阻塞后续任务执行,通过回调、Promise 或async/await等机制,在任务完成后处理结果。同步适合简单计算、函数调用等场景,异步适用于网络请求、定时器、文件操作等耗时任务,以避免阻塞主线程,提升用户体验。
相关文章:
前端开发核心知识详解:Vue2、JavaScript 与 CSS
一、Vue2 核心知识点 1. Vue2 的双向绑定原理 Vue2 实现双向绑定主要依赖数据劫持与发布 - 订阅者模式。 利用Object.defineProperty方法对数据对象的属性进行劫持,为每个属性定义getter和setter。getter用于收集依赖,当视图中使用到该属性时…...
JDK安装超详细步骤
🔥【JDK安装超详细步骤】 文章目录 🔥【JDK安装超详细步骤】1. 卸载系统自带的旧版JDK2. 安装JDK113. 验证安装是否成功4. 常见问题4.1 执行java -version提示命令未找到? 1. 卸载系统自带的旧版JDK 查询已安装的OpenJDK包。 rpm -qa | gre…...
PHP中的ReflectionClass讲解【详细版】
快餐: ReflectionClass精简版 在PHP中,ReflectionClass是一个功能强大的反射类,它就像是一个类的“X光透视镜”,能让我们在程序运行时深入了解类的内部结构和各种细节。 一、反射类的基本概念和重要性 反射是指在程序运行期间获…...
JAVA:Web安全防御
目录 一、Web安全基础与常见威胁 OWASP Top 10核心漏洞解析 • SQL注入(SQLi)、跨站脚本(XSS)、跨站请求伪造(CSRF) • 不安全的反序列化、敏感数据泄露 Java后端常见攻击场景 • 通过HttpServletRequest…...
39.剖析无处不在的数据结构
数据结构是计算机中组织和存储数据的特定方式,它的目的是方便且高效地对数据进行访问和修改。数据结构表述了数据之间的关系,以及操作数据的一系列方法。数据又是程序的基本单元,因此无论是哪种语言、哪种领域,都离不开数据结构&a…...
在离线 Ubuntu 环境下部署双 Neo4j 实例(Prod Dev)
在许多开发和生产场景中,我们可能需要在同一台服务器上运行多个独立的 Neo4j 数据库实例,例如一个用于生产环境 (Prod),一个用于开发测试环境 (Dev)。本文将详细介绍如何在 离线 的 Ubuntu 服务器上,使用 tar.gz 包部署两个 Neo4j…...
【Spring】单例模式的创建方式(Bean解析)
在Java中,单例模式(Singleton Pattern)确保一个类只有一个实例,并提供全局访问点。以下是实现单例的五种常见方式:懒汉式、饿汉式、双重检查锁、静态内部类和枚举,包括代码示例和优缺点分析。 1. 懒汉式&am…...
关于hadoop和yarn的问题
1.hadoop的三大结构及各自的作用? HDFS(Hadoop Distributed File System):分布式文件系统,负责海量数据的存储,具有高容错性和高吞吐量。 MapReduce:分布式计算框架,用于并行处理大…...
【飞渡科技数字孪生虚拟环境部署与集成教程 - CloudMaster实战指南】
飞渡科技数字孪生虚拟环境部署与集成教程 - CloudMaster实战指南 前言 本教程详细记录了飞渡科技的数字孪生平台CloudMaster的配置过程,以及如何将三维数字孪生场景集成到前端项目中。数字孪生技术能够在虚拟环境中精确复现物理实体的数据、特性和行为,…...
计算机软考中级 知识点记忆——排序算法 冒泡排序-插入排序- 归并排序等 各种排序算法知识点整理
一、📌 分类与比较 排序算法 最优时间复杂度 平均时间复杂度 最坏时间复杂度 空间复杂度 稳定性 应用场景与特点 算法策略 冒泡排序 O(n) O(n) O(n) O(1) 稳定 简单易实现,适用于小规模数据排序。 交换排序策略 插入排序 O(n) O(n) O…...
第十五届蓝桥杯 2024 C/C++组 下一次相遇
目录 题目: 题目描述: 题目链接: 思路: 自己的思路详解: 更好的思路详解: 代码: 自己的思路代码详解: 更好的思路代码详解: 题目: 题目描述…...
【2】CICD持续集成-k8s集群中安装Jenkins
一、背景: Jenkins是一款开源 CI&CD 系统,用于自动化各种任务,包括构建、测试和部署。 Jenkins官方提供了镜像:https://hub.docker.com/r/jenkins/jenkins 使用Deployment来部署这个镜像,会暴露两个端口ÿ…...
监控+日志=DevOps 运维的“千里眼”与“顺风耳”
监控+日志=DevOps 运维的“千里眼”与“顺风耳” 在 DevOps 体系中,监控和日志管理是不可或缺的运维基石。有人说,开发只管把代码写好,运维才是真正的“操盘手”,让系统稳定运行、不宕机、不崩溃。而要做到这一点,精准的监控与日志管理 是关键。 试想一下:如果没有监控…...
安卓的Launcher 在哪个环节进行启动
安卓Launcher在系统启动过程中的关键环节启动,具体如下: 内核启动:安卓设备开机后,首先由引导加载程序启动Linux内核。内核负责初始化硬件设备、建立内存管理机制、启动系统进程等基础工作,为整个系统的运行提供底层支…...
IDEA 创建Maven 工程(图文)
设置Maven 仓库 打开IDEA 开发工具,我的版本是2024.3.1(每个版本的位置不一样)。在【Customize】选项中,可以直接设置【语言】,在最下面选择【All setting】。 进入到熟悉的配置界面,选择配置的【setting…...
映射(Mapping)和地址(Address)
Addresses (地址) 以太坊区块链由 _ account _ (账户)组成,你可以把它想象成银行账户。一个帐户的余额是 以太 (在以太坊区块链上使用的币种),你可以和其他帐户之间支付和接受以太币,就像你的银…...
通过C# 将Excel表格转换为图片(JPG/ PNG)
Excel 表格可能会因为不同设备、不同软件版本或字体缺失等问题,导致格式错乱或数据显示异常。转换为图片后,能确保数据的排版、格式和外观始终保持一致,无论在何种设备或平台上查看,都能呈现出固定的样式,避免了因环境…...
国产紫光同创FPGA实现SDI视频编解码+图像缩放,基于HSSTHP高速接口,提供2套工程源码和技术支持
目录 1、前言工程概述免责声明 2、相关方案推荐我已有的所有工程源码总目录----方便你快速找到自己喜欢的项目本博已有的 SDI 编解码方案本方案在Xilinx--Artix7系列FPGA上的应用本方案在Xilinx--Kintex系列FPGA上的应用本方案在Xilinx--Zynq系列FPGA上的应用本方案在Xilinx--U…...
day46—双指针-两数之和-输入有序数组(LeetCode-167)
题目描述 给你一个下标从 1 开始的整数数组 numbers ,该数组已按 非递减顺序排列 ,请你从数组中找出满足相加之和等于目标数 target 的两个数。如果设这两个数分别是 numbers[index1] 和 numbers[index2] ,则 1 < index1 < index2 &l…...
自动驾驶安全模型研究
自动驾驶安全模型研究 自动驾驶安全模型研究 自动驾驶安全模型研究1.自动驾驶安全模型概述2. 自动驾驶安全模型应用3. 自动驾驶安全模型介绍3.1 Last Point to Steer3.2 Safety Zone3.3 RSS (Responsibility-Sensitive Safety)3.4 SFF (Safety Force Field)3.5 FSM (Fuzzy Safe…...
【项目】基于MCP+Tabelstore架构实现知识库答疑系统
基于MCPTabelstore架构实现知识库答疑系统 整体流程设计(一)Agent 架构(二)知识库存储(1)向量数据库Tablestore(2)MCP Server (三)知识库构建(1&a…...
当OCR遇上“幻觉”:如何让AI更靠谱地“看懂”文字?
在数字化的世界里,OCR(光学字符识别)技术就像给机器装上了“电子眼”。但当这项技术遇上大语言模型,一个意想不到的问题出现了——AI竟然会像人类一样产生“幻觉”。想象一下,当你拿着模糊的财务报表扫描件时ÿ…...
Docker用model.config部署及更新多个模型
步骤: 1、本地打包模型 2、编写model.config文件 3、使用 Docker 启动一个 TensorFlow Serving 容器 4、本地打包后的模型修改后,修改本地model.config,再同步更新容器的model.config 1、本地打包模型(本地路径) 2、…...
Linux kernel signal原理(下)- aarch64架构sigreturn流程
一、前言 在上篇中写到了linux中signal的处理流程,在do_signal信号处理的流程最后,会通过sigreturn再次回到线程现场,上篇文章中介绍了在X86_64架构下的实现,本篇中介绍下在aarch64架构下的实现原理。 二、sigaction系统调用 #i…...
matlab论文图一的地形区域图的球形展示Version_1
matlab论文图一的地形区域图的球形展示Version_1 图片 此图来源于: ![Jieqiong Zhou, Ziyin Wu, Dineng Zhao, Weibing Guan, Chao Zhu, Burg Flemming, Giant sand waves on the Taiwan Banks, southern Taiwan Strait: Distribution, morphometric relationship…...
发布一个npm包,更新包,删除包
发布一个npm包,更新包,删除包 如何将自己的项目 发布为一个 npm 包,并掌握 更新 和 删除 的操作流程。 🚀 一、发布一个 npm 包的完整流程 ✅ 1. 注册并登录 npm 账号 如果还没有账号,先注册: 官网注册&…...
Redis专题
前言 Redis的各种思想跟机组Cache和操作系统对进程的管理非常类似! 一:看到你的简历上写了你的项目里面用到了redis,为啥用redis? 因为传统的关系型数据库如Mysql,已经不能适用所有的场景,比如秒杀的库存扣减ÿ…...
LeetCode[232]用栈实现队列
思路: 一道很简单的题,就是栈是先进后出,队列是先进先出,用两个栈底相互对着,这样一个队列就产生了,右栈为空的情况,左栈栈底就是队首元素,所以我们需要将左栈全部压入右栈ÿ…...
Flask API 项目 Swagger 版本打架不兼容
Flask API 项目 Swagger 版本打架不兼容 1. 问题背景 在使用 Flask 3.0.0 时遇到以下问题: 安装 flask_restful_swagger 时,它强制将 Flask 降级到 1.1.4,并导致其他依赖(如 flask-sqlalchemy、flask-apispec)出现版…...
基于YOLOv11 和 ByteTrack 实现目标跟踪
介 绍 之前我们介绍了使用YOLOv9与 ByteTrack 结合进行对象跟踪的概念,展示了这两种强大的技术如何有效地协同工作。现在,让我们通过探索与 ByteTrack 结合的 YOLOv11 来进一步了解这一概念。 实战 | 基于YOLOv9和OpenCV实现车辆跟踪计数(步骤…...
