React(1)基础入门
React(1)基础入门
Author: Once Day Date: 2025年4月10日
一位热衷于Linux学习和开发的菜鸟,试图谱写一场冒险之旅,也许终点只是一场白日梦…
漫漫长路,有人对你微笑过嘛…
全系列文章可参考专栏: FullStack开发_Once-Day的博客-CSDN博客
参考文章:
- 快速入门 – React 中文文档
- React 官方中文文档
- React 前端框架全面教程:从入门到进阶_react框架-CSDN博客
- React 教程 | 菜鸟教程
- 最顺滑的react基础入门教程 - 知乎
- React 入门实例教程 - 阮一峰的网络日志
文章目录
- React(1)基础入门
- 1. 概述
- 1. 1 React概述
- 1.2 React、Vue和HTTP+CSS+JS原生开发
- 1.3 JavaScript/typeScript与ES5/ES6
- 1.4 HelloWorld示例
- 2. 语法介绍
- 2.1 JSX语法
- 2.2 元素渲染
- 2.3 生命周期
- 2.4 组件
- 2.5 事件处理
- 2.6 Props属性
1. 概述
1. 1 React概述
React是一个用于构建用户界面的流行JavaScript库。它由Facebook开发,于2013年5月开源。React 的主要特点包括:
- 声明式编程模型:React允许用声明式的方式描述用户界面,当状态变化时,React会高效地更新UI。
- 基于组件:React鼓励创建可复用的UI组件,让代码易于复用和维护。一个React应用通常由多个组件嵌套组成。
- 虚拟DOM:React使用Virtual DOM来提升性能。当数据变化时,React会在内存中重新渲染一个Virtual DOM树,通过Diff算法计算出需要更新的最小变更,再批量应用到实际DOM上。这大大提升了UI更新效率。
- JSX语法:React使用了一种称为JSX的JavaScript语法扩展,可以在JavaScript代码中直接写类似HTML的标记。JSX让组件的结构和行为能够在一个文件中定义。
- 单向数据流:React中的数据流是单向的,从父组件流向子组件。这让应用状态更易于维护和理解。子组件可以通过回调函数的方式与父组件通信。
- 生命周期方法:React组件有着完善的生命周期,可以利用不同的生命周期方法在组件的不同阶段执行特定的逻辑。
总的来说,React通过组件化、声明式编程和Virtual DOM等概念,让开发者能够更高效、更可维护地构建用户界面。它的生态也非常丰富,社区活跃,资源和工具链完善。
学习React需要对HTML、CSS和现代JavaScript(ES6+)有一定的了解。
1.2 React、Vue和HTTP+CSS+JS原生开发
React和Vue都是现代化的JavaScript框架,它们的出现旨在解决原生JavaScript开发大型应用时的痛点,如代码的可维护性、可复用性和性能优化等问题。
React的核心概念是组件化和虚拟DOM。它鼓励开发者将UI拆分成独立的、可复用的组件,并使用JSX语法来编写声明式的UI代码。React使用虚拟DOM来优化性能,通过在内存中比较新旧虚拟DOM树的差异,最小化地更新实际DOM,从而提升渲染效率。React的生态系统也非常丰富,适用于各种场景下的Web开发。
Vue在很多方面与React相似,同样支持组件化和虚拟DOM。但Vue更加注重易用性和灵活性,它提供了更加友好的模板语法和API。Vue的响应式系统让数据绑定和状态管理变得简单直观。Vue也提供了丰富的工具库,如路由、状态管理等,让开发者能够快速构建完整的应用。
相比之下,原生JavaScript开发虽然灵活,但在大型项目中容易导致代码难以维护,且性能优化也需要手动处理。不过,对于一些简单的项目或者需要高度定制的场景,原生开发仍然是一个不错的选择。
1.3 JavaScript/typeScript与ES5/ES6
JavaScript和TypeScript是两种编程语言,而ES5和ES6是JavaScript的两个重要版本。
JavaScript是一种动态类型的语言,变量的类型是在运行时确定的。而TypeScript是JavaScript的超集,它增加了可选的静态类型和类型注解,在编译时进行类型检查。TypeScript最终会被编译为JavaScript,因此它可以在任何JavaScript运行的环境中执行。
特性 | JavaScript | TypeScript |
---|---|---|
类型 | 动态类型 | 静态类型 |
语法 | JavaScript语法 | JavaScript + 类型注解 |
编译 | 无需编译,直接运行 | 需要编译为JavaScript |
生态 | 丰富,大量第三方库 | 与JavaScript共享生态 |
适用场景 | 所有JavaScript适用的场景 | 大型项目,需要类型检查和提示的场景 |
ES5和ES6是JavaScript语言的两个重要版本。ES6(也称为ES2015)引入了许多新的语法特性,如let和const关键字、箭头函数、类、模块、Promise等,这些特性大大提高了JavaScript的表达能力和可读性。ES6的许多特性已经成为现代JavaScript开发的标配。
特性 | ES5 | ES6 |
---|---|---|
发布时间 | 2009 | 2015 |
变量声明 | var | let, const |
函数 | 函数声明和函数表达式 | 箭头函数 |
类和模块 | 通过函数和原型模拟 | class, import, export |
异步编程 | 回调函数 | Promise, Generator, async/await |
数组方法 | indexOf, forEach等 | find, findIndex, Array.from等 |
TypeScript支持所有JavaScript的特性,并且可以与ES5、ES6和更高版本的JavaScript一起使用。
1.4 HelloWorld示例
下面是一个使用React的基本示例,它展示了如何在HTML页面中引入React,并使用JSX语法创建一个简单的React组件。
<!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>Document</title><!-- 引入react依赖库,注意顺序,当前版本: v18.2.0 --><script src="https://lf26-cdn-tos.bytecdntp.com/cdn/expire-1-M/react/18.2.0/umd/react.production.min.js"></script><scriptsrc="https://lf3-cdn-tos.bytecdntp.com/cdn/expire-1-M/react-dom/18.2.0/umd/react-dom.production.min.js"></script><!-- 引入babel库,用于解析jsx语法# https://www.babeljs.cn/setup#installation--><script src="https://lf9-cdn-tos.bytecdntp.com/cdn/expire-1-M/babel-standalone/6.26.0/babel.min.js"></script>
</head><body><div id="root"></div><!-- 这里不是原生的javascript语法,而是特殊的jsx(javascript+xml)语法,需要用babel解析. --><script type="text/babel">// 使用函数组件const HelloWorld = () => {const msg = 'hello,world!';return (<div>{msg}</div>);};// 通过调用React自身方法render可以得到当前组件的实例对象,并渲染到页面容器.ReactDOM.render(<HelloWorld />, document.getElementById('root'));</script>
</body></html>
在HTML文件中,通过script标签引入了React的核心库(react.production.min.js)和ReactDOM库(react-dom.production.min.js)。
为了支持JSX语法,引入了Babel库(babel.min.js)。Babel会将JSX语法转换为标准的JavaScript代码。
在script标签中,使用了type="text/babel"属性,表示这段脚本需要经过Babel的转换。
定义了一个HelloWorld组件,它继承自React.Component
,并实现了render方法。render方法返回了一个JSX元素。React 组件必须以大写字母开头,而 HTML 标签则必须是小写字母。
通过ReactDOM.render方法,将HelloWorld组件渲染到id为root的DOM元素中。
2. 语法介绍
2.1 JSX语法
JSX 是一种在 React 中使用的标签语法,它将 JavaScript 和 HTML-like 标签融合,让开发者能更直观地构建 UI。
(1)基本使用:标签语法类似 HTML,但比 HTML 更严格。所有标签都必须闭合,例如<br />
;组件返回的标签必须包裹在一个共享父级中,可使用<div>...</div>
或空的<></>
(React.Fragment 的缩写)。
(2)嵌入 JavaScript:使用大括号{}
在 JSX 中嵌入 JavaScript 表达式,可用于展示数据、设置属性值等。例如<h1>{user.name}</h1>
展示变量user.name
;<img src={user.imageUrl} />
读取变量user.imageUrl
作为src
属性值,还能进行字符串拼接等复杂表达式操作。
JSX中必须把注释部分变成表达式作用域再注释,如下所示:
class HelloWorld extends React.Component {render(){return (<div className={'danger large'}>{ /* className和class属性是一样的,而且必须是驼峰 */ }{ arr }</div>)}}
(3)样式设置:通过className
属性指定 CSS 类,与 HTML 的class
属性作用相同,如<img className="avatar" />
。也可使用style
属性设置内联样式,样式值是一个 JavaScript 对象,如<img style={{width: user.imageSize, height: user.imageSize}} />
。
style形式为**{{…}}**,因为首先需要定义一个js表达式作用域,然后style属性接收一个对象类型。样式名需要转换为驼峰形式.
在JSX中,属性不应该采用关键词,比如class
,if
,for
等,样式应该书写在 className
中。
(4)条件渲染:利用 JavaScript 的if
语句、条件?
运算符或逻辑&&
语法实现条件渲染。如if
语句:
let content;
if (isLoggedIn) {content = <AdminPanel />;
} else {content = <LoginForm />;
}
return (<div>{content}</div>
);
条件?
运算符在 JSX 内部使用:<div>{isLoggedIn ? <AdminPanel /> : <LoginForm />}</div>
;逻辑&&
语法用于不需要else
分支的情况:<div>{isLoggedIn && <AdminPanel />}</div>
。
(5)渲染列表:依赖 JavaScript 的map()
函数将数组转换为组件列表。例如:
const products = [{ title: 'Cabbage', id: 1 },{ title: 'Garlic', id: 2 },{ title: 'Apple', id: 3 },
];
const listItems = products.map(product => <li key={product.id}>{product.title}</li>
);
return (<ul>{listItems}</ul>
);
列表项需设置key
属性,用于唯一标识元素,帮助 React 高效更新列表。
(6)属性和事件:可以给元素添加属性,如className
、style
、src
等。事件可以通过在元素上添加on
前缀的属性来绑定,如onClick
、onMouseEnter
等。属性值可以是字符串、数字或JavaScript表达式。
例如:<button onClick={handleClick}>Click me</button>
、<div style={{ color: 'red', fontSize: '16px' }}></div>
等。
2.2 元素渲染
在React中,元素是构建用户界面的最小单位。元素描述了在屏幕上想看到的内容。与浏览器的DOM元素不同,React元素是创建开销极小的普通对象。React DOM会负责更新真实的DOM来与React元素保持一致。
通过ReactDOM.render()方法,可以将React元素渲染到页面上的指定容器节点中,从而更新用户界面。
ReactDOM.render(element, container[, callback])
- element: 要渲染的React元素。可以是一个React组件或一个普通的JSX表达式。
- container: 要将元素渲染到的目标DOM节点。
- callback: (可选)渲染完成后的回调函数。
当首次调用ReactDOM.render()时,容器节点里的所有DOM元素都会被替换为React元素所描述的内容。在后续的渲染中,React会使用DOM差分算法(DOM diffing algorithm)来高效地更新页面,只修改必要的部分。
需要注意的是,ReactDOM.render()只会修改容器节点的子节点,而不会修改容器节点本身。这意味着我们可以将React组件插入到已有的DOM结构中,而不会影响其他部分。
另外,React元素是不可变的(immutable)。一旦被创建,就无法更改它的属性或子元素。如果需要更新UI,唯一的方式是创建一个新的元素,并将其传入ReactDOM.render()。
React会将新的元素与之前的元素进行比较,并且只会进行必要的更新,以使DOM达到预期的状态。这种高效的更新机制是React性能优越的关键原因之一。
下面是一个示例,演示了如何通过定时器不断地重新渲染React元素,实现一个简单的倒计时效果:
class HelloWorld extends React.Component {render() {return (<div className={'danger large'}><h2>倒计时</h2>{/* className和class属性是一样的,但在JSX中必须使用驼峰式命名 */}<span>{new Date().toString()}</span></div>);}
}setInterval(() => {// 通过调用ReactDOM.render()方法,将HelloWorld组件渲染到id为'root'的容器节点中ReactDOM.render(<HelloWorld />, document.getElementById('root'));
}, 1000);
在这个例子中,定义了一个HelloWorld组件,它会显示当前的时间。通过setInterval定时器,每隔1秒钟就会重新调用ReactDOM.render()方法,传入新的HelloWorld元素,从而更新页面上的时间显示。
React会智能地比较新旧元素的差异,并且只修改必要的部分,而不是每次都完全重新渲染整个组件,这样可以保证高效的性能。
2.3 生命周期
参考网站:React lifecycle methods diagram
React的生命周期是指组件从创建到销毁的整个过程,它包含了一系列的方法,这些方法会在特定的时机被自动调用。了解和掌握React的生命周期是开发React组件的重要基础。
组件的生命周期可分成三个状态:
- Mounting(挂载):已插入真实 DOM
- Updating(更新):正在被重新渲染
- Unmounting(卸载):已移出真实 DOM
当组件的props或state发生变化时,组件就会更新。组件更新的生命周期调用顺序如下:
-
getDerivedStateFromProps(nextProps, prevState)
,在调用render方法之前调用,无论是在初始挂载还是后续更新时都会被调用。它应返回一个对象来更新state,如果返回null则不更新任何内容。通过比较nextProps和prevState,可以判断组件是否需要更新。 -
shouldComponentUpdate(nextProps, nextState)
,当props或state发生变化时,它会在渲染执行之前被调用。它接收nextProps和nextState作为参数,可以比较当前props和state与下一个props和state,以决定组件是否需要更新。默认行为是返回true,即始终执行更新。如果返回false,则不会触发后续的render、getSnapshotBeforeUpdate和componentDidUpdate。
通过合理地编写shouldComponentUpdate(),可以避免不必要的渲染,提高组件的性能。
-
render()
,render()方法是class组件中唯一必须实现的方法。它会在每次组件更新时被调用,用于返回要渲染的React元素。render()方法应该是一个纯函数,不应该在其中执行副作用操作,如修改组件状态或与浏览器交互。 -
getSnapshotBeforeUpdate(prevProps, prevState)
,在最近一次渲染输出(提交到DOM节点)之前调用。它使得组件能在发生更改之前从DOM中捕获一些信息(例如,滚动位置)。此生命周期方法的任何返回值将作为参数传递给componentDidUpdate()。 -
componentDidUpdate(prevProps, prevState, snapshot)
,在更新后会被立即调用,首次渲染不会执行此方法。可以在此方法中执行DOM操作或进行其他副作用操作。如果组件实现了getSnapshotBeforeUpdate()生命周期,则它的返回值将作为第三个参数传递给componentDidUpdate()。
除了上述的更新阶段生命周期方法,React还提供了其他生命周期方法,如:
componentDidMount()
: 在组件挂载后(插入DOM树中)立即调用,常用于执行一些初始化操作,如发送网络请求、订阅事件等。componentWillUnmount()
: 在组件卸载及销毁之前直接调用,常用于执行一些清理操作,如取消定时器、解绑事件等。
2.4 组件
在React中,组件是构建用户界面的基本单元。组件可以将UI划分为独立、可复用的部分,并且可以相互组合形成复杂的页面。
React提供了两种定义组件的方式:类组件(Class Component)和函数组件(Function Component)。
类组件(Class Component):类组件是使用ES6的class语法定义的组件。它是一个继承自React.Component的JavaScript类,并且必须实现render()方法。
class Welcome extends React.Component {render() {return <h1>Hello, {this.props.name}</h1>;}
}
类组件具有以下特点:
- 可以维护自身的内部状态(state),通过this.state访问,并且可以通过this.setState()方法更新状态。
- 可以使用生命周期方法,如componentDidMount()、componentDidUpdate()等,来执行特定的操作。
- 可以接收来自父组件传递的props,通过this.props访问。
- 需要使用this关键字来引用组件实例。
函数组件(Function Component):函数组件是使用JavaScript函数定义的组件。它接收props作为参数,并返回要渲染的React元素。
function Welcome(props) {return <h1>Hello, {props.name}</h1>;
}
函数组件具有以下特点:
- 是一个纯函数,根据传入的props返回要渲染的内容。
- 没有自身的状态(state),只能接收来自父组件传递的props。
- 没有生命周期方法,但可以使用React Hooks(如useState、useEffect等)来实现类似的功能。
- 代码更加简洁,易于理解和测试。
在React 16.8版本引入了React Hooks,使得函数组件也能够拥有状态(state)和生命周期的功能,大大提高了函数组件的能力和灵活性。
import React, { useState, useEffect } from 'react';function Counter() {const [count, setCount] = useState(0);useEffect(() => {document.title = `You clicked ${count} times`;});return (<div><p>You clicked {count} times</p><button onClick={() => setCount(count + 1)}>Click me</button></div>);
}
使用React Hooks,函数组件可以拥有状态(通过useState)、执行副作用操作(通过useEffect)等,使得函数组件的能力与类组件相当。
目前类组件(Class Component)已经不被推荐使用了,函数组件(Function Component)提供的功能和解耦能力更加强大。
2.5 事件处理
在React中,事件处理是指当用户与组件交互时(如点击按钮、提交表单等),如何响应和处理这些事件。React采用了与HTML类似的事件处理方式,但有一些语法上的区别。
-
React事件的命名采用驼峰式写法(camelCase),而不是HTML中的小写。例如,HTML中的onclick对应React中的onClick,onchange对应onChange等。
-
在React中,事件处理函数需要直接绑定到元素上,而不是像HTML中那样使用字符串。事件处理函数可以是一个函数引用,也可以是一个箭头函数。
<button onClick={handleClick}>Click me</button>
// 或者
<button onClick={() => handleClick()}>Click me</button>
在React中,事件处理函数会自动接收一个合成事件对象(SyntheticEvent)作为参数,而不是原生的DOM事件对象。合成事件对象提供了与原生事件对象相同的接口,如preventDefault()、stopPropagation()等方法。合成事件对象是React合并之后的事件对象,具有更好的跨浏览器兼容性和性能。
function handleClick(event) {event.preventDefault(); // 阻止默认行为console.log(event.target.value); // 获取目标元素的值
}
在类组件中,事件处理函数内部的this默认指向undefined,需要手动绑定this指向组件实例。可以在构造函数中使用bind()方法绑定this,或者使用箭头函数定义事件处理函数。
class MyComponent extends React.Component {constructor(props) {super(props);this.handleClick = this.handleClick.bind(this);}handleClick() {console.log(this); // 正确绑定到组件实例}render() {return <button onClick={this.handleClick}>Click me</button>;}
}
// 或者
class MyComponent extends React.Component {handleClick = () => {console.log(this); // 正确绑定到组件实例};render() {return <button onClick={this.handleClick}>Click me</button>;}
}
如果需要向事件处理函数传递额外的参数,可以使用箭头函数包装事件处理函数,并传入所需的参数。
<button onClick={() => handleClick(id)}>Delete</button>
// 或
<button onClick={this.handleClick.bind(this, id)}>Delete</button>
React的事件处理机制提供了一种声明式的方式来处理用户交互,使得组件的逻辑与视图更加分离。通过合理地使用事件处理函数,可以实现各种交互效果,如表单提交、数据筛选、页面导航等。
2.6 Props属性
Props(Properties的简称)是React组件的一个重要概念。Props是一种将数据从父组件传递给子组件的机制,使得组件的可复用性和灵活性大大提高。通过Props,可以将组件配置化,使其能够适应不同的场景和需求。
在父组件中,通过给子组件标签添加属性的方式来传递Props。Props可以是任意类型的数据,如字符串、数字、布尔值、对象、数组、函数等。
<ChildComponent name="John" age={25} isStudent={true} />
在子组件中,通过函数组件的参数或类组件的this.props来接收传递的Props。在函数组件中,Props作为函数的第一个参数传入。
function ChildComponent(props) {return <h1>Hello, {props.name}!</h1>;
}
在类组件中,Props可以通过this.props访问。
class ChildComponent extends React.Component {render() {return <h1>Hello, {this.props.name}!</h1>;}
}
Props是只读的,子组件不能直接修改Props的值。如果需要根据Props的值来修改组件的行为,可以将Props作为初始化状态(state)的依据。
class ChildComponent extends React.Component {constructor(props) {super(props);this.state = {count: props.initialCount,};}// ...
}
可以使用PropTypes库对组件的Props进行类型检查,以确保传递的数据类型符合预期。PropTypes可以在开发阶段捕捉潜在的错误,提高代码的可靠性。
import PropTypes from 'prop-types';function ChildComponent(props) {// ...
}ChildComponent.propTypes = {name: PropTypes.string.isRequired,age: PropTypes.number,isStudent: PropTypes.bool,
};
可以通过设置defaultProps来为组件的Props指定默认值。当父组件没有传递对应的Props时,默认值会生效。
function ChildComponent(props) {// ...
}ChildComponent.defaultProps = {name: 'Anonymous',age: 18,
};
Props是React组件通信的重要方式,通过Props可以将数据和行为从父组件传递给子组件,实现组件间的数据流动和交互。Props应该是单向数据流,即从父组件流向子组件。子组件不应该直接修改Props,而是应该通过回调函数或状态提升等方式与父组件进行通信和数据更新。
Once Day
也信美人终作土,不堪幽梦太匆匆......
如果这篇文章为您带来了帮助或启发,不妨点个赞👍和关注,再加上一个小小的收藏⭐!
(。◕‿◕。)感谢您的阅读与支持~~~
相关文章:
React(1)基础入门
React(1)基础入门 Author: Once Day Date: 2025年4月10日 一位热衷于Linux学习和开发的菜鸟,试图谱写一场冒险之旅,也许终点只是一场白日梦… 漫漫长路,有人对你微笑过嘛… 全系列文章可参考专栏: FullStack开发_Once-Day的博客-CSDN博客 …...
Mysql8配置文件
Mysql8配置文件 修改my.cnf----配置持久化键(persistence key)配置表名不区分大小写 修改my.cnf----配置持久化键(persistence key) MySQL8初始化数据库之前配置好这些变量值,初始化数据库之后可能无法修改这个值。 # 服务端配置 [mysqld] ######## 数据目录和基…...
c/c++ 使用libgeotiff读取全球高程数据ETOPO
#include <geotiff.h> #include <geotiffio.h> #include <tiffio.h> #include <iostream> #include <xtiffio.h> void MyTIFFErrorHandler(const char* module, const char* fmt, va_list args) {// 格式化错误消息char buffer[1024];vsnprintf(…...
Spring Boot集成Nacos
1. 添加依赖 在pom.xml文件中添加Nacos相关依赖。根据Spring Boot版本选择合适的依赖版本: Spring Boot 3.2.x版本 <dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artif…...
CAP理论 与 BASE理论
一、分布式系统存在的问题 1.分布式系统 20世纪90年代,随着互联网应用的快速扩张,传统单机系统难以支撑高并发、跨地域的数据处理需求。分布式系统(Distributed System) 逐渐成为主流架构,分布式系统是由多台计算机&…...
C++(21)—类和对象(下) ⑥匿名对象
文章目录 一、匿名对象的定义与基本特性二、匿名对象与有名对象的对比1. 有名对象2. 匿名对象 三、匿名对象的构造与析构时机1. 构造与析构规则2. 示例分析 四、匿名对象的适用场景1. 临时调用对象方法2. 作为函数参数 五、总结 一、匿名对象的定义与基本特性 匿名对象&#x…...
Go环境变量配置
Go环境变量配置 一、下载 进入The Go Programming Language 点击下载对应操作系统的 安装成功界面如下图,默认安装到: usr/local/go/ 安装完成之后,在终端运行 go version,如果显示类似下面的信息,表明安装成功(备注:darwin(其实…...
AI推理强,思维模型也有功劳【58】二八定律思维
giszz的理解:二八定律,我们说的和听的都比较多。20%的关键,是事物本质,做人不要贪心,也不要胡子眉毛一把抓。当然,也不要轻视那80%。 一、定义 二八定律思维模型,也被称为帕累托法则࿰…...
文件上传靶场
文件上传靶场 项目结构 upload-lab/ ├── Dockerfile └── www├── index.php└── upload└── flag.txt执行命令流程(逐行执行) 创建目录结构 # 创建目录结构 mkdir upload-lab;cd upload-lab mkdir -p www/upload# 创建flag文件 echo &qu…...
RV1106 OCR 识别算法
一 题记 目标是在某款 RV1106 低算力小板下跑通OCR文字识别算法,做个简单的应用,RK 官方模型库rk_model_zoo 有PP-OCR 的例子,但在 rv1106 上尚未支持。于是便打算折腾一吧。 二 方案甄选 参考国外某大佬的比较: 对比了几种方案…...
Linux实现翻译以及群通信功能
1.翻译功能实现 UdpServer.hpp文件 构造函数 接收一个端口号和一个回调函数,回调函数是传入一个执行方法,比如翻译方法。 UdpServer(uint16_t port,func_t func):_sockfd(defaultfd),_port(port),_isrunning(false),_func(func){}Init函数 首先创建了…...
[MRCTF2020]ezpop wp
本题考点:php反序列化的pop链 首先来了解一下pop链是什么,它类似于多米诺骨牌一环套一环,要调用这个成员方法然后去找能调用这个方法的魔术方法,最后一环接一环,完成一个链子,最终形成payload。 那么来了解一下这些魔术方法 __construct() //类的构造函数࿰…...
机器学习入门之Sklearn基本操作
、 Sklearn全称:Scipy-toolkit Learn是 一个基于scipy实现的的开源机器学习库。它提供了大量的算法和工具,用于数据挖掘和数据分析,包括分类、回归、聚类等多种任务。本文我将带你了解并入门Sklearn在机器学习中的基本用法。 获取方式 pip install sc…...
(二十二)安卓开发中的数据存储之SQLite简单使用
在Android开发中,SQLite是一种非常常用的数据库存储方式。它轻量、简单,非常适合移动设备上的数据管理。本文将通过通俗易懂的语言,结合代码示例和具体场景,详细讲解SQLite在Android中的使用。 1. 什么是SQLite? SQLite是一个开…...
docker compose搭建博客wordpress
一、前言 docker安装等入门知识见我之前的这篇文章 https://blog.csdn.net/m0_73118788/article/details/146986119?fromshareblogdetail&sharetypeblogdetail&sharerId146986119&sharereferPC&sharesourcem0_73118788&sharefromfrom_link 1.1 docker co…...
信息学奥赛一本通 1498:Roadblocks | 洛谷 P2865 [USACO06NOV] Roadblocks G
【题目链接】 ybt 1498:Roadblocks 洛谷 P2865 [USACO06NOV] Roadblocks G 【题目考点】 1. 图论:严格次短路径 严格次短路的路径长度必须大于最短路的路径长度。 非严格次短路的路径长度大于等于最短路的路径长度。 【解题思路】 每个交叉路口是一…...
学习笔记—C++—类和对象(三)
目录 类和对象 再探构造函数 类型转换 隐式类型转换 显式类型转换 C语言风格类型转换 C风格类型转换 static_cast dynamic_cast const_cast reinterpret_cast static成员 友元 友元函数 友元类 友元成员函数 内部类 匿名对象 匿名对象的使用场景:…...
句句翻译。
对这些单词整理,格式为:“overall /əʊvərɔːl/ adj.全面的,综合的,总体的adv.全部,总 计,一般来说,大致上,总体上n.外套,罩衣,工装连衣裤,工装 服 ” 4,4 A review published in January in Experimental Dermatology found that ceramide made sk…...
LeetCode 2999.统计强大整数的数目:上下界数位DP
【LetMeFly】2999.统计强大整数的数目:上下界数位DP 力扣题目链接:https://leetcode.cn/problems/count-the-number-of-powerful-integers/ 给你三个整数 start ,finish 和 limit 。同时给你一个下标从 0 开始的字符串 s ,表示一…...
具身导航中的视觉语言注意力蒸馏!Vi-LAD:实现动态环境中的社会意识机器人导航
作者:Mohamed Elnoor 1 ^{1} 1, Kasun Weerakoon 1 ^{1} 1, Gershom Seneviratne 1 ^{1} 1, Jing Liang 2 ^{2} 2, Vignesh Rajagopal 3 ^{3} 3, and Dinesh Manocha 1 , 2 ^{1,2} 1,2单位: 1 ^{1} 1马里兰大学帕克分校电气与计算机工程系, 2…...
FreeRTOS入门与工程实践-基于STM32F103(一)(单片机程序设计模式,FreeRTOS源码概述,内存管理,任务管理,同步互斥与通信,队列,信号量)
裸机程序设计模式 裸机程序的设计模式可以分为:轮询、前后台、定时器驱动、基于状态机。前面三种方法都无法解决一个问题:假设有A、B两个都很耗时的函数,无法降低它们相互之间的影响。第4种方法可以解决这个问题,但是实践起来有难…...
算法思想之位运算(二)
欢迎拜访:雾里看山-CSDN博客 本篇主题:算法思想之位运算(二) 发布时间:2025.4.13 隶属专栏:算法 目录 滑动窗口算法介绍六大基础位运算符常用模板总结 例题判定字符是否唯一题目链接题目描述算法思路代码实现 汉明距离题目链接题目…...
软考笔记day04
寻址方式 CISC RISC 流水线技术 存储系统 1、层次化存储系统 2、Cache 3、主存编址计算 输入输出技术 I/O 总线...
本地电脑如何连接windows云服务器
进行远程连接需要几个数据:用户名、密码、公网IP 打开本地cmd,输入命令mstsc打开远程连接面板, 在计算机输入框中输入云服务器的IP地址 点击“选项”展开,点击“本地资源”,然后点击“详细信息” 用户名通常为admin…...
Linux内核常见的调度策略
在 Linux 内核中,调度策略决定了任务如何被分配 CPU 时间以及任务之间的优先级关系。以下是五种常见的调度策略:STOP、DL(Deadline)、RT(Real-Time)、CFS(Completely Fair Scheduler)…...
【Linux】进程优先级、进程切换、进程调度
Linux 1.进程优先级1.基本概念2.查看进程1.UID2.PRI、NI3.修改优先级(PRI) 3.竞争、独立、并行、并发 2.进程切换3.进程调度1.活动队列2.过期队列3.active、expired指针 1.进程优先级 1.基本概念 优先级:进程得到 CPU 资源分配的先后顺序。优…...
HCIP第十二天
LSA --- 链路状态通告 链路状态类型,链路状态ID,通告路由器 --- LSA的三元组 --- 可以唯一的标识出一条LSA Type --- OSPFv2中,常见的需要掌握LSA有6种 LS ID --- LSA的名字 --- 因为每一种LSA LS ID的生成方式都不相同,所以&am…...
Magnet Pro Macbook窗口分屏管理软件【提高效率工具】
Magnet Pro Macbook窗口分屏管理软件【提高效率工具】 一、介绍 Magnet Pro for Mac,是一款功能强大的窗口分屏管理软件,具有多种布局模式、窗口布局功能和其他工具,可以帮助您高效地进行多任务处理和管理工作。 拖动窗口到边缘,…...
控制单元(Control Unit, CU)
一、控制单元的定义与核心作用 控制单元 是 CPU 的核心部件之一,负责 解析指令、生成控制信号 并 协调各硬件部件 的工作时序,确保指令按预定流程正确执行。 核心定位:计算机系统的“指挥中心”,通过控制总线与运算器、存储器、…...
JavaWeb 课堂笔记 —— 10 MySQL DML + DQL
本系列为笔者学习JavaWeb的课堂笔记,视频资源为B站黑马程序员出品的《黑马程序员JavaWeb开发教程,实现javaweb企业开发全流程(涵盖SpringMyBatisSpringMVCSpringBoot等)》,章节分布参考视频教程,为同样学习…...
基于 LSTM 的多特征序列预测-SHAP可视化!
往期精彩内容: 单步预测-风速预测模型代码全家桶-CSDN博客 半天入门!锂电池剩余寿命预测(Python)-CSDN博客 超强预测模型:二次分解-组合预测-CSDN博客 VMD CEEMDAN 二次分解,BiLSTM-Attention预测模型…...
【C++】哈希扩展海量数据处理
目录 位图 位图面试题 C库中的位图bitset 位图优缺点 位图相关题目 布隆过滤器 布隆过滤器的介绍 布隆过滤器的应用 海量数据处理 位图 位图面试题 1.给40亿个不重复的无符号整数,没排过序。给一个无符号整数,如何快速判断一个整数是否在这40亿…...
考研数据结构精讲:数组与特殊矩阵的压缩存储技巧(包含真题及解析)
考研数据结构精讲:数组与特殊矩阵的压缩存储技巧 一、数组基础概念 1.1 数组的定义 数组是由相同数据类型的元素构成的有限序列,具有以下核心特性: 维度特性:支持一维到多维结构(常见二维数组)随机访问…...
【Android】ContentResolver的使用
在 Android 中,ContentResolver 是一个非常重要的类,它提供了与 ContentProvider 进行交互的方法。ContentProvider 是用于在不同应用程序之间共享数据的标准接口,而 ContentResolver 则是从客户端(如 Activity 或 Service&#x…...
Python 的 collections 模块
1. deque (双端队列) 定义 deque(读作 “deck”,即双端队列)是一个支持从两端高效添加和删除元素的数据结构。相比列表(list)在头部操作的 O(n) 时间复杂度,deque 的两端操作都是 O(1)。 用途 队列和栈…...
浏览器发起调用到服务器的全过程解析
在 Web 应用的交互过程中,从用户在浏览器输入 URL 发起请求,到最终获取服务器返回的内容,背后涉及多个复杂而有序的步骤。理解这一过程,对于深入掌握 Web 开发、优化应用性能以及排查网络问题都具有重要意义。下面将详细阐述浏览器…...
塑料瓶识别分割数据集labelme格式976张1类别
数据集格式:labelme格式(不包含mask文件,仅仅包含jpg图片和对应的json文件) 图片数量(jpg文件个数):976 标注数量(json文件个数):976 标注类别数:1 标注类别名称:["Trash plastic"] 每个类别标注的框数…...
RuoYi-Vue升级为https访问-后端安装SSL证书(单台Linux服务器部署)
一、前言 当Nginx已经作为反向代理并成功配置了SSL证书时,前端客户端与Nginx的通信已经是加密的。但Nginx和后端服务之间的连接可能仍然存在明文传输的风险。 如果Nginx和后端服务位于同一台物理机器或者通过安全的内部网络(如私有VLAN或防火墙保护的内网)进行通信,则可以…...
【学习笔记】文件上传漏洞--中间件解析漏洞、编辑器安全
目录 一、IIS 二、Apache HTTP Server 三、Apache HTTPD 未知后缀解析漏洞 四、Apache HTTPD 换行解析漏洞 五、黑、白名单 六、nginx解析漏洞 七、编辑器漏洞 一、IIS 文件夹 正常:image/qq.jpg 执行:image.asp/qq.jpg qq.jpg就会被当做asp解…...
【论文阅读】UniAD: Planning-oriented Autonomous Driving
一、Introduction 传统的无人驾驶采用了区分子模块的设计,即将无人驾驶拆分为感知规划控制三个模块,这虽然能够让无人驾驶以一个很清晰的结构实现,但是感知的结果在传达到规划部分的时候,会导致部分信息丢失,这势必会…...
【第16届蓝桥杯C++C组】--- 数位倍数
Hello呀,小伙伴们,第16届蓝桥杯也完美结束了,无论大家考的如何,都要放平心态,今年我刚上大一,也第一次参加蓝桥杯,刷的算法题也只有200来道,但是还是考的不咋滴,但是拿不…...
【腾讯云智】20250329笔试算法题
文章目录 第一题1. 题目描述2. 思路解析3. AC代码 第二题1. 题目描述2. 思路解析3. AC代码 第三题1. 题目描述2. 思路解析3. AC代码 第一题 1. 题目描述 题目链接:牛牛的水果店 2. 思路解析 这题比较简单,按数学思维把题目的意思翻译过来就是给你一…...
【2025最新】windows本地部署LightRAG,完成neo4j知识图谱保存
之前在服务器部署neo4j失败,无奈只能在本地部署,导致后期所有使用的知识图谱数据都存在本地,这里为了节省时间,先在本地安装LigthRAG完成整个实验流程,后续在学习各种服务器部署和端口调用。从基础和简单的部分先做起来…...
思考力提升的黄金标准:广度、深度与速度的深度剖析
文章目录 引言一、广度的拓展:构建多元知识网络1.1 定义与重要性1.2 IT技术实例与提升策略小结:构建多元知识网络,提升IT领域思考力广度 二、深度的挖掘:追求知识的精髓2.1 定义与重要性2.2 IT技术实例与提升策略小结:…...
7个向量数据库对比:Milvus、Pinecone、Vespa、Weaviate、Vald、GSI 和 Qdrant
7个向量数据库对比:Milvus、Pinecone、Vespa、Weaviate、Vald、GSI 和 Qdrant 本文简要总结了当今市场上正在积极开发的7个向量数据库,Milvus、Pinecone、Vespa、Weaviate、Vald、GSI 和 Qdrant 的详细比较。 我们已经接近在搜索引擎体验的基础层面上涉…...
计算机组成原理笔记(十五)——3.5指令系统的发展
不同类型的计算机有各具特色的指令系统,由于计算机的性能、机器结构和使用环境不同,指令系统的差异也是很大的。 3.5.1 x86架构的扩展指令集 x86架构的扩展指令集是为了增强处理器在多媒体、三维图形、并行计算等领域的性能而设计的。这些扩展指令集通…...
Rust 中的Relaxed 内存指令重排演示:X=0 Y=0 是怎么出现的?
🔥 Rust 中的内存重排演示:X0 && Y0 是怎么出现的? 在并发编程中,我们经常会听说“内存重排(Memory Reordering)”这个术语,但它似乎总是只出现在理论或者别人口中的幻觉里。本文将通过…...
vp 2023 icpc 合肥 解题补题记录 [F E J G]
gym 链接: https://codeforces.com/gym/104857 F. Colorful Balloons 血签, 用 map 存一下每个颜色气球出现的次数, 找出出现次数大于一半的颜色. #include<bits/stdc.h> using namespace std;#define int long long #define endl \nsigned main() {int n;cin >> …...
学习SqlSugar的跨库查询基本用法
使用SqlSugar操作数据库通常都是单库操作,跨库查询的情况要么是单个系统数据不完整,需要其它系统的关联业务数据支撑,要么就是需要整合汇总多个系统的数据进行数据数据分析、处理、展示。遇到上述情况,可以要求另外的系统提供查询…...
智慧工厂可视化系统,赋能工业生产智能化升级
借助图扑软件 HT 搭建智慧工厂可视化系统。利用先进 3D 建模,对工厂布局、设备运行、生产流程进行逼真复刻。实时展示设备状态、生产进度、质量检测数据等,助力管理者精准洞察生产,高效决策,推动工厂智能化转型。...