万字长文总结前端开发知识---JavaScriptVue3Axios
JavaScript学习目录
- 一、JavaScript
- 1. 引入方式
- 1.1 内部脚本 (Inline Script)
- 1.2 外部脚本 (External Script)
- 2. 基础语法
- 2.1 声明变量
- 2.2 声明常量
- 2.3 输出信息
- 3. 数据类型
- 3.1 基本数据类型
- 3.2 模板字符串
- 4. 函数
- 4.1 具名函数 (Named Function)
- 4.2 匿名函数 (Anonymous Function)
- 4.2.1 函数表达式
- 4.2.2 箭头函数 (Arrow Function)
- 5. 自定义对象
- 5.1 自定义对象
- 5.2 调用对象属性/方法
- 5.3 JSON - JS对象标记法
- 6. DOM
- 6.1 获取DOM对象
- 6.2 修改DOM对象的内容
- 6.3 其他常用的DOM操作方法
- 7. 事件监听
- 7.1 `addEventListener` 方法
- 7.2 传统`onclick`属性
- 7.3 事件处理的区别与选择
- 8. 常见事件
- 8.1 `type="module"`关键字
- 8.2 `export`关键字
- 8.3 `import`关键字
- 8.4 常见事件
- 8.4.1 鼠标事件
- 8.4.2 键盘事件
- 8.4.3 表单事件
- 8.4.4 焦点事件
- 8.4.5 其他事件
- 二、Vue
- 1. Vue快速入门
- 1.1 数据绑定
- 1.2 模块化脚本加载
- 1.3 响应式数据
- 1.4 应用实例创建与挂载
- 2. Vue生命周期
- 2.1 Vue生命周期的主要阶段
- 2.1.1 创建阶段 (Creation)
- 2.1.2 挂载阶段 (Mounting)
- 2.1.3 更新阶段 (Updating)
- 2.1.4 销毁阶段 (Destroying)
- 2.2 生命周期图示
- 2.3 使用场景
- 三、Axios
- 1. Axios快速入门
- 1.1 Axios GET请求
- 1.2 Axios POST请求
- 1.3 回调函数
- 2. Axios请求方式别名
- 四、案例---员工列表
- 1. Vue 关键知识点总结
- 1.1 `searchForm` 对象
- 1.2 `v-model` 指令
- 1.3 `v-on` 指令
- 1.4 `v-if` 和 `v-else-if` 指令
- 1.5 `v-show` 指令
- 1.6 `v-show` 与 `v-if` 的区别
- 1.7 `v-for` 指令
- 1.8 `async` 和 `await`
- 1.9 URL 解释
- 1.9.1 基础URL
- 1.9.2 查询参数
本文参考黑马程序员:全网首发AI+JavaWeb开发入门
一、JavaScript
1. 引入方式
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>JS-引入方式</title>
</head>
<body><!-- <script>//1. 内部脚本alert('Hello JS');</script> --><!-- 2. 外部脚本 --><script src="js/demo.js"></script>
</body>
</html>
js/demo.js
alert('Hello JavaScript');
1.1 内部脚本 (Inline Script)
- 内部脚本是直接嵌入到HTML文档中的JavaScript代码。
- 它们通常放在
<script>
标签内,可以放置在HTML文档的任何位置,但大多数情况下会放在<head>
或<body>
标签内。 - 在给定的代码示例中,内部脚本被注释掉了,因此不会被执行。如果取消注释,
alert('Hello JS');
这行代码将会创建一个弹窗,显示消息"Hello JS"。
1.2 外部脚本 (External Script)
- 外部脚本是将JavaScript代码保存在一个单独的
.js
文件中,并通过<script>
标签的src
属性来引用这个文件。 - 这种方法有助于保持HTML和JavaScript代码的分离,使得代码更易于维护和重用。
- 在示例中,
<script src="js/demo.js"></script>
这行代码用来加载位于相对路径js/demo.js
的外部JavaScript文件。这意味着HTML文档所在的目录下应该有一个名为js
的子目录,其中包含了一个名为demo.js
的文件。 - 使用外部脚本还可以让浏览器缓存JavaScript文件,从而加快页面加载速度,特别是在用户访问同一网站的多个页面时。
2. 基础语法
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>JS-基础语法</title>
</head>
<body><script>//1. 声明变量// let a = 10;// a = "Hello";// a = true;// alert(a); //弹出框//2. 声明常量const PI = 3.14;//PI = 5.0;console.log(PI); //输出到控制台// document.write(PI); //输出到body区域(不常用)</script>
</body>
</html>
2.1 声明变量
- 在JavaScript中,可以使用
let
关键字来声明变量。let
允许你声明一个块级作用域的局部变量。 - 变量可以在声明后被重新赋值。在给定的代码示例中,变量
a
被注释掉了,但是按照其设计,它最初被赋予了一个数值10
,然后又被赋予了字符串"Hello"
,最后是布尔值true
。这展示了JavaScript是一种动态类型语言,变量可以在不同的时间点持有不同类型的值。
2.2 声明常量
- 使用
const
关键字可以声明一个常量,意味着这个变量一旦被赋值,就不能再改变它的值。这并不意味着const
定义的对象或数组的内容不可变,只是不能重新赋值给该常量引用。 - 在代码示例中,常量
PI
被赋予了值3.14
。如果尝试再次为PI
赋值(如PI = 5.0;
),将会导致错误,因为这是不允许的操作。
2.3 输出信息
alert()
函数用于创建一个弹窗,向用户显示一条消息。此功能在示例中被注释掉了。console.log()
方法用于将信息输出到浏览器的开发者工具中的控制台,这对于调试非常有用。document.write()
方法可以用来直接向文档写入文本字符串。这种方法在现代开发中不常用,因为它会覆盖页面上的现有内容,并且只能在页面加载期间使用。
3. 数据类型
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>JS-数据类型</title>
</head>
<body><script>//1. 数据类型// alert(typeof 10); //number// alert(typeof 1.5); //number// alert(typeof true); //boolean// alert(typeof false); //boolean// alert(typeof "Hello"); //string// alert(typeof 'JS'); //string// alert(typeof `JavaScript`); //string// alert(typeof null); //null ? -> object// let a ;// alert(typeof a); //undefined//2. 模板字符串 - 简化字符串拼接let name = 'Tom';let age = 18;console.log('我是'+name+', 我今年'+age+'岁');console.log(`我是${name}, 我今年${age}岁`);</script>
</body>
</html>
3.1 基本数据类型
-
JavaScript中有几种基本的数据类型,包括
number
、boolean
、string
、null
、undefined
等。-
number
: 用于表示数值,包括整数(如10
)和浮点数(如1.5
)。在JavaScript中,所有的数字都是以64位浮点数格式存储的。 -
boolean
: 表示逻辑值,只有两个值:true
和false
。 -
string
: 用于表示文本,可以使用单引号(‘…’)、双引号(“…”)或反引号(...
)来定义字符串。 -
null
: 表示一个空值或不存在的对象,在技术上它是一个对象类型的特殊值,虽然这在语义上可能有些混淆。 -
undefined
: 当声明了一个变量但没有赋值时,默认的值就是undefined
。它也用来表示某个变量或属性不存在。
-
3.2 模板字符串
- 模板字符串是增强版的字符串,允许嵌入表达式。它们使用反引号(
`
)来包裹,并且可以在其中直接插入变量和表达式,通过${expression}
语法。 - 使用模板字符串可以简化字符串拼接,使得代码更易读和编写。例如,
console.log(我是${name}, 我今年${age}岁); 这行代码会输出 "我是Tom, 我今年18岁;"
,其中${name}
和${age}
会被相应的变量值替换。
typeof
运算符:typeof
是一个运算符,返回一个字符串,表示操作数的数据类型。上面的注释部分展示了如何使用typeof
来检查不同类型的值。
注意事项:
- 注意到
typeof null
返回的是"object"
,这是一个历史遗留问题,是因为JavaScript最初实现上的一个错误,但它一直保留至今以保持向后兼容性。
4. 函数
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>JS-函数</title>
</head>
<body><script>//1. 函数定义及调用 - 具名函数// function add(a,b){// return a + b;// }// let result = add(10,20);// console.log(result);//2. 函数定义及调用 - 匿名函数//2.1 函数表达式// let add = function(a,b){// return a + b;// }// let result = add(100,200);// console.log(result);//2.2 箭头函数let add = (a,b) => {return a + b;}let result = add(1000,2000);console.log(result);</script>
</body>
</html>
4.1 具名函数 (Named Function)
- 具名函数是使用
function
关键字定义,并且具有一个明确的名字。这个名称可以在函数内部用于递归调用,也可以在调试或堆栈跟踪时提供有用的上下文信息。 - 在示例中,
add
函数接收两个参数a
和b
,并返回它们的和。虽然这部分被注释掉了,但其目的是展示如何定义和调用一个具名函数。
4.2 匿名函数 (Anonymous Function)
- 匿名函数是没有名字的函数。它们通常作为函数表达式来使用,可以赋值给变量、作为参数传递给其他函数,或者立即执行(IIFE)。
4.2.1 函数表达式
- 函数表达式是将匿名函数赋值给一个变量的方式。这使得函数可以通过该变量名进行调用。
- 示例中的
add
变量指向了一个匿名函数,该匿名函数接收两个参数并返回它们的和。通过add(100,200)
调用它,结果为300。
4.2.2 箭头函数 (Arrow Function)
- 箭头函数是ES6引入的一种更简洁的函数书写方式。它们有较短的语法并且不会绑定自己的
this
,arguments
,super
,或new.target
。 - 在代码示例中,
add
是一个箭头函数,它同样接收两个参数并返回它们的和。这里使用了大括号{}
来包裹函数体,因为函数体内有多行代码或需要显式地返回一个值。 - 如果箭头函数只有一行代码,可以直接省略大括号和
return
关键字。例如:let add = (a, b) => a + b;
5. 自定义对象
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>JS-函数</title>
</head>
<body><script>//1. 自定义对象// let user = {// name: 'Tom',// age: 18,// gender: '男',// sing: function(){// alert(this.name + '悠悠的唱着最炫的民族风~')// }// }//let user = {// name: 'Tom',// age: 18,// gender: '男',// sing(){// alert(this.name + '悠悠的唱着最炫的民族风~')// }//}// let user = {// name: 'Tom',// age: 18,// gender: '男',// sing: () => { //注意: 在箭头函数中, this并不指向当前对象 - 指向的是当前对象的父级 【不推荐】// alert(this + ':悠悠的唱着最炫的民族风~')// }// }//2. 调用对象属性/方法//alert(user.name);//user.sing();//3. JSON - JS对象标记法let person = {name: 'itcast',age: 18,gender: '男'}alert(JSON.stringify(person)); //js对象 --> json字符串let personJson = '{"name": "heima", "age": 18}';alert(JSON.parse(personJson).name);</script>
</body>
</html>
5.1 自定义对象
- 在JavaScript中,可以使用对象字面量的方式创建对象。对象是一组无序的键值对集合,其中键是字符串(或符号),值可以是任何有效的JavaScript数据类型,包括函数。
- 对象的方法可以通过两种方式定义:传统函数表达式和简化的ES6语法(去掉
function
关键字)。但是要注意,在箭头函数中,this
关键字的行为与常规函数不同,它不会绑定到当前对象,而是继承自外层作用域,因此在对象方法中通常不推荐使用箭头函数来定义方法。
5.2 调用对象属性/方法
- 可以通过点
.
操作符访问对象的属性或调用其方法。例如,user.name
会返回用户的名字,而user.sing()
将执行sing
方法,并弹出一个带有消息的对话框。
5.3 JSON - JS对象标记法
-
JSON是一种轻量级的数据交换格式,易于人类阅读和编写,同时也易于机器解析和生成。它基于JavaScript编程语言的一个子集。
-
JSON.stringify()
方法用于将JavaScript对象转换为JSON字符串。这在需要发送数据给服务器或存储时非常有用。alert(JSON.stringify(person)); // 将 person 对象转换为 JSON 字符串并显示
-
JSON.parse()
方法用于解析JSON字符串,构造由字符串描述的JavaScript值或对象。这在接收来自服务器的数据或从存储中读取时非常有用。alert(JSON.parse(personJson).name); // 解析 JSON 字符串并访问 name 属性
6. DOM
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>JS-DOM</title>
</head>
<body><h1 id="title1">11111</h1><h1>22222</h1><h1>33333</h1><script>//1. 修改第一个h1标签中的文本内容//1.1 获取DOM对象// let h1 = document.querySelector('#title1');//let h1 = document.querySelector('h1'); // 获取第一个h1标签let hs = document.querySelectorAll('h1');//1.2 调用DOM对象中属性或方法hs[0].innerHTML = '修改后的文本内容';</script>
</body>
</html>
6.1 获取DOM对象
document.querySelector
方法用于返回文档中与指定的选择器或选择器组匹配的第一个Element节点,如果没有任何匹配,则返回null。- 使用ID选择器:
document.querySelector('#title1')
会选取具有id="title1"
的元素。 - 使用标签名选择器:
document.querySelector('h1')
会选择文档中的第一个<h1>
元素。
- 使用ID选择器:
document.querySelectorAll
方法用于返回一个静态(不是实时更新)的NodeList对象,包含文档中所有与指定的选择器或选择器组匹配的元素。
6.2 修改DOM对象的内容
- 在代码示例中,通过
querySelectorAll('h1')
获取了所有的<h1>
元素,并存储在变量hs
中。然后通过访问hs[0]
来定位到第一个<h1>
元素,并使用innerHTML
属性设置其新的文本内容为“修改后的文本内容”。 innerHTML
属性可以用来读取或设置元素的内容,包括HTML标记。如果只想修改纯文本而不涉及HTML结构,可以使用textContent
属性。
6.3 其他常用的DOM操作方法
getElementById(id)
:通过元素的ID获取单个元素。getElementsByClassName(name)
:通过类名获取一组元素。getElementsByTagName(name)
:通过标签名获取一组元素。appendChild(child)
:向节点添加子节点。removeChild(child)
:从节点中移除子节点。insertBefore(newElement, referenceElement)
:在参考元素之前插入新元素。setAttribute(name, value)
和getAttribute(name)
:分别为设置和获取元素的属性值。
7. 事件监听
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>JS事件</title>
</head>
<body><input type="button" id="btn1" value="点我一下试试1"><input type="button" id="btn2" value="点我一下试试2"><script>//事件监听 - addEventListener (可以多次绑定同一事件)document.querySelector('#btn1').addEventListener('click', () => {console.log('试试就试试~~');});document.querySelector('#btn1').addEventListener('click', () => {console.log('试试就试试22~~');});//事件绑定-早期写法 - onclick (如果多次绑定同一事件, 覆盖) - 了解document.querySelector('#btn2').onclick = () => {console.log('试试就试试~~');}document.querySelector('#btn2').onclick = () => {console.log('试试就试试22~~');}</script>
</body>
</html>
7.1 addEventListener
方法
addEventListener
是现代推荐的方式来为DOM元素添加事件监听器。它允许你为同一个事件类型(如点击事件)绑定多个不同的处理函数,而不会相互覆盖。- 在示例中,
#btn1
按钮通过addEventListener
方法绑定了两个点击事件处理函数。当点击#btn1
时,这两个函数都会被执行,依次输出“试试就试试~~”和“试试就试试22~~”。
7.2 传统onclick
属性
- 早期的事件绑定方式是直接设置元素的
onclick
属性。这种方式只能为一个元素的特定事件指定一个处理函数;如果再次为同一事件设置onclick
,则会覆盖之前的定义。 - 示例中的
#btn2
按钮使用了onclick
属性来绑定点击事件处理函数。由于第二次赋值覆盖了第一次的赋值,因此只有最后一个绑定的处理函数会被执行,即只会输出“试试就试试22~~”。
7.3 事件处理的区别与选择
- 使用
addEventListener
可以更灵活地管理事件,特别是当你需要在不同地方或时间点添加多个事件处理器时。此外,它还支持事件捕获阶段和冒泡阶段的选择,提供了更多的控制。 - 而
onclick
等内联事件处理程序较为简单直接,但在复杂的应用中可能会导致代码难以维护,并且容易被后续的脚本覆盖。
8. 常见事件
<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>JS-事件-常见事件</title>
</head><body><form action="" style="text-align: center;"><input type="text" name="username" id="username"><input type="text" name="age" id="age"><input id="b1" type="submit" value="提交"><input id="b2" type="button" value="单击事件"></form><br><br><br><table width="800px" border="1" cellspacing="0" align="center"><tr><th>学号</th><th>姓名</th><th>分数</th><th>评语</th></tr><tr align="center"><td>001</td><td>张三</td><td>90</td><td>很优秀</td></tr><tr align="center" id="last"><td>002</td><td>李四</td><td>92</td><td>优秀</td></tr></table><!-- type="module" 模块化JS --><script src="./js/eventDemo.js" type="module"></script>
</body></html>
8.1 type="module"
关键字
该部分代码有如下结构
项目根目录
├── 常见事件.html
└── js├── eventDemo.js└── utils.js
通过 type="module"
,我们可以创建一个清晰的模块系统,其中各个模块可以相互依赖,形成一层层的调用关系。浏览器能够智能地解析这些依赖关系,确保所有必要的模块都被正确加载和执行。这种方式不仅提高了代码的可维护性和复用性,还允许开发者利用现代JavaScript的强大功能来构建更加复杂的应用程序。
./utils.js
export function printLog(msg){console.log(msg);
}
8.2 export
关键字
export
关键字:允许你将函数、变量或类从当前模块中暴露出去,以便其他模块可以通过import
语句来使用它们。- 在这段代码中,
printLog
函数被定义并立即通过export
关键字导出,这意味着任何导入此模块的地方都可以访问到printLog
函数。
./js/eventDemo.js
import { printLog } from "./utils.js";//click: 鼠标点击事件
document.querySelector('#b2').addEventListener('click', () => {printLog("我被点击了...");
})//mouseenter: 鼠标移入
document.querySelector('#last').addEventListener('mouseenter', () => {printLog("鼠标移入了...");
})//mouseleave: 鼠标移出
document.querySelector('#last').addEventListener('mouseleave', () => {printLog("鼠标移出了...");
})//keydown: 某个键盘的键被按下
document.querySelector('#username').addEventListener('keydown', () => {printLog("键盘被按下了...");
})//keyup: 某个键盘的键被抬起
document.querySelector('#username').addEventListener('keyup', () => {printLog("键盘被抬起了...");
})//blur: 失去焦点事件
document.querySelector('#age').addEventListener('blur', () => {printLog("失去焦点...");
})//focus: 元素获得焦点
document.querySelector('#age').addEventListener('focus', () => {printLog("获得焦点...");
})//input: 用户输入时触发
document.querySelector('#age').addEventListener('input', () => {printLog("用户输入时触发...");
})//submit: 提交表单事件
document.querySelector('form').addEventListener('submit', () => {alert("表单被提交了...");
})
8.3 import
关键字
import
语句:用来从其他模块导入所需的函数、对象或原始值。这里的import { printLog } from "./utils.js";
是从./utils.js
文件中导入一个名为printLog
的函数。{}
花括号:表示只导入特定的导出项。如果要导入整个模块的所有导出项,可以省略花括号并使用星号*
加上一个别名,例如import * as utils from "./utils.js";
。
8.4 常见事件
8.4.1 鼠标事件
click
: 当用户点击某个元素时触发,是最常用的鼠标事件之一。dblclick
: 双击事件。mouseover
和mouseout
: 分别当鼠标指针进入和离开元素时触发。mousedown
和mouseup
: 分别在按下和释放鼠标按钮时触发。
8.4.2 键盘事件
keydown
和keyup
: 分别在按键被按下和释放时触发。keypress
: 当字符键被按下时触发(已废弃,在现代开发中不推荐使用)。
8.4.3 表单事件
submit
: 当用户提交表单时触发。可以用来验证表单数据或阻止默认的提交行为。input
和change
: 分别在输入框内容变化时(实时)和失去焦点时触发,适用于表单元素如文本框、下拉列表等。focus
和blur
: 分别在元素获得焦点和失去焦点时触发。
8.4.4 焦点事件
focusin
: 当元素即将获得焦点时触发,并且此事件会冒泡。可以在父级元素上监听focusin来响应任何子元素获得焦点的情况。focus
: 当用户通过点击、键盘导航或脚本使一个元素获得焦点时触发。常用于表单元素如输入框、文本区域等,以检测用户的交互。blur
: 当元素失去焦点时触发。与focus事件相对,它标志着用户已经结束了对该元素的操作或离开了该元素。
8.4.5 其他事件
load
: 页面加载完成后触发。resize
: 窗口大小改变时触发。scroll
: 页面滚动时触发。
二、Vue
Vue.js 是一个用于构建用户界面的渐进式 JavaScript 框架,旨在通过简洁的 API 实现响应式的数据绑定和组件化的视图管理。它允许开发者创建可复用的组件,并通过声明式渲染将数据动态地绑定到DOM元素上。Vue 的核心库专注于视图层,但其生态系统包括了路由(Vue Router)、状态管理(Vuex)等强大工具,支持从简单的单页面应用到复杂的大规模应用开发。Vue 以其易学易用、灵活性高和性能优越而著称,使其成为现代前端开发中非常受欢迎的选择。与传统的 MVC 框架相比,Vue 更加轻量且易于集成到现有项目中。
1. Vue快速入门
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Vue-快速入门</title>
</head>
<body><div id="app"><h1>{{message}}</h1><h1>{{count}}</h1></div><script type="module">import { createApp } from 'https://unpkg.com/vue@3/dist/vue.esm-browser.js';createApp({data() {return {message: 'Hello Vue',count: 100}}}).mount('#app');</script>
</body>
</html>
1.1 数据绑定
- 插值表达式:
- 使用双大括号语法
{{ }}
绑定数据属性到HTML中。例如,<h1>{{ message }}</h1>
会显示message
的值。
- 使用双大括号语法
1.2 模块化脚本加载
- ES模块:
- 使用
<script type="module">
标签来加载脚本,并通过import
语句从CDN引入Vue 3库文件。
- 使用
1.3 响应式数据
- 响应式数据对象:
- 在
data()
方法中返回的对象中的所有属性都是响应式的。这意味着当这些属性的值发生变化时,Vue会自动更新相关的视图部分。
- 在
1.4 应用实例创建与挂载
- 创建Vue应用实例:
- 使用
createApp({...})
创建一个新的Vue应用实例,并通过.mount('#app')
将其挂载到指定的DOM元素上。
- 使用
2. Vue生命周期
Vue 的生命周期是指 Vue 实例从创建到销毁所经历的一系列阶段。每个阶段都有特定的钩子函数(Lifecycle Hooks),允许开发者在这些关键点插入自定义逻辑,如初始化数据、响应状态变化或清理资源等。理解 Vue 的生命周期对于开发高效且可维护的应用至关重要。
2.1 Vue生命周期的主要阶段
2.1.1 创建阶段 (Creation)
beforeCreate
:实例刚刚被创建,但尚未开始初始化属性(如data
和methods
)。此时,实例还不能访问 DOM 或者响应式数据。created
:实例已完成数据观测和事件配置,但尚未挂载到 DOM 上。这是发起网络请求、设置定时器或执行其他初始化操作的好时机。
2.1.2 挂载阶段 (Mounting)
beforeMount
:模板编译完成,虚拟 DOM 创建完毕,但还没有渲染到真实 DOM 中。可以在这个阶段做一些准备工作,比如预加载资源。mounted
:实例已经被挂载到真实的 DOM 中,所有的指令和组件都已经解析并应用。现在你可以安全地操作 DOM 元素了。这也是一个常用的钩子来启动动画效果或与第三方库集成。
2.1.3 更新阶段 (Updating)
beforeUpdate
:当响应式数据发生变化时触发,但在新旧 DOM 被替换之前。这里适合进行一些基于旧状态的操作。updated
:DOM 已经根据最新的数据进行了更新。需要注意的是,在这个钩子中再次修改状态可能会导致无限循环的更新。
2.1.4 销毁阶段 (Destroying)
beforeUnmount
:实例即将被销毁,所有绑定的事件监听器和子组件都将被移除,但此时实例仍然完全可用。可以在此处执行清理工作,例如取消订阅外部服务或清除定时器。unmounted
:实例已经完全销毁,所有相关的资源都被释放。之后不能再访问该实例。
2.2 生命周期图示
下图展示了 Vue 实例的生命周期:
+-------------------+ +-------------------+
| beforeCreate | ----> | created |
+-------------------+ +-------------------+| |v v
+-------------------+ +-------------------+
| beforeMount | ----> | mounted |
+-------------------+ +-------------------+| |v v
+-------------------+ +-------------------+
| beforeUpdate | <---- | updated |
+-------------------+ +-------------------+| |v v
+-------------------+ +-------------------+
| beforeUnmount | ----> | unmounted |
+-------------------+ +-------------------+
2.3 使用场景
- 数据初始化:可以在
created
阶段进行数据的初始化,例如发起网络请求获取初始数据。 - DOM 操作:利用
mounted
阶段进行需要 DOM 元素的操作,比如绑定事件监听器。 - 清理工作:在
beforeUnmount
阶段执行一些清理工作,如清除定时器、取消订阅等。
三、Axios
Axios 是一个基于 Promise 的 HTTP 客户端,适用于浏览器和 Node.js,用于发起异步 HTTP 请求。它提供了简洁的 API 来处理请求和响应,并支持诸如拦截请求和响应、自动转换 JSON 数据等功能。与传统的 AJAX(通过 XMLHttpRequest 实现)相比,Axios 更加现代化且易于使用,减少了样板代码并提高了可读性。
1. Axios快速入门
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Ajax-Axios</title>
</head>
<body><input type="button" value="获取数据GET" id="btnGet"><input type="button" value="操作数据POST" id="btnPost"><script src="js/axios.js"></script><script>//发送GET请求document.querySelector('#btnGet').addEventListener('click', () => {//axios发起异步请求axios({url: 'https://mock.apifox.cn/m1/3083103-0-default/emps/list',method: 'GET'}).then((result) => { //成功回调函数console.log(result.data);}).catch((err) => { //失败回调函数console.log(err);})})//发送POST请求document.querySelector('#btnPost').addEventListener('click', () => {//axios发起异步请求axios({url: 'https://mock.apifox.cn/m1/3083103-0-default/emps/update',method: 'POST',data: 'id=1' //POST请求方式 , 请求体}).then((result) => { //成功回调函数console.log(result.data);}).catch((err) => { //失败回调函数console.log(err);})})</script>
</body>
</html>
1.1 Axios GET请求
- 当用户点击“获取数据GET”按钮时,将触发一个GET请求,从指定URL
https://mock.apifox.cn/m1/3083103-0-default/emps/list
获取数据。 - 请求成功后,结果会打印在控制台上。
1.2 Axios POST请求
- 当用户点击“操作数据POST”按钮时,将触发一个POST请求到
https://mock.apifox.cn/m1/3083103-0-default/emps/update
。 - 在这个例子中,POST请求携带的数据为
'id=1'
,表示这是一个简单的键值对数据。 - 同样地,如果请求成功,结果也会打印在控制台上。
1.3 回调函数
- 成功回调函数 (
then
): 处理成功的请求,提供对响应数据的访问。 - 失败回调函数 (
catch
): 处理请求中的错误,帮助识别和处理不同类型的错误。
2. Axios请求方式别名
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Ajax-Axios</title>
</head>
<body><input type="button" value="获取数据GET" id="btnGet"><input type="button" value="操作数据POST" id="btnPost"><script src="js/axios.js"></script><script>//发送GET请求document.querySelector('#btnGet').addEventListener('click', () => {axios.get('https://mock.apifox.cn/m1/3083103-0-default/emps/list').then((result) => {console.log(result.data);});console.log('==========================');})//发送POST请求document.querySelector('#btnPost').addEventListener('click', () => {axios.post('https://mock.apifox.cn/m1/3083103-0-default/emps/update', 'id=1').then((result) => {console.log(result.data);});})</script>
</body>
</html>
Axios 提供了多种请求方式的别名方法,使开发者能够方便地发送不同类型的HTTP请求。通过使用这些别名方法,可以简化代码并提高可读性。以下是常见的请求方式别名及其用途:
axios.get(url[, config])
: 发送GET请求。axios.post(url[, data[, config]])
: 发送POST请求。axios.put(url[, data[, config]])
: 发送PUT请求。axios.delete(url[, config])
: 发送DELETE请求。axios.head(url[, config])
: 发送HEAD请求。axios.options(url[, config])
: 发送OPTIONS请求。axios.patch(url[, data[, config]])
: 发送PATCH请求。
四、案例—员工列表
<!DOCTYPE html>
<html lang="zh-CN">
<head><meta charset="UTF-8"><title>Tlias智能学习辅助系统</title><style>/* 导航栏样式 */.navbar {background-color: #b5b3b3; /* 灰色背景 */display: flex; /* flex弹性布局 */justify-content: space-between; /* 左右对齐 */padding: 10px; /* 内边距 */align-items: center; /* 垂直居中 */}.navbar h1 {margin: 0; /* 移除默认的上下外边距 */font-weight: bold; /* 加粗 */color: white;/* 设置字体为楷体 */font-family: "楷体";}.navbar a {color: white; /* 链接颜色为白色 */text-decoration: none; /* 移除下划线 */}/* 搜索表单样式 */.search-form {display: flex;flex-wrap: nowrap;align-items: center;gap: 10px; /* 控件之间的间距 */margin: 20px 0;}.search-form input[type="text"], .search-form select {padding: 5px; /* 输入框内边距 */width: 260px; /* 宽度 */}.search-form button {padding: 5px 15px; /* 按钮内边距 */}/* 表格样式 */table {width: 100%;border-collapse: collapse;}th, td {border: 1px solid #ddd; /* 边框 */padding: 8px; /* 单元格内边距 */text-align: center; /* 左对齐 */}th {background-color: #f2f2f2;font-weight: bold;}.avatar {width: 30px;height: 30px;}/* 页脚样式 */.footer {background-color: #b5b3b3; /* 灰色背景 */color: white; /* 白色文字 */text-align: center; /* 居中文本 */padding: 10px 0; /* 上下内边距 */margin-top: 30px;}#container {width: 80%; /* 宽度为80% */margin: 0 auto; /* 水平居中 */}</style>
</head>
<body><div id="container"><!-- 顶部导航栏 --><div class="navbar"><h1>Tlias智能学习辅助系统</h1><a href="#">退出登录</a></div><!-- 搜索表单区域 --><form class="search-form"><label for="name">姓名:</label><input type="text" id="name" name="name" v-model="searchForm.name" placeholder="请输入姓名"><label for="gender">性别:</label><select id="gender" name="gender" v-model="searchForm.gender"><option value=""></option><option value="1">男</option><option value="2">女</option></select><label for="position">职位:</label><select id="position" name="position" v-model="searchForm.job"><option value=""></option><option value="1">班主任</option><option value="2">讲师</option><option value="3">学工主管</option><option value="4">教研主管</option><option value="5">咨询师</option></select><button type="button" v-on:click="search">查询</button><button type="button" @click="clear">清空</button></form><!-- 表格展示区 --><table><!-- 表头 --><thead><tr><th>序号</th><th>姓名</th><th>性别</th><th>头像</th><th>职位</th><th>入职日期</th><th>最后操作时间</th><th>操作</th></tr></thead><!-- 表格主体内容 --><tbody><tr v-for="(e, index) in empList" :key="e.id"><td>{{index + 1}}</td><td>{{e.name}}</td><td>{{e.gender == 1?'男' : '女'}}</td><!-- 插值表达式是不能出现在标签内部 --><td><img class="avatar" v-bind:src="e.image" :alt="e.name"></td><!-- v-if: 控制元素的显示与隐藏 --><td><span v-if="e.job == 1">班主任</span><span v-else-if="e.job == 2">讲师</span><span v-else-if="e.job == 3">学工主管</span><span v-else-if="e.job == 4">教研主管</span><span v-else-if="e.job == 5">咨询师</span><span v-else>其他</span></td><!-- v-show: 控制元素的显示与隐藏 --><!-- <td><span v-show="e.job == 1">班主任</span><span v-show="e.job == 2">讲师</span><span v-show="e.job == 3">学工主管</span><span v-show="e.job == 4">教研主管</span><span v-show="e.job == 5">咨询师</span></td> --><td>{{e.entrydate}}</td><td>{{e.updatetime}}</td><td class="action-buttons"><button type="button">编辑</button><button type="button">删除</button></td></tr></tbody></table><!-- 页脚版权区域 --><footer class="footer"><p>江苏传智播客教育科技股份有限公司</p><p>版权所有 Copyright 2006-2024 All Rights Reserved</p></footer></div><script src="js/axios.js"></script><script type="module">import { createApp } from 'https://unpkg.com/vue@3/dist/vue.esm-browser.js'createApp({data() {return {searchForm: { //封装用户输入的查询条件name: '',gender: '',job: ''},empList: []}},//方法methods: {async search(){// 发送ajax请求,获取数据// axios.get(`https://web-server.itheima.net/emps/list?name=${this.searchForm.name}&gender=${this.searchForm.gender}&job=${this.searchForm.job}`).then((result) => {// this.empList = result.data.data;// })// console.log('===========================');let result = await axios.get(`https://web-server.itheima.net/emps/list?name=${this.searchForm.name}&gender=${this.searchForm.gender}&job=${this.searchForm.job}`);this.empList = result.data.data;},clear(){//清空表单项数据this.searchForm = {name:'', gender:'', job:''}this.search()}},//钩子函数mounted(){//页面加载完成之后,发送ajax请求,获取数据this.search()}}).mount('#container')</script></body>
</html>
https://web-server.itheima.net/emps/list
{"code": 1,"msg": "success","data": [{"id": 1,"name": "谢逊","image": "https://web-framework.oss-cn-hangzhou.aliyuncs.com/2023/4.jpg","gender": 1,"job": 1,"entrydate": "2023-06-09","updatetime": "2023-07-01 00:00:00"},{"id": 2,"name": "韦一笑","image": "https://web-framework.oss-cn-hangzhou.aliyuncs.com/2023/1.jpg","gender": 1,"job": 1,"entrydate": "2023-06-09","updatetime": "2023-07-01 00:00:00"},{"id": 3,"name": "黛绮丝","image": "https://web-framework.oss-cn-hangzhou.aliyuncs.com/2023/2.jpg","gender": 2,"job": 2,"entrydate": "2023-06-09","updatetime": "2023-07-01 00:00:00"},{"id": 4,"name": "殷天正","image": "https://web-framework.oss-cn-hangzhou.aliyuncs.com/2023/3.jpg","gender": 1,"job": 3,"entrydate": "2023-06-09","updatetime": "2023-07-01 00:00:00"}]
}
根据你提供的代码,以下是关于Vue的关键知识点总结,包括searchForm
、v-model
、v-on
、v-if
、v-for
、async
和await
的详细解释:
1. Vue 关键知识点总结
1.1 searchForm
对象
- 用途: 封装用户在搜索表单中输入的查询条件。
- 定义:
data() {return {searchForm: { // 封装用户输入的查询条件name: '',gender: '',job: ''},empList: []} }
- 作用: 在Vue实例的数据对象中定义
searchForm
,用于存储用户的输入值,并通过v-model
指令将其与表单元素绑定。
1.2 v-model
指令
- 用途: 实现双向数据绑定,将表单元素的值与Vue实例中的数据属性同步。
- 示例:
<input type="text" id="name" name="name" v-model="searchForm.name" placeholder="请输入姓名"> <select id="gender" name="gender" v-model="searchForm.gender"><option value=""></option><option value="1">男</option><option value="2">女</option> </select> <select id="position" name="position" v-model="searchForm.job"><option value=""></option><option value="1">班主任</option><option value="2">讲师</option><!-- 其他选项 --> </select>
- 作用: 当用户在表单元素中输入或选择内容时,
v-model
会自动更新对应的Vue实例数据属性;反之亦然。
1.3 v-on
指令
- 用途: 绑定事件监听器,处理用户的交互行为。
- 示例:
<button type="button" v-on:click="search">查询</button> <button type="button" @click="clear">清空</button>
- 作用:
v-on:click="search"
:当点击按钮时,调用search
方法。@click="clear"
:简写形式,功能同上。@
是v-on:
的缩写。
1.4 v-if
和 v-else-if
指令
- 用途: 条件渲染,根据表达式的值决定是否渲染元素。
- 示例:
<td><span v-if="e.job == 1">班主任</span><span v-else-if="e.job == 2">讲师</span><span v-else-if="e.job == 3">学工主管</span><span v-else-if="e.job == 4">教研主管</span><span v-else-if="e.job == 5">咨询师</span><span v-else>其他</span> </td>
- 作用: 根据
e.job
的值,显示相应的职位名称。如果e.job
为1,则显示“班主任”,依此类推。
好的,让我们通过你提供的注释代码片段来详细解释 v-show
指令,并说明它与 v-if
的区别。
1.5 v-show
指令
- 用途: 根据表达式的值动态地显示或隐藏元素。
- 示例:
<td><span v-show="e.job == 1">班主任</span><span v-show="e.job == 2">讲师</span><span v-show="e.job == 3">学工主管</span><span v-show="e.job == 4">教研主管</span><span v-show="e.job == 5">咨询师</span> </td>
- 作用: 通过 CSS 的 display 属性控制元素的显示和隐藏,适用于需要频繁切换显示状态的场景。
1.6 v-show
与 v-if
的区别
-
v-show
:- 只是通过 CSS 的
display
属性来控制元素的显示和隐藏。 - 元素始终存在于 DOM 中,只是在需要时通过
display: none;
来隐藏。 - 适用于需要频繁切换显示状态的场景,因为其性能开销较小。
- 只是通过 CSS 的
-
v-if
:- 根据条件决定是否渲染元素到 DOM 中。
- 如果条件为假,元素将不会被渲染到 DOM 中;如果条件为真,则会渲染。
- 适用于不经常切换显示状态的场景,因为它涉及到 DOM 的增删操作,性能开销较大。
1.7 v-for
指令
- 用途: 列表渲染,用于循环生成DOM元素。
- 示例:
<tr v-for="(e, index) in empList" :key="e.id"><td>{{index + 1}}</td><td>{{e.name}}</td><td>{{e.gender == 1 ? '男' : '女'}}</td><td><img class="avatar" v-bind:src="e.image" :alt="e.name"></td><!-- 职位显示部分 --><td>{{e.entrydate}}</td><td>{{e.updatetime}}</td><td class="action-buttons"><button type="button">编辑</button><button type="button">删除</button></td> </tr>
- 作用: 遍历
empList
数组,为每个员工生成一行表格数据。:key="e.id"
确保每个元素都有一个唯一的标识符,便于Vue进行高效的DOM更新。
1.8 async
和 await
- 用途: 处理异步操作,使代码看起来更简洁和易于理解。
- 示例:
methods: {async search(){let result = await axios.get(`https://web-server.itheima.net/emps/list?name=${this.searchForm.name}&gender=${this.searchForm.gender}&job=${this.searchForm.job}`);this.empList = result.data.data;},clear(){this.searchForm = {name:'', gender:'', job:''};this.search();} }, mounted(){this.search(); }
- 作用:
async search()
:定义一个异步函数,允许使用await
关键字等待异步操作完成。let result = await axios.get(...)
:等待axios.get
请求完成,并将结果赋值给result
变量。mounted()
钩子函数:在组件挂载完成后自动调用search
方法,加载初始数据。
1.9 URL 解释
https://web-server.itheika.net/emps/list?name=${this.searchForm.name}&gender=${this.searchForm.gender}&job=${this.searchForm.job}
1.9.1 基础URL
https://web-server.itheima.net/emps/list
: 这是API的端点,用于获取员工列表数据。
1.9.2 查询参数
-
?
: 表示开始传递查询参数。 -
name=${this.searchForm.name}
:name
是查询参数名。${this.searchForm.name}
是用户在搜索表单中输入的姓名。例如,如果用户输入“张三”,则这部分变为name=张三
。
-
&
: 分隔不同的查询参数。 -
gender=${this.searchForm.gender}
:gender
是查询参数名。${this.searchForm.gender}
是用户选择的性别。例如,如果用户选择“男”(假设值为1),则这部分变为gender=1
。
-
job=${this.searchForm.job}
:job
是查询参数名。${this.searchForm.job}
是用户选择的职位。例如,如果用户选择“班主任”(假设值为1),则这部分变为job=1
。
相关文章:
万字长文总结前端开发知识---JavaScriptVue3Axios
JavaScript学习目录 一、JavaScript1. 引入方式1.1 内部脚本 (Inline Script)1.2 外部脚本 (External Script) 2. 基础语法2.1 声明变量2.2 声明常量2.3 输出信息 3. 数据类型3.1 基本数据类型3.2 模板字符串 4. 函数4.1 具名函数 (Named Function)4.2 匿名函数 (Anonymous Fun…...
React基础
前言 (2021年笔记)补充记录 React基础 前言React讲义一、create-react-app二、关于React1、React的起源和发展2、React与传统MVC的关系3、React高性能的体现:虚拟DOM4、React的特点和优势 三、编写第一个react应用程序四、元素与组件1、函数…...
读书笔记:《华为突围ERP封锁全纪实》
文章背景: 2019年5月,华为被美国制裁,其ERP系统面临断供风险。ERP系统是企业核心管理软件,一旦中断,华为的全球业务将陷入瘫痪。面对这一生死存亡的危机,华为启动了“突围”计划,历经数年艰苦奋…...
Linux的udev详解、安装和使用(dev下的设备每次开机的名称不固定怎么办?)
前言(问题与需求): 在传统的devfs 1:设备映射的不确定:一个设备多次加载设备的设备文件可能不同,比如一个hub有可能是ttyUSB0或ttyUSB2或ttyUSB3 2:devfs没有足够的主辅设备号,当设…...
单向循环链表的概念+单向循环链表的结点插入+单向循环链表的结点删除+程序设计与笔试题分析
单向循环链表的原理与应用 思考:对于单向链表而言,想要遍历链表,则必须从链表的首结点开始进行遍历,请问有没有更简单的方案实现链表中的数据的增删改查? 回答:是有的,可以使用单向循环的链表…...
【蓝桥杯嵌入式入门与进阶】2.与开发板之间破冰:初始开发板和原理图2
个人主页:Icomi 专栏地址:蓝桥杯嵌入式组入门与进阶 大家好,我是一颗米,本篇专栏旨在帮助大家从0开始入门蓝桥杯并且进阶,若对本系列文章感兴趣,欢迎订阅我的专栏,我将持续更新,祝你…...
Jetson Xavier NX 安装 CUDA 支持的 PyTorch 指南
本指南将帮助开发者完成在 Jetson Xavier NX 上安装 CUDA 支持的 PyTorch。 安装方法 在 Jetson 上安装 Pytorch 只有两种方法。 一种是直接安装他人已经编译好的 PyTorch 轮子;一种是自己从头开始开始构建 PyTorch 轮子并且安装。 使用轮子安装 可以从我的 Gi…...
“harmony”整合不同平台的单细胞数据之旅
其实在Seurat v3官方网站的Vignettes中就曾见过该算法,但并没有太多关注,直到看了北大张泽民团队在2019年10月31日发表于Cell的《Landscap and Dynamics of Single Immune Cells in Hepatocellular Carcinoma》,为了同时整合两类数据…...
[权限提升] 操作系统权限介绍
关注这个专栏的其他相关笔记:[内网安全] 内网渗透 - 学习手册-CSDN博客 权限提升简称提权,顾名思义就是提升自己在目标系统中的权限。现在的操作系统都是多用户操作系统,用户之间都有权限控制,我们通过 Web 漏洞拿到的 Web 进程的…...
大模型本地部署流程介绍
大模型本地部署流程介绍 随着人工智能技术的快速发展,大模型(如大型语言模型、图像识别模型等)的应用越来越广泛。然而,由于这些模型通常体积庞大且计算资源要求高,如何在本地环境中高效部署成为了一个重要的议题。以…...
浅析百度AOI数据与高德AOI数据的差异性
目录 前言 一、AOI属性数据 1、百度AOI数据 2、高德AOI数据 二、AOI矢量边界 1、百度AOI空间范围 2、高德AOI空间范围 三、数据获取频次和难易程度 1、接口限制 2、数据转换成本 四、总结 前言 在当今数字化时代,地理信息数据的精准性和丰富性对于城市规划…...
LeetCode 119. 杨辉三角 II
题意:求杨辉三角(帕斯卡三角)的第n行(n从0开始) 杨辉三角的每一行是二项式排列组合的展开式 第n行为: C n 0 , C n 1 , C n 2 , … , C n n C_{n}^{0}, C_{n}^{1}, C_{n}^{2}, \dots, C_{n}^{n} Cn0,Cn1,Cn2,……...
机器学习-K近邻算法
文章目录 一. 数据集介绍Iris plants dataset 二. 代码三. k值的选择 一. 数据集介绍 鸢尾花数据集 鸢尾花Iris Dataset数据集是机器学习领域经典数据集,鸢尾花数据集包含了150条鸢尾花信息,每50条取自三个鸢尾花中之一:Versicolour、Setosa…...
设计模式Python版 原型模式
文章目录 前言一、原型模式二、原型模式示例三、原型管理器 前言 GOF设计模式分三大类: 创建型模式:关注对象的创建过程,包括单例模式、简单工厂模式、工厂方法模式、抽象工厂模式、原型模式和建造者模式。结构型模式:关注类和对…...
centos安装mysql
下面的方法不行,最后还是通过我自己的博客中的 https://blog.csdn.net/qq_21237549/article/details/133759503 CentOS 安装MySQL 详细教程 安装成功的 通过网盘分享的文件:服务器部署 链接: https://pan.baidu.com/s/12QwjIMgwHcwVeVoal-BKrg 提取码:…...
java 判断Date是上午还是下午
我要用Java生成表格统计信息,如下图所示: 所以就诞生了本文的内容。 在 Java 里,判断 Date 对象代表的时间是上午还是下午有多种方式,下面为你详细介绍不同的实现方法。 方式一:使用 java.util.Calendar Calendar 类…...
Jenkins安装部署(以及常见报错解决方案),jdk版本控制器sdkman
目录 零、环境介绍 一、Jenkins安装 1、插件安装以及更换插件源 2、修改jenkins时区 二、sdkman安装(可选) 1、sdkman常用方法 2、sdkman常用方法演示 2.1、查看可用的jdk 2.2、下载jdk并切换版本 三、jenkins报错解决 1、下载sdkman后systemc…...
【Linux】gdb——Linux调试器
gdb使用背景 程序的发布方式有两种,debug模式和release模式 Linux gcc/g出来的二进制程序,默认是release模式 要使用gdb调试,必须在源代码生成二进制程序的时候, 加上 -g 选项 gdb使用方法 首先进入gdb gdb test_glist显示代码 断点 b 行…...
978.最长湍流子数组
目录 题目过程解法收获 题目 给定一个整数数组 arr ,返回 arr 的 最大湍流子数组的长度 。 如果比较符号在子数组中的每个相邻元素对之间翻转,则该子数组是 湍流子数组 。 更正式地来说,当 arr 的子数组 A[i], A[i1], …, A[j] 满足仅满足…...
LLM - 大模型 ScallingLaws 的指导模型设计与实验环境(PLM) 教程(4)
欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://spike.blog.csdn.net/article/details/145323420 免责声明:本文来源于个人知识与公开资料,仅用于学术交流,欢迎讨论,不支持转载。 Scaling Laws (缩放法则) 是大模型领域中,用于描述 模型性能(Loss) 与…...
【Numpy核心编程攻略:Python数据处理、分析详解与科学计算】1.19 排序革命:argsort的十大高阶用法
1.19 排序革命:argsort的十大高阶用法 目录 #mermaid-svg-Qu8PcmLkIc1pOQJ7 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-Qu8PcmLkIc1pOQJ7 .error-icon{fill:#552222;}#mermaid-svg-Qu8PcmLkIc1pOQJ…...
记忆力训练day07
逻辑分类联想记忆法 一 课程目标 (1)掌握如何分类信息 (2)掌握如何运用逻辑分类方法进行记忆 小试牛刀: 核心的内容: 文字逻辑分类记忆:把文字分类后转换成画面连接记忆。 玫瑰 大树 太阳…...
RK3588平台开发系列讲解(ARM篇)ARM64底层中断处理
文章目录 一、异常级别二、异常分类2.1、同步异常2.2、异步异常三、中断向量表沉淀、分享、成长,让自己和他人都能有所收获!😄 一、异常级别 ARM64处理器确实定义了4个异常级别(Exception Levels, EL),分别是EL0到EL3。这些级别用于管理处理器的特权级别和权限,级别越高…...
算法1-1 模拟与高精度
目录 一 阶乘数码 二 麦森数 三 模拟题 一 阶乘数码 本题中n<1000,1000的阶乘为以下这么大,远超long的范围 402387260077093773543702433923003985719374864210714632543799910429938512398629020592044208486969404800479988610197196058631666872994808558901…...
(四)线程 和 进程 及相关知识点
目录 一、线程和进程 (1)进程 (2)线程 (3)区别 二、串行、并发、并行 (1)串行 (2)并行 (3)并发 三、爬虫中的线程和进程 &am…...
Tensor 基本操作2 理解 tensor.max 操作,沿着给定的 dim 是什么意思 | PyTorch 深度学习实战
前一篇文章,Tensor 基本操作1 | PyTorch 深度学习实战 本系列文章 GitHub Repo: https://github.com/hailiang-wang/pytorch-get-started 目录 Tensor 基本操作torch.max默认指定维度 Tensor 基本操作 torch.max torch.max 实现降维运算,基于指定的 d…...
[牛客]公交线路(dijkstra+链式前向星)
登录—专业IT笔试面试备考平台_牛客网 #include<bits/stdc.h> using namespace std; #define endl \n typedef long long ll; const int N1e65,M1e85; int cnt0,head[N]; int n,m,s,t; struct node {int v,w,next; }edge[M]; void addedge(int u,int v,int w) {cnt;edge…...
面试被问的一些问题汇总(持续更新)
天行健,君子以自强不息;地势坤,君子以厚德载物。 每个人都有惰性,但不断学习是好好生活的根本,共勉! 文章均为学习整理笔记,分享记录为主,如有错误请指正,共同学习进步。…...
RocketMQ原理—5.高可用+高并发+高性能架构
大纲 1.RocketMQ的整体架构与运行流程 2.基于NameServer管理Broker集群的架构 3.Broker集群的主从复制架构 4.基于Topic和Queue实现的数据分片架构 5.Broker基于Pull模式的主从复制原理 6.Broker层面到底如何做到数据0丢失 7.数据0丢失与写入高并发的取舍 8.RocketMQ读…...
适配器模式——C++实现
目录 1. 适配器模式简介 2. 角色组成 3. 代码示例 4. 适配器模式、装饰器模式、外观模式的辨析 1. 适配器模式简介 适配器模式是一种结构型模式。 适配器模式的定义:适配器模式将一个类的接口,转换成客户期望的另一个接口。适配器让原本接口不可兼容…...
C语言自定义数据类型详解(一)——结构体类型(上)
什么是自定义数据类型呢?顾名思义,就是我们用户自己定义和设置的类型。 在C语言中,我们的自定义数据类型一共有三种,它们分别是:结构体(struct),枚举(enum),联合(union)。接下来,我…...
C语言基础4
sizeof和strlen的区别 ①sizeof是运算符而strlen是函数 ②sizeof可以用类型做参数,strlen只能用char*做参数 ③数组做sizeof参数不退化,而传递给strlen则退化成指针 ④strlen结果是运行时候才能计算出来,而且计算出来的是字符串的长度不是内…...
【Elasticsearch】Elasticsearch的查询
Elasticsearch的查询 DSL查询基础语句叶子查询全文检索查询matchmulti_match 精确查询termrange 复合查询算分函数查询bool查询 排序分页基础分页深度分页 高亮高亮原理实现高亮 RestClient查询基础查询叶子查询复合查询排序和分页高亮 数据聚合DSL实现聚合Bucket聚合带条件聚合…...
第 5 章:声音与音乐系统
5.1 声音效果的应用 在游戏中,声音效果是增强游戏沉浸感和趣味性的重要元素。Pygame 提供了强大的音频处理功能,使得添加各种声音效果变得相对简单。声音效果可以包括角色的动作音效,如跳跃、攻击、受伤时的声音;环境音效&#x…...
第十四讲 JDBC数据库
1. 什么是JDBC JDBC(Java Database Connectivity,Java数据库连接),它是一套用于执行SQL语句的Java API。应用程序可通过这套API连接到关系型数据库,并使用SQL语句来完成对数据库中数据的查询、新增、更新和删除等操作…...
2024年除夕
多少年前的除夕,一如今天这样的除夕;多少年后的除夕,也一如多少年前的除夕。 无数个这样的除夕下午,我打开电脑,望着窗外安静的小区,车声渐渐稀疏的马路,想写下一些新的感受时,多少…...
虚幻基础07:蓝图接口
能帮到你的话,就给个赞吧 😘 文章目录 作用原理事件函数 作用 实现对象间的通知。 A 通知 B 做什么。 原理 将接口抽象为蓝图,使得任意蓝图都能直接访问。 只需要再传入对象地址,就能执行对象的功能。 事件 黄色:…...
7. 马科维茨资产组合模型+金融研报AI长文本智能体(Qwen-Long)增强方案(理论+Python实战)
目录 0. 承前1. 深度金融研报准备2. 核心AI函数代码讲解2.1 函数概述2.2 输入参数2.3 主要流程2.4 异常处理2.5 清理工作2.7 get_ai_weights函数汇总 3. 汇总代码4. 反思4.1 不足之处4.2 提升思路 5. 启后 0. 承前 本篇博文是对前两篇文章,链接: 5. 马科维茨资产组…...
如何在本地部署deepseek r1模型?
DeepSeek(深度求索)正式发布了其最新推理模型DeepSeek-R1,引发业界广泛关注。这款模型不仅在性能上与OpenAI的GPT-4相媲美,更以其开源策略和创新的训练方法,为AI发展带来了新的可能性。DeepSeek-R1 在后训练阶段大规模…...
HarmonyOS:状态管理最佳实践
一、概述 在声明式UI编程范式中,UI是应用程序状态的函数,应用程序状态的修改会更新相应的UI界面。ArkUI采用了MVVM模式,其中ViewModel将数据与视图绑定在一起,更新数据的时候直接更新视图。如下图所示: ArkUI的MVVM模式…...
当AI风暴来袭:中美科技商业版图的迥异走向
当AI风暴来袭:中美科技商业版图的迥异走向 美国科技巨头的 AI 豪赌:Stargate 公司的诞生 2025 年,科技界被一则重磅消息所震动:软银、NVIDIA、Oracle 与 OpenAI 共同组建了 Stargate 公司。这一合作堪称豪华阵容,软银作为全球知名的投资巨头,拥有雄厚的资金实力和广泛的…...
马尔科夫模型和隐马尔科夫模型区别
我用一个天气预报和海藻湿度观测的比喻来解释,保证你秒懂! 1. 马尔可夫模型(Markov Model, MM) 特点:状态直接可见 场景:天气预报(晴天→雨天→阴天…)核心假设: 下一个…...
面向对象设计原则 - SOLID原则 (基于C++)
SOLID 是面向对象编程中的一组五个设计原则,这些原则旨在帮助开发者创建更灵活、可维护和可扩展的软件系统。它们最初由 Robert C. Martin 提出,并在 2000 年左右被广泛接受。每个字母代表一个不同的原则: 单一职责原则 (Single Responsibil…...
ChatGPT 搜索测试整合记忆功能
据 TestingCatalog 报道,OpenAI 正在测试 ChatGPT 搜索的整合记忆功能,被命名为 “Memory in search”2。以下是关于该功能的具体情况123: 功能特点 个性化搜索:启用该功能后,ChatGPT 能利用存储的记忆数据࿰…...
PWM频率测量方法
测量PWM(脉宽调制)信号的频率是嵌入式系统中的常见需求,尤其是在电机控制、LED调光、传感器信号处理等场景中。 在这里介绍两种测量PWM频率的方法:测频法与测周法。 1、测频(率)法 原理:在闸门…...
【B站保姆级视频教程:Jetson配置YOLOv11环境(一)镜像下载与烧录】
b站同步视频教程:https://www.bilibili.com/video/BV11r6oYkEFb/ 一、引言 在人工智能与计算机视觉快速发展的当下,Jetson系列开发板凭借强大的性能,成为众多开发者进行深度学习项目的热门选择。YOLOv11作为目标检测领域的先进算法…...
使用QSqlQueryModel创建交替背景色的表格模型
class UserModel(QSqlQueryModel):def __init__(self):super().__init__()self._query "SELECT name, age FROM users"self.refresh()def refresh(self):self.setQuery(self._query)# 重新定义data()方法def data(self, index, role): if role Qt.BackgroundRole…...
计算机网络__基础知识问答
Question: 1)在计算机网络的5层结构中,每一层的功能大概是什么? 2)交换机的功能?https://www.bilibili.com/video/BV1na4y1L7Ev 3)路由器的功能?https://www.bilibili.com/video/BV1hv411k7n…...
C语言数组详解:从基础到进阶的全面解析
在C语言中,数组是一种基本的数据结构,用于存储多个相同类型的数据。数组的引入使得C语言能够高效地存储和操作大量数据。在任何一个C语言程序中,数组都发挥着极其重要的作用。无论是在算法实现、数据存储、还是在复杂程序的设计中,…...
微前端架构在前端开发中的实践与挑战
随着单页面应用(SPA)和前端框架如 React、Vue、Angular 的快速发展,现代前端应用的复杂度日益提升。尤其是当应用规模逐渐增大时,单一的代码库往往难以应对不同团队的协作和版本管理问题。为了应对这一挑战,微前端架构…...