React 框架

1、React 框架简介

1.1、介绍

CS 与 BS结合:像 ReactVue 此类框架,转移了部分服务器的功能到客户端。将CSBS 加以结合。客户端只用请求一次服务器,服务器就将所有js代码返回给客户端,所有交互类操作都不再依赖服务器。 客户端只有在需要服务器的数据时才会使用json通信一下,其他时间都在客户端利用js操作、暂存数据这样就极大减轻了服务器压力。

1.2、React 特性

  • 虚拟DOM树

React 通过对 DOM 的模拟,最大限度地减少与DOM的交互。将网页的DOM树完全复制一份虚拟的 DOM 树放到内存中。

  •  数据驱动

维护虚拟 DOM 树,当发现某些节点发生变化时,并不一定修改原来的 DOM 树(在网页中看到的每一个区域),比如某些分支可能会发生该改变时,首先会修改虚拟树中的这几个节点,而后将这几个节点与原节点对比。才会对真正发生改变的节点做出修改。

 1.3、JSX文件 

为了构建交互式用户界面,使用了 JSXJSX 的完整版本是一个JavaScript语法扩展,它极大地简化了组件的创建。它支持HTML引用并使子组件渲染更容易。它本质上是一组 React 编写快捷方式。使用带有一些规则的 createElement 可以使源代码更具可读性和直接性。首先写jsx文件,运行时会先将所编写的jsx编译为js,编译完之后,将js文件运行在浏览器。

2、配置环境

2.1、安装 Git Bash

Git bash 下载链接
Git Bash 安装教程

2.2、安装 Node.js

Nodejs 下载链接
Nodejs 安装教程

2.3、安装 create-react-app

打开 Git Bash,直接输入下面命令执行
npm i -g create-react-app

2.4、创建 React 项目,名为 React App

在目标目录(自己存放项目的目录)下右键打开 Git Bash,执行下面的命令

create-react-app react-app  # react-app可以替换为其它名称

2.5、启动项目

进入目录,目录进到 react-app 这一层,打开 Git Bash,输入下面命令

npm start  # 启动应用

3、组件(Component) 

组件类似于一个 class,将一些 html、data(数据)、事件函数组合在一起成为一个组件

3.1、定义组件

定义好组件之后,需要将组件渲染出来,index.js 就是所有 js 的入口, 并引入React与Component组件。

// box.js 文件
import React, { Component } from 'react';  		// 快捷键:imrc // 引入React原因:将jsx编译为js
// 通过React.createElement()class Box extends Component {					// 快捷键:CCstate = {  } 								//局部变量// component类的函数,用来返回当前组件最后的渲染html结构// render方法只能返回一个标签及所包含内容render() { return (<h1> Hello world</h1>);}
}export default Box;
// index.js 文件
import React from 'react';
import ReactDOM from 'react-dom/client';
import './index.css';
import 'bootstrap/dist/css/bootstrap.css';   		// 引入bootstrap库
import Box from './components/box';        			// 引入boxconst root = ReactDOM.createRoot(document.getElementById('root'));
root.render(<React.StrictMode><Box /> 										// Box组件,见box.js</React.StrictMode>
);

3.2、React Fragment 介绍与使用

  •  render()方法只能返回一个标签及所包含内容,想返回多个并列标签时需要包含在一个标签内。
  • React.Fragment 组件能够在不额外创建 DOM 元素的情况下,让render()方法中返回多个元素。Fragments 允许将子列表分组,而无需向DOM添加额外标签。

理解起来就是在我们定义组件的时候,return里最外层包裹的div往往不想渲染到页面,那么就要用到Fragment组件了。

class Box extends Component { 
state = {  } 
render() { return (<React.Fragment><h1> Hello world</h1><button>left</button><button>right</button></React.Fragment>);
}
}

3.3、在 jsx 中写 js 与 html 标签

jsx 中可以在任意地方定义 html 标签,但要注意,jsx 里的 html 标签中写 js 代码时都需要加 {} 括起来,{} 中只能写表达式。

render() { return (<React.Fragment><h1>{this.toString()}</h1>  		// html 标签内写js<button className="btn btn-primary">left</button><button>right</button></React.Fragment>);
}toString(){return `x: ${this.state.x}`;// 或者// const {x} = this.state; //ES6写法相当于const xxx = this.state.xxx// return `x:${x}`;
}

3.4、设置样式

jsx文件下的html 标签中设置类名以用于 css 样式时,需要将 class =" "写为 className。 由于 jsx 下 html 标签与 js 语句混合,写 class 可能会与实际js中的同名类产生冲突。

  className

return (<React.Fragment><h1>{this.toString()}</h1>     <button className="btn btn-primary m-2">left</button><button className="btn btn-success m-2">right</button></React.Fragment>// m-2 为 bootstrap 中 margin=2 的简写方式
);

  style

render() { return (<React.Fragment>// style样式:第一层{}代表里面是表达式,第二层{}代表里面是对象,即样式变量的内容<div style={{width: "50px",height: "50px",backgroundColor: "pink", color: "white",textAlign: "center",lineHeight: "50px",borderRadius: "5px",}}>{this.toString()}</div>     <button className="btn btn-primary m-2">left</button><button className="btn btn-success m-2">right</button></React.Fragment>);
}

等价于:

styles = {width: "50px",height: "50px",backgroundColor: "pink", 					// css中所有 - 命名均改为驼峰命名法
}render() { return (    								// 标签内 style={this.styele} 即可<React.Fragment><div style={this.styles}>{this.toString()}</div>     <button className="btn btn-primary m-2">left</button><button className="btn btn-success m-2">right</button></React.Fragment>);
}

3.5、数据驱动改变 style

将 style 与 state(局部变量) 值相关联,通过改变 state 里的值来改变 style。当局部变量改变时,通过接口实现所有被这个值影响的组件都改变。

state = { x: 1,} getStyles() {let styles = {width: "50px",height: "50px",backgroundColor: "pink", color: "white",textAlign: "center",lineHeight: "50px",borderRadius: "5px",margin: '5px',};if (this.state.x === 0){styles.backgroundColor = 'orange'; // 数据驱动改变style}return styles;
}
 render() { return (// 直接调用 getStyles()函数<React.Fragment><div style={this.getStyles()}>{this.toString()}</div>     <button className="btn btn-primary m-2">left</button><button className="btn btn-success m-2">right</button></React.Fragment>);
}

3.6、渲染列表

使用 map 函数

遍历类写法需给每个标签元素定义唯一 key 属性,用来帮助React快速找到被修改的DOM元素

class Box extends Component { state = { x: 1,colors: ['red','green','blue'],   		// 定义渲染列表,这里用来修改div元素内容} render() { return (<React.Fragment>{this.state.colors.map(color => (<div key={color}>{color}</div> // 这里建立div并将内容赋值为上述列表))}             </React.Fragment>);}}

3.7、Conditional Rendering

A && B && C ...:从前往后,返回第一个为 false 的表达式。( 如果全为 true,就返回最后一个 true 表达式)
A || B || C ...:从前往后,返回第一个为 true 的表达式。(如果全为 false,就返回最后一个 false 表达式。)

即利用逻辑表达式的短路原则:

 render() {       return (     <React.Fragment>   {this.state.colors.length === 0 && <p> No colors</p>}   // 即当 colors 有元素时无操作, 即当 colors 无元素时显示 No color{this.state.colors.map(color => (<div key={color}>{color}</div>))}             </React.Fragment>           );
}

3.8、绑定事件

class Box extends Component {handleClickLeft(){console.log("click left",this); }handleClickRight(){console.log("click right",this);}render() { //仅仅是绑定函数,而不是在渲染时就将返回值传过来,因此handleClickleft不加()    return (<React.Fragment><div style={this.getStyles()}>{this.toString()}</div> <button onClick={this.handleClickLeft} className="btn btn-primary m-2">left</button><button onClick={this.handleClickRight} className="btn btn-success m-2">right</button>          </React.Fragment>}
}

此时,输出的 this 不是 Box 类,而是 undifind。

如何使得方法里的 this 仍属于 Box 类:
// 法一:箭头函数(推荐)
// 法二: bind 函数
handleClickLeft=()=>{						 // 法一:箭头函数console.log("click left",this); 
}handleClickRight(){console.log("click right",this);
}render() { return (<React.Fragment><div style={this.getStyles()}>{this.toString()}</div> <button onClick={this.handleClickLeft} className="btn btn-primary m-2">left</button><button onClick={this.handleClickRight.bind(this)} className="btn btn-success m-2">right</button>          </React.Fragment>					// 法二:bind函数);
}

3.9、修改 state 里的值

直接 this.state.x-- 不会影响到页面div的显示的x值,
如果想要让 state 里的 x 的修改影响到render函数的话, 必须用 setState() 函数 (通过重新调用 render 修改 div 里 x 值)
class Box extends Component {state = { x: 1,} handleClickLeft = () => { this.setState({				// setState() 函数x: this.state.x - 1});}handleClickRight = () => {this.setState({					// setState() 函数x: this.state.x + 1});}render() {    return (<React.Fragment><div style={this.getStyles()}>{this.toString()}</div> <button onClick={this.handleClickLeft} className="btn btn-primary m-2">left</button><button onClick={this.handleClickRight} className="btn btn-success m-2">right</button>          </React.Fragment>);}
}

3.10、通过按钮修改css属性

将 state 里的值赋值给某一样式的属性,通过按钮修改state 值从而修改 css 样式

class Box extends Component {state = { x: 10, 							// state值} handleClickLeft = () => { this.setState({x: this.state.x - 10			// setState() 修改 state值, 重新调用 render() 函数});}handleClickRight = () => {this.setState({x: this.state.x + 10		// setState() 修改 state值,重新调用 render() 函数});}render() { return (<React.Fragment><div style={this.getStyles()}>{this.toString()}</div> <button onClick={this.handleClickLeft} className="btn btn-primary m-2">left</button><button onClick={this.handleClickRight} className="btn btn-success m-2">right</button>          </React.Fragment>);}getStyles() {let styles = {width: "50px",height: "50px",backgroundColor: "pink", color: "white",textAlign: "center",lineHeight: "50px",borderRadius: "5px",margin: '5px',marginLeft: this.state.x,              //  state值赋值给 css 属性值};if (this.state.x === 0){styles.backgroundColor = 'orange';}return styles;}		
}

3.11、给事件函数添加参数

handleClickRight = (step) => {this.setState({x: this.state.x + step});
}
handleClickRightTmp = () => {return this.handleClickRight(50);
}
 render() { return (<React.Fragment><div style={this.getStyles()}>{this.toString()}</div> <button onClick={this.handleClickLeft} className="btn btn-primary m-2">left</button><button onClick={this.handleClickRightTmp} className="btn btn-success m-2">right</button>          </React.Fragment>);
}

将 handleClickRight() 函数写为箭头匿名函数后等价于: 

render() { //    绑定了一个调用含参 函数 handleClickLeft =(step)=>{ }  的匿名函数  return (<React.Fragment><div style={this.getStyles()}>{this.toString()}</div> <button onClick={()=>this.handleClickLeft(10)} className="btn btn-primary m-2">left</button><button onClick={()=>this.handleClickRight(10)} className="btn btn-success m-2">right</button>          </React.Fragment>);}

综上,Box组件的构建步骤:

1、定义 state 变量,并使得数据驱动 style

2、构造 handleClickLeft =(step)=>{ } 带参函数,利用 setState() 函数改变 state 值;调用setState()能够重新加载 render 函数,才可以对里面的 div 显示进行修改

3、给按钮的单击事件onClick绑定所写函数。这里绑定了一个调用含参函数 handleClickLeft =(step)=>{ } 的匿名函数,()=>this.handleClickRight(10)

class Box extends Component {// 1. 定义 state,并使得数据驱动stylestate = { x: 10,} // 2. 通过 handleClickLeft =(step)=>{ } 带参函数 与 setState()  改变state值//    并能够重新加载 render 函数来对里面的 div 显示进行操作handleClickLeft = (step) => { this.setState({x: this.state.x - step});}handleClickRight = (step) => {this.setState({x: this.state.x + step});}render() { // 3. 给事件绑定函数:通过 render 函数里,按钮事件绑定函数。//    绑定了一个调用含参函数 handleClickLeft =(step)=>{ }  的匿名函数  return (<React.Fragment><div style={this.getStyles()}>{this.toString()}</div> <button onClick={()=>this.handleClickLeft(10)} className="btn btn-primary m-2">left</button><button onClick={()=>this.handleClickRight(10)} className="btn btn-success m-2">right</button>          </React.Fragment>);}getStyles() {let styles = {width: "50px",height: "50px",backgroundColor: "pink", color: "white",textAlign: "center",lineHeight: "50px",borderRadius: "5px",margin: '5px',marginLeft: this.state.x,	// 数据驱动 style};if (this.state.x === 0){styles.backgroundColor = 'orange';}return styles;}
}

4、Component 组件的组合与交互

4.1、【组合 Component 】组件的构建

组合多个上述定义的 Box 组件,形成 Boxes 组件,并完成 属性 值的传递。
<注:多个相同子组件时,每个子组件需要有唯一 key 值>
  • 建立 Boxes 类组件,内含多个 Box组件
import React, { Component } from 'react';
import Box from './box';class Boxes extends Component {// 1. 设置 state 变量,包括 Box 组件的唯一 key 值与 x 坐标值。state = {  boxes:[{id: 1, x: 10},{id: 2, x: 10},{id: 3, x: 100},{id: 4, x: 10},{id: 5, x: 10},]} // 2. render 函数返回多个 box 组件,通过 map 列表,逐一建立并赋值多个 Box 组件//    将 box.id 赋值给组件唯一 key,将 box.x 赋值给 Box 组件的 xrender() { return (<React.Fragment>{this.state.boxes.map((box)=>(<Boxkey = {box.id} // idx = {box.x}    // 这里会自动找到 Box 组件里的 x 赋值并存储在 props 中// 但仅仅是修改了x,并不会改变前端的显示/>))}</React.Fragment>);}
}export default Boxes;

【注】在react组件之间的通信是通过props属性来完成的,比如父组件需要将数据传递给子组件,那么组件在渲染子组件的时候,直接将数据作为子组件的属性传参。

  •  state 值传递:通过 props 将 Boxes定义的属性值返回传递给 Box
class Box extends Component {state = { // props类似于state,存储除key以外属于 box 的所有属性// Boxes 建立的 Box 赋值的 x 存到了 props 里// 通过 props 传递给了每个 Boxx: this.props.x,} handleClickLeft = (step) => { this.setState({x: this.state.x - step});}handleClickRight = (step) => {this.setState({x: this.state.x + step});}render() { return (<React.Fragment><div style={this.getStyles()}>{this.toString()}</div> <button onClick={()=>this.handleClickLeft(10)} className="btn btn-primary m-2">left</button><button onClick={()=>this.handleClickRight(10)} className="btn btn-success m-2">right</button>          </React.Fragment>);}getStyles() {let styles = {width: "50px",height: "50px",backgroundColor: "pink", color: "white",textAlign: "center",lineHeight: "50px",borderRadius: "5px",margin: '5px',marginLeft: this.state.x,};if (this.state.x === 0){styles.backgroundColor = 'orange';}return styles;}toString(){return `x: ${this.state.x}`;	        }
}export default Box;
  • 标签传递:通过 props 将Boxes 增加的Box.children子标签,传递给 Box
 // Boxes.jsx文件render() { return (<React.Fragment>{this.state.boxes.map((box)=>(<Box key = {box.id} x = {box.x}> <p>Box :</p>				// 将 Box 的闭合标签写为双标签<div>{box.id}</div>			// 可在 Box 标签内增加其它标签,属性名为 Box.children</Box>							// 并存储到了 props 中																))}</React.Fragment>);
}
// Box.jsx 文件
render() { console.log(this.props); return (<React.Fragment>{this.props.children[0]}			// 通过 props 所存储的 children 将增加的标签传递给Box<div style={this.getStyles()}>{this.toString()}</div> <button onClick={()=>this.handleClickLeft(10)} className="btn btn-primary m-2">left</button><button onClick={()=>this.handleClickRight(10)} className="btn btn-success m-2">right</button>          </React.Fragment>);
}
  • 方法传递1:React 子组件调用父组件的方法。

Box子组件调用Boxes父组件内的方法,依旧通过props。实现在 Box 组件中触发 onClick 事件后,在Boxes组件中删除key值对应的Box,即在Box标签内调用Boxes标签的方法

 // Boxes.jsx 文件// 1. Boxes.jsx 文件中写删除的方法handleDelete = (id) => {// filter: boxes列表的元素依次判断,若表达式为true则留下,否则删掉// 即若id不等留下来,相等删除const newboxes = this.state.boxes.filter((x)=>(x.id !== id));this.setState({boxes: newboxes})}render() { if(this.state.boxes.length === 0){return <div className='alert alert-dark'>没有元素可以删除了!!!</div>}return (// 2. 将所写删除方法定义为标签的 onDelete 属性传递给 Box(会存储在 props中)<React.Fragment>{this.state.boxes.map((box)=>(<Box key = {box.id} id={box.id} x = {box.x} onDelete = {this.handleDelete}> <p>Box :</p><div>{box.id}</div>   </Box>))}</React.Fragment>);
}
// Box.jsx 文件render() {    return (<React.Fragment>{this.props.children[0]}<div style={this.getStyles()}>{this.toString()}</div> <button onClick={()=>this.handleClickLeft(10)} className="btn btn-primary m-2">left</button><button onClick={()=>this.handleClickRight(10)} className="btn btn-success m-2">right</button>// 3. Box 调用 Boxes 的删除方法 ://    Box 中的 Button 的 onClick 事件,绑定匿名函数来调用含参的删除方法        <button onClick={()=>this.props.onDelete(this.props.id)} className='btn btn-danger m-2'> Delete </button></React.Fragment>);
}
  • 方法传递2:React 父组件调用子组件的方法。

仅能调用一个子组件方法,无法调用列表子组件

// 父组件
class Boxes extends Component {// 1. Boxes 父组件中写入setChildRef = (ref) => {this.ChildRef = ref;}// 3. Boxes 父组件中写调用 Box 子组件的方法handleReset = () =>{this.ChildRef.handleRE()}render() {     return (<React.Fragment>// 4. 将父组件方法绑定onClick单击事件中,即可实现单击调用子组件的方法<button onClick={this.handleReset} className='btn btn-primary'> Clear </button>{this.state.boxes.map((box)=>( // 2. Boxes 父组件的 Box 子组件标签内增加 ref 属性,并将 setChildRef 传递过来<Box key = {box.id} ref={this.setChildRef} id={box.id} x = {box.x} onDelete = {this.handleDelete}> <p>Box :</p><div>{box.id}</div>   </Box>))}</React.Fragment>);}}
// 子组件
class Box extends Component {state = { x: this.props.x,} //  子组件中被调用的方法handleRE = () =>{this.setState({x: 0});}render() { return (<React.Fragment>......</React.Fragment>);}
}

5、组件使用

5.1、组件的生命周期

创建时(挂载阶段) 

  • 执行时机:组件创建时(页面加载时)
  • 执行顺序:constructor() -> render() -> componentDidMount()

constructor()组件创建的时候,最先执行,主要是初始化数据,为事件处理程序绑定this

render():每次组件渲染触发,主要是渲染UI

componentDidMOunt():组件挂载完成,主要作用DOM操作,发送网络请求

更新时(更新阶段)

  • 执行时机:1.setState() 2.组件收到props变了 3.forceUpdate()
  • 说明:以上3中情况都会触发
  • 执行顺序:render() -> componentDidUpdate()

render():每次组件渲染触发,渲染UI

componentDidUpdate():组件 状态更新完毕

预载时

  • 执行时机:组件从页面消失

 5.2、动态更新initialValue的值

[antd: Form.Item] defaultValue will not work on controlled Field. You should use initialValues o
原因
:antd禁止在form.item下的组件使用默认属性
解决办法:删除defaultValue,在中使用initialValue={{ parentId: parentId }}代替,如果要动态更新 parentId的值,又会导致下面的问题

React does not recognize the initialValue prop on a DOM element.
**原因:**不能通过这种方法更新parentId的值,想要更新props中的值,要通过form.setFieldsValue({ parentId: parentId })进行更改,

你不能用控件的 value 或 defaultValue 等属性来设置表单域的值,默认值可以用 Form 里的 initialValues 来设置。注意 initialValues 不能被 setState 动态更新,你需要用 setFieldsValue 来更新。

由上可知,表单中不能设置默认值,要想设置默认值必须通过form中的initial Values进行设置,但是其又不能动态更新,想要达到动态更新的效果必须使用form中的setFieldsValue进行更新,需要检测parentId的变化从而对parentId进行修改,固需要在useEffect中使用setFieldsValue

如果需要在父组件中得到子组件的form表单中的值,可以通过函数传参的方式,将子组件的form对象传递给父组件,这样父组件得到子组件的form对象,就可以通过getFieldValue得到表单的值了。

    const [form] = Form.useForm()//将子组件的form传递给父组件,使得父组件可以取到子组件form中的categorieName的值props.setForm(form)// 动态更新parentId的值useEffect(() => {form.setFieldsValue({ parentId: parentId })}, [parentId])
import React, { Fragment, useEffect } from 'react'
import { Form, Input, Select } from 'antd'
import { useForm } from 'antd/lib/form/Form';const { Option } = Select;export default function AddForm(props) {const { categorys, parentId } = propsconst [form] = Form.useForm()console.log(parentId)// 动态更新parentId的值useEffect(() => {form.setFieldsValue({ parentId: parentId })}, [parentId])return (<Fragment>{/* initialValues不能被动态更新,需要使用form.setFieldsValues进行动态更新,将其放在useEffect中 */}<Form form={form}><span>所属分类</span><Form.Itemname="parentId"rules={[{required: true,message: 'Please select category!',},]}>{/* 表单中不能使用默认属性defaultValue,在form中使用initialValues{{}}代替 */}<Select ><Option value='0'>一级分类</Option>{categorys.map(c => <Option key={c._id} value={c._id}>{c.name}</Option>)}</Select></Form.Item><span>分类名称</span><Form.Itemname="categoryName"rules={[{required: true,message: 'Please input your categoryName!'}]}><Input placeholder="添加分类" /></Form.Item></Form></Fragment >)
}
// 告警标签
// 动态更新initialValue值
changeMissLevel = () =>{const{form} = this.props;form.setFieldsValue({missLevel:'222'});
}render(){<Form.Item>{getFieldDecorator('missLevel',{initialValue:this.state.missLevel})(<SelectonChange={this.changeMissLevel}><Option value= '1'>a</Option><Option value= '2'>b</Option></Select>)}</>
}

5.3、遍历对象与数组

  • 遍历对象与数组
// 遍历对象
const object  = {"a":"1","b":"2"};
for(let key in object){console.log(key);console.log(object[key]);
}// 遍历数组
const array = ["1","2","3"];
const array1 = [{"a":"1"},{"b":"2"}];for(let key in array){console.log(array[key]);
}
for(let key in array1){console.log(array[key].a);console.log(array[key].b);
}
  •   对象动态值获取或作为键 
// 动态值作为键
const obj = {"a":"1","b":"2"};
let ccc = 'c';
obj[ccc] = '3';
// 对象赋值
obj.d = '4';
// 对象获取值
let ddd = obj.d;// 对象动态值获取
const data = {"a":"1","b":"2"};
let aaa = 'a';
data[aaa+'']
  • 对象与字符串的转换 
// 对象转字符串
const obj = {"a":"1"}
JSON.String(obj );
// 字符串转对象
String a = "";
JSON.parse(a);// join与split
const aa = ["1","2"];
const bb = "1,2";
bb = aa.join(',');
aa = bb.split(",");
  • 非空判断 
// 判断是否不为空
ifNotNull = (value:any) => {if( value != undefined &&value != null &&value != 'null' &&value != 'NULL' &&value != '[]' &&value != '' &&value != {} &&value != [] &&){return true;     } else {return false;}
}// 判断是否为空
ifNotNull = (value:any) => {if( value === undefined ||value === null ||value === 'null' ||value === 'NULL' ||value === '[]' ||value === '' ||value === {} ||value === [] ||){return true;     } else {return false;}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/116347.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

elementUI 中 date-picker 的使用的坑(vue3)

目录 1. 英文显示2. format 与 value-format 无效3. date-picker 时间范围4. 小结 1. 英文显示 <el-date-pickerv-model"dateValue"type"date"placeholder"选择日期"></el-date-picker>解决方案&#xff1a; 引用 zhCn <script&g…

短视频矩阵系统源码/技术应用搭建

短视频矩阵系统开发围绕的开发核心维度&#xff1a; 1. 多账号原理开发维度 适用于多平台多账号管理&#xff0c;支持不同类型账号矩阵通过工具实现统一便捷式管理。&#xff08;企业号&#xff0c;员工号&#xff0c;个人号&#xff09; 2. 账号矩阵内容开发维护 利用账号矩…

C#调用C/C++从零深入讲解

C#调用非托管DLL从零深入讲解 一、结构对齐 结构对齐是C#调用非托管DLL的必备知识。 在没有#pragma pack声明下结构体内存对齐的规则为: 第一个成员的偏移量为0,每个成员的首地址为自身大小的整数倍子结构体的第一个成员偏移量应当是子结构体最大成员的整数倍结构体总大小…

使用Spyder进行动态网页爬取:实战指南

导语 知乎数据的攀爬价值在于获取用户观点、知识和需求&#xff0c;进行市场调查、用户画像分析&#xff0c;以及发现热门话题和可能的新兴领域。同时&#xff0c;知乎上的问题并回答也是宝贵的学习资源&#xff0c;用于知识图谱构建和自然语言处理研究。爬取知乎数据为决策和…

探索现代IT岗位:职业机遇的海洋

目录 1 引言2 传统软件开发3 数据分析与人工智能4 网络与系统管理5 信息安全6 新兴技术领域 1 引言 随着现代科技的迅猛发展&#xff0c;信息技术&#xff08;IT&#xff09;行业已经成为了全球经济的关键引擎&#xff0c;改变了我们的生活方式、商业模式和社会互动方式。IT行…

【C++和数据结构】模拟实现哈希表和unordered_set与unordered_map

目录 一、哈希的概念与方法 1、哈希概念 2、常用的两个哈希函数 二、闭散列的实现 1、基本结构&#xff1a; 2、两种增容思路 和 插入 闭散列的增容&#xff1a; 哈希表的插入&#xff1a; 3、查找 4、删除 三、开散列的实现 1、基本结构 2、仿函数Hash 3、迭代器…

React 中 keys 的作用是什么?

目录 前言&#xff1a;React 中的 Keys 的重要性 为什么 Keys 重要&#xff1f; 详解&#xff1a;key 属性的基本概念 用法&#xff1a;key 属性的示例 解析&#xff1a;key 属性的优势和局限性 优势&#xff1a; 局限性&#xff1a; key 属性的最佳实践 稳定的唯一标…

代码随想录二刷 Day46

10背包&#xff1a; 二维内侧与外侧都是正序遍历&#xff0c;二维的内侧与外侧是背包还是物品无所谓&#xff1b; 10背包&#xff1a; 一维外侧是正序&#xff0c;内侧是倒序&#xff1b; 目的是为了一个物品只选取一次&#xff1b;一维内侧一定要是背包&#xff1b;原因我想了…

SQL关于日期的计算合集

前言 在SQL Server中&#xff0c;时间和日期是常见的数据类型&#xff0c;也是数据处理中重要的一部分。SQL Server提供了许多内置函数&#xff0c;用于处理时间和日期数据类型。这些函数可以帮助我们执行各种常见的任务&#xff0c;例如从日期中提取特定的部分&#xff0c;计…

【2021研电赛】基于动态无线充电技术的自动驾驶小车

本作品介绍参与极术社区的有奖征集|分享研电赛作品扩大影响力&#xff0c;更有重磅电子产品免费领取! 参赛单位&#xff1a;北京交通大学 作品简介 近年来&#xff0c;电动汽车的发展得到了很多国家和车企的大力支持&#xff0c;但其仍然存在充电时间长、充电设施不齐全等问…

迷你洗衣机哪个牌子好又实惠?小型洗衣机全自动

现在洗内衣内裤也是一件较麻烦的事情了&#xff0c;在清洗过程中还要用热水杀菌&#xff0c;还要确保洗衣液是否有冲洗干净&#xff0c;还要防止细菌的滋生等等&#xff0c;所以入手一款小型的烘洗全套的内衣洗衣机是非常有必要的&#xff0c;专门的内衣洗衣机可以最大程度减少…

SpringMVC(三)获取请求参数

1.1通过ServletAPI获取 SpringMVC封装的就是原生的servlet 我们进行测试如下所示&#xff1a; package com.rgf.controller.service;import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping;import javax.servlet.…

学习MAVEN

MAVEN的详细介绍和作用、意义 好的&#xff0c;小朋友们&#xff0c;我们今天来聊聊一个非常神奇的工具箱&#xff0c;它的名字叫做Maven! &#x1f31f; 1. **神奇的工具箱Maven**: Maven就像是一个神奇的工具箱&#x1f9f0;&#xff0c;它可以帮助大人们把他们的电脑工…

【Docker】Dockerfile常用指令

参考官方文档&#xff1a;https://docs.docker.com/engine/reference/builder/ Dockerfile常用指令 指令说明from基础镜像&#xff0c;当前镜像基于&#xff08;依赖&#xff09;哪个镜像maintainer镜像的维护者和邮箱run镜像构建时需要执行的命令workdir镜像的工作目录expos…

基于springboot实现基于Java的超市进销存系统项目【项目源码+论文说明】

基于springboot实现基于Java的超市进销存系统演示 摘要 随着信息化时代的到来&#xff0c;管理系统都趋向于智能化、系统化&#xff0c;超市进销存系统也不例外&#xff0c;但目前国内仍都使用人工管理&#xff0c;市场规模越来越大&#xff0c;同时信息量也越来越庞大&#x…

最详细STM32,cubeMX外部中断

这篇文章将详细介绍 cubeMX外部中断的配置&#xff0c;实现过程。 文章目录 前言一、外部中断的基础知识。二、cubeMX 配置外部中断三、自动生成的代码解析四、代码实现。总结 前言 实验开发板&#xff1a;STM32F103C8T6。所需软件&#xff1a;keil5 &#xff0c; cubeMX 。实…

09 创建型模式-建造者模式

1.建造者模式介绍&#xff1a; 建造者模式 (builder pattern), 也被称为生成器模式 , 是一种创建型设计模式 定义: 将一个复杂对象的构建与表示分离&#xff0c;使得同样的构建过程可以创建不 同的表示。 2.建造者模式要解决的问题 建造者模式可以将部件和其组装过程分开&am…

【Unity程序技巧】公共Update管理器

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;Uni…

【29】c++设计模式——>策略模式

策略模式 C中的策略模式&#xff08;Strategy Pattern&#xff09;是一种行为型设计模式&#xff0c;它允许在运行时选择算法的行为。策略模式通过将算法封装成独立的类&#xff0c;并且使它们可以互相替换&#xff0c;从而使得算法的变化独立于使用算法的客户端。 策略模式通…

图像语义分割 pytorch复现DeepLab v1图像分割网络详解以及pytorch复现(骨干网络基于VGG16、ResNet50、ResNet101)

图像语义分割 pytorch复现DeepLab v1图像分割网络详解以及pytorch复现&#xff08;骨干网络基于VGG16、ResNet50、ResNet101&#xff09; 背景介绍2、 网络结构详解2.1 LarFOV效果分析 2.2 DeepLab v1-LargeFOV 模型架构2.3 MSc&#xff08;Multi-Scale&#xff0c;多尺度(预测…