当前位置: 首页 > news >正文

React笔记(三)类组件(1)

一、组件的概念

使用组件方式进行编程,可以提高开发效率,提高组件的复用性、提高代码的可维护性和可扩展性

React定义组件的方式有两种

  • 类组件:React16.8版本之前几乎React使用都是类组件

  • 函数组件:React16.8之后,函数式组件使用的越来越多

二、组件定义

1、ES6类的回顾

类组件:类组件是指使用ES6中class定义的组件称为类组件

回顾类的定义

class 类名{}

类是由属性和方法组成

  • 类中的属性:表示的事物的特征

  • 类中方法:表示的是对象的行为

class 类名{属性名1;属性名2;方法名1(){}方法名2(){}
}

案例1:类的定义

/*定义一个学生类class 类名{
​}类名的规定1、类名是由字母、数字、下划线或者$符号组成2、名称不能以数字开头3、类名之间不能由空格、不能是关键字或者保留字4、不能是true,false,null5、类名采用驼峰式命名法,每个单词的首字母要大写6、要见名知意
*/
class Student{sno;   //学号sname;  //姓名gender;  //性别education; //学历major;    //专业introduce(){return `学号:${this.sno}\n姓名:${this.sname}\n性别:${this.gender}\n学历:${this.education}\n专业:${this.major}`}
}
/*创建对象的语法const/let 对象名=new 类名()给对象赋值的语法对象名.属性名=值调用对象中的方法对象名.方法名()
*/
const s1=new Student()
s1.sno="XAWNW1001"
s1.sname="张资源"
s1.gender="男"
s1.education="本科"
s1.major="土木工程"
let info=s1.introduce()
console.log(info);
console.log('*******************************');
const s2=new Student()
s2.sno="XAWNW1002"
s2.sname="李敏"
s2.gender="女"
s2.education="本科"
s2.major="英语"
console.log(s2.introduce());

案例2:构造方法的使用

class Student{constructor(sno,sname,gender,education,major){this.sno=snothis.sname=snamethis.gender=genderthis.education=educationthis.major=major}introduce(){return `学号:${this.sno}\n姓名:${this.sname}\n性别:${this.gender}\n学历:${this.education}\n专业:${this.major}`}
}
​
/*实例化对象的同时进行初始化let/const 对象名=new 类名(实参1,实参1,....,实参n)*/
const s1=new Student('WNXAK1001','何新雨','男','专科','通讯工程')
console.log(s1.introduce());
console.log("*********************************************");
const s2=new Student('WNXAK1002','李乐','男','专科','英语')
console.log(s2.introduce());

案例3:类的继承

class Teacher{constructor(name,school){this.name=namethis.school=school}introduce(){return `我是${this.school}的${this.name}`}giveLession(){console.log('讲解本章目标');console.log('讲解本章内容');console.log('进行本章总结');console.log('安排今日作业');}
}
​
/*** 定义一个子类* 继承的语法* class 子类的名称 extends 父类名称{* }* super关键字的使用* suepr()直接调用父类的构造方法,它的位置必须放在子类构造方法的首行* super.父类中的方法/父类中的属性* 方法的重写:是在继承关系中,子类中的方法名和父类中的方法名,参数个数相同的这么一种情况,称为方法的重写* 方法重写的结果就是子类中的内容完全覆盖父类中方法中的内容*/
class WebTeacher extends Teacher{constructor(name,school){super(name,school)}giveLession(){console.log('首先打开vscode开发环境');super.giveLession()}
}
​
class TestTeacher extends Teacher{constructor(name,school){super(name,school)}giveLession(){console.log('打开postman或者vm虚拟机');super.giveLession()}
}
​
let zhaijizhe=new WebTeacher('吉','学苑')
console.log(zhaijizhe.introduce()); 
zhaijizhe.giveLession()
console.log('********************************');
​
let xuhaidong=new WebTeacher('东','学苑')
console.log(xuhaidong.introduce());
xuhaidong.giveLession()
​
console.log('**************************************');
​
const wangxiaofeng=new TestTeacher('峰','学苑')  
​
console.log(wangxiaofeng.introduce())
wangxiaofeng.giveLession()

2、定义类组件

类组件:是指通过ES6类来定义的组件称为类组件,React中定义类组件有如下约定

  • 类名首字母大写

  • 类组件必须要继承React.Component父类,这个父类中的相关的方法和属性就能被继承下来

  • 类组件中必须要有一个render方法

  • 这个render必须要要有返回值,返回值的内容就是这个类组件的结构(jsx)

  • 由于这个类组件要被别的组件引用,所以使用ES6的默认导出将其导出,便于别的组件引用

import React from "react"
export default class Hello extends React.Component{render(){return(<><h1>Hello组件</h1></>) }
}

类组件定义之后,引入这个类组件

import ReactDOM from 'react-dom/client'
import Hello from './components/Hello'
const template=(<><Hello></Hello>
</>)
const root=ReactDOM.createRoot(document.querySelector('#root'))
root.render(template)

3、定义函数组件【后面重点讲】

在React中除了定义类组件之外,也可以定义函数组件

函数组件:所谓函数组件是指通过普通函数或者箭头函数所定义出来的组件称为函数组件

函数组件有如下规定

  • 函数名必须首字母大写

  • 使用ES6的export将其默认导出,便于别的组件引用

  • 函数必须要有一个返回值,这个返回的内容是JSX,返回的是该函数组件的结构

export default function HelloWorld(){return (<><h1>Hello World函数组件</h1></>)
}

注意:如果不返回任何内容,假设返回一个null,页面将没有任何内容

在实际开发过程中,由于这些类组件和函数组件它的结构都是固定的,所以可以使用一些插件将其生成出来

使用rcc生成类组件,使用rfc生成函数组件

三、React的事件处理

1、React的事件处理

在React中通过onXx属性来实现单击事件的绑定的,常见的写法有四种

  • 直接在标签中通过onClick={()=>{}}来实现事件绑定

  • 在标签中通过onClick={this.类中的普通的成员方法}的方式来进行绑定

  • 在标签中通过onClick={this.类中的箭头函数}的方式绑定

  • 在标签中通过onClikc={()=>{this.函数名称()}}

import React, { Component } from 'react'export default class Hello extends Component {/*不要使用这种方法*/handleClick(){console.log('类中定义普通方法',this);}handleClick2=()=>{console.log('类中定义的箭头函数',this);}render() {return (<><button onClick={()=>{console.log('我是按钮1,我被点击了~~~~');}}>按钮1</button><button onClick={this.handleClick}>按钮2</button><button onClick={this.handleClick2}>按钮3</button><button onClick={()=>{this.handleClick2()}}>按钮4</button></>)}
}

2、this指向的回顾

let teacher={name:'teacher'
}
let student={name:'student'
}
let person={name:'person',show(age,sex){return `我叫${this.name},今年${age}岁,我的性别是${sex}`}
}
console.log(person.show(38,'男'))
//改变this指向,改变this执行的方式有三个,第一个是call,call的作用调用函数,还可以改变this执行 
console.log(person.show.call(teacher,48,'女')); 
//通过apply的方式也可以调用函数,这种方式调用方法同时,改变this指向
console.log(person.show.apply(student,[22,'男'])); 
//通过bind的方式来改变this指向
let teaherShow=person.show.bind(teacher)
console.log(teaherShow(55,'男')); 

如果使用第二方式来进行事件绑定的时候,会存在this执行为空的情况,解决办法如下

  • 使用箭头函数写法代替普通方法(建议)

  • 通过bind方式来改变this执行(不建议)

this执行改变的代码可以写在多个位置,比如写在构造函数中(经典的写法)

export default class Hello extends Component {constructor(){super()//改变this执行this.handleClick=this.handleClick.bind(this)}
}

也可以在调用的同时去改变this指向(不建议)

 <button onClick={this.handleClick.bind(this)}>按钮2</button>

3、事件传参

import React, { Component } from 'react'
/*React的事件传值的形式有如下三种1、进行事件传值的时候,没有实参,默认形参接收的event对象2、进行事件调用的同时,传递额外的参数
*/
export default class Hello extends Component {handleClick=(e)=>{console.log('e',e);}handleClick2=(arg1,arg2,arg3)=>{console.log('参数1:',arg1);console.log('参数2:',arg2);console.log('参数3:',arg3);}handleClick3=(arg1,arg2,arg3,arg4)=>{console.log('参数1:',arg1);console.log('参数2:',arg2);console.log('参数3:',arg3);console.log('参数4:',arg4);}render() {return (<><button onClick={this.handleClick}>按钮1</button><button onClick={()=>{this.handleClick2(22,33,56)}}>按钮2</button><button onClick={(e)=>{this.handleClick3(89,e,99,78)}}>按钮3</button></>)}
}

4、合成事件的原理

4.1、底层实现原理
<div onClick={this.handleClick.bind(this)}>点我</div>

React并不是将click事件绑定到了div的真实DOM上

  • 在React16版本中,是在document处 监听了所有的事件,当事件发⽣并且冒泡到document处的时候,React将事 件内容封装并交由真正的处理函数运⾏。

  • 在React17版本中,是在根容器(#root)处 监听了所有的事件,当事件发⽣并且冒泡到根容器处的时候,React将事 件内容封装并交由真正的处理函数运⾏。

这样的⽅式不仅仅减少了内存的消 耗,还能在组件挂载销毁时统⼀订阅和移除事件。 除此之外,冒泡到document上的事件也不是原⽣的浏览器事件,⽽是由 react⾃⼰实现的合成事件(SyntheticEvent)。

实现合成事件的⽬的如下:

  • 合成事件⾸先抹平了浏览器之间的兼容问题,另外这是⼀个跨浏览器原⽣ 事件包装器,赋予了跨浏览器开发的能⼒;

  • 对于原⽣浏览器事件来说,浏览器会给监听器创建⼀个事件对象。如果你 有很多的事件监听,那么就需要分配很多的事件对象,造成⾼额的内存分 配问题。但是对于合成事件来说,有⼀个事件池专⻔来管理它们的创建和 销毁,当事件需要被使⽤时,就会从池⼦中复⽤对象,事件回调结束后, 就会销毁事件对象上的属性,从⽽便于下次复⽤事件对象。

4.2、 React的事件和普通的HTML事件有什么不同

区别:

  • 对于事件名称命名⽅式,原⽣事件为全⼩写,react 事件采⽤⼩驼峰;

  • 对于事件函数处理语法,原⽣事件为字符串,react 事件为函数;

  • react 事件不能采⽤ return false 的⽅式来阻⽌浏览器的默认⾏为,⽽必须要地明确地调⽤preventDefault()来阻⽌默认⾏为。

合成事件是 react 模拟原⽣ DOM 事件所有能⼒的⼀个事件对象,其优点如 下:

  • 兼容所有浏览器,更好的跨平台;

  • 将事件统⼀存放在⼀个数组,避免频繁的新增与删除(垃圾回收)。

  • ⽅便 react 统⼀管理和事务机制。

事件的执⾏顺序为原⽣事件先执⾏,合成事件后执⾏,合成事件会冒泡绑定到 document 上,所以尽量避免原⽣事件与合成事件混⽤,如果原⽣事件阻⽌冒 泡,可能会导致合成事件不执⾏,因为需要冒泡到document 上合成事件才会 执⾏。

四、类组件的state

vue框架和React框架最大的一个好处就是不需要开发人员去操作DOM,只要大家操作了数据,自动DOM元素会发生变化,这种操作称为响应式d

在vue中响应式数据主要来自两个部分

  • 组件内部的响应式数据是定义在data选项

  • 来子组件外部的是通过props来完成定义的

在React中也是一样,如果要定义响应式数据,组件内部的数据是定义在组件的state中,组件外部的数据是定义在props中

1、有状态组件和无状态组件

类组件是有状态组件:因为一个组件的状态是存放在类的实例上,state,props都是存在this上,所以类组件被称为有状态组件

函数组件是无状态组件:函数组件都没有this,函数是不能存放状态的

类组件比较强大,函数组件比较单一,之前类组件可以完成复杂的功能,但是函数组件是简单的组件

在React16.8版本之后引入hooks,可以让函数组件也能操作状态、

总结:React16.8之前函数组件是无状态组件,几乎很少用

2、基本使用步骤

使用state定义数据一共有三步骤

第一步:定义数据

定义数据可以在构造函数内部定义,也可以在构造函数外部定义

第二步:获取数据

在使用数据的时候为了提高读取性能,最好使用解构赋值方式

第三步:修改数据

修改数据的时候一定要使用setState({})来修改数据,这个方法是一个异步方法

第1步、定义数据
  • 定义数据的时候可以在构造函数中定义数据,如下所示

class Counter extends React.Component{constructor(){super();this.state={count:0}}render(){return (<div><h2>计数器</h2></div>)}
}
export default Counter;
  • 也可以在构造函数外部定义,这种是利用ES6属性的简化语法,如下所示

class Counter extends React.Component{//简化语法state={count:0}render(){return (<div><h2>计数器</h2></div>)}
}
export default Counter;
第2步、获取数据

通过this.state获取数据

class Counter extends React.Component{constructor(){super();this.state={count:0}}render(){return (<div><h2>计数器</h2><span>{this.state.count}</span></div>)}
}
export default Counter;

在使用数据的时候,最好使用解构赋值的方式,这样能够提高性能

import React, { Component } from 'react'export default class Counter extends Component {state = {num: 0}constructor() {super()}render() {const { num } = this.state;return (<div><h1>计数器</h1><span>{num}</span></div>)}
}
第3步、修改数据
  • 状态是可以改变的

  • 语法:this.setState({要修改的数据})

  • 注意:不要直接修改state中的值,这样是错误的

  • setState()作用:1.修改state 2.更新UI

import React, { Component } from 'react'export default class Counter extends Component {state = {num: 0}constructor() {super()}render() {const { num } = this.state;return (<div><h1>计数器</h1><span>{num}</span><button onClick={() => {this.setState({num: this.state.num + 1})}}>+1</button></div>)}
}

3、购物车案例

实现步骤

  • 在compotents下创建ShopcartList.jsx,并在App.jsx中引入这个自定义组件

  • ShopcartList.jsx中的关键代码如下

import React, { Component } from 'react'
import '../assets/css/shopcartList.scss'export default class ShopcartList extends Component {constructor() {super()//定义状态数据this.state = {shopcartList: [{pid: '1001',pname: '欧莱雅男士护肤',price: 38,num: 1},{pid: '1002',pname: 'OLAY女士防皱润肤露',price: 108,num: 1},{pid: '1003',pname: '自然堂女士护肤',price: 108,num: 2},{pid: '1004',pname: '兰蔻香水',price: 1038,num: 1},{pid: '1005',pname: '大宝SOD,每个人选择',price: 8,num: 1}]}}//改变数量的方法changeNum = (sign, index) => {switch (sign) {case '+'://如下这个操作,它只能将数据进行更新,页面没有进行变化this.state.shopcartList[index].num++breakcase '-':if (this.state.shopcartList[index].num > 1) {this.state.shopcartList[index].num--} else {window.alert('数量不能少于0')}break}this.setState({shopcartList: this.state.shopcartList})}//计算总价的函数total = ary => `¥${ary.reduce((pre, cur) => pre + cur.price * cur.num, 0).toFixed(2)}`//删除方法deleteShopcartList = index => {if (window.confirm('您确定要删除吗?')) {//数组中的splice方法的参数的含义//第一参数:表示要操作数组的下标//第二个参数:表示的是要删除几个数据this.state.shopcartList.splice(index, 1)//使用this.setState来页面this.setState({shopcartList: this.state.shopcartList})}}render() {const { shopcartList } = this.statereturn (<div><h2>购物车</h2><table><thead><tr><td>序号</td><td>名称</td><td>价格</td><td>数量</td><td>小计</td><td>操作</td></tr></thead><tbody>{shopcartList.map((item, index) => <tr key={item.pid}><td>{item.pid}</td><td>{item.pname}</td><td>{item.price}</td><td><button className='operbtn' onClick={() => { this.changeNum('-', index) }}>-</button>{item.num}<button className='operbtn' onClick={() => { this.changeNum('+', index) }}>+</button></td><td>{item.price * item.num}</td><td><button className='delBtn' onClick={() => { this.deleteShopcartList(index) }}>删除</button></td></tr>)}</tbody><tfoot><tr><td colSpan={6}>{this.total(shopcartList)}</td></tr></tfoot></table></div>)}
}

4、setState同步还是异步

setState是同步还是异步的

  • React18之后setState是异步的,如果是React18之前,setState根据情况来决定,可能是同步的也可以能是异步的

  • React18版本之后的

    • 在React的事件处理中(合成事件),setState是异步的

    • 在setTimeout、setInterval、原生js中它也是异步的(重点区别)

    • 如果要在react18版本中将this.setState由异步变成同步,需要使用flushSync

componentDidMount() {console.log('1、', this.state.count);document.querySelector('#btn').addEventListener('click', () => {flushSync(()=>{{this.setState({count: this.state.count + 1})console.log('2、', this.state.count);}})flushSync(()=>{this.setState({count: this.state.count + 1})console.log('3、', this.state.count);})})}
  • React18版本之前

    • 在React的事件处理中(合成事件),setState是异步的

    • 在setTimeout、setInterval、原生js中它也是同步的

5、setState的另外一种写法

setState((state,props)=>{},()=>{})

相关文章:

React笔记(三)类组件(1)

一、组件的概念 使用组件方式进行编程&#xff0c;可以提高开发效率&#xff0c;提高组件的复用性、提高代码的可维护性和可扩展性 React定义组件的方式有两种 类组件&#xff1a;React16.8版本之前几乎React使用都是类组件 函数组件:React16.8之后&#xff0c;函数式组件使…...

Hugging Face实战-系列教程4:padding与attention_mask

&#x1f6a9;&#x1f6a9;&#x1f6a9;Hugging Face 实战系列 总目录 有任何问题欢迎在下面留言 本篇文章的代码运行界面均在notebook中进行 本篇文章配套的代码资源已经上传 上篇内容&#xff1a; Hugging Face实战-系列教程3&#xff1a;文本2分类 下篇内容&#xff1a; …...

睿趣科技:抖音开网店卖玩具怎么样

近年来&#xff0c;随着社交媒体平台的飞速发展&#xff0c;抖音作为一款短视频分享应用也迅速崭露头角。而在这个充满创业机遇的时代背景下&#xff0c;许多人开始探索在抖音平台上开设网店&#xff0c;尤其是卖玩具类商品&#xff0c;那么抖音开网店卖玩具究竟怎么样呢? 首先…...

简易虚拟培训系统-UI控件的应用4

目录 Slider组件的常用参数 示例-使用Slider控制主轴 示例-Slider控制溜板箱的移动 本文以操作面板为例&#xff0c;介绍使用Slider控件控制开关和速度。 Slider组件的常用参数 Slider组件下面包含了3个子节点&#xff0c;都是Image组件&#xff0c;负责Slider的背景、填充区…...

#include <graphics.h> #include <conio.h> #include<stdlib.h>无法打开源文件解决方案

一、问题描述 学习数据结构链表的过程中&#xff0c;在编写漫天星星闪烁的代码时&#xff0c;遇到了如下图所示的报错&#xff0c;#include <graphics.h> 、 #include <conio.h> 等无法打开源文件。 并且主程序中initgraph(初始化画布)、setfillcolor&#xff08;…...

【C语言】数据结构的基本概念与评价算法的指标

1. 数据结构的基本概念 1.1 基本概念和术语 1.1.1 数据 数据是信息的载体,是描述客观事物属性的数、字符及所有能输入到计算机中并被计算机程序识别和处理的符号的集合。数据是计算机程序加工的原料 1.1.2 数据元素 数据元素是数据的基本单位,通常作为一个整体进行考虑和…...

[PyTorch][chapter 54][Variational Auto-Encoder 实战]

前言&#xff1a; 这里主要实现&#xff1a; Variational Autoencoders (VAEs) 变分自动编码器 其训练效果如下 训练的过程中要注意调节forward 中的kle ,调参。 整个工程两个文件&#xff1a; vae.py main.py 目录&#xff1a; vae main 一 vae 文件名&#xff1a; vae…...

Java实现HTTP的上传与下载

相信很多人对于java文件下载的过程都存在一些疑惑&#xff0c;比如下载上传文件会不会占用vm内存&#xff0c;上传/下载大文件会不会导致oom。下面从字节流的角度看下载/上传的实现&#xff0c;可以更加深入理解文件的上传和下载功能。 文件下载 首先明确&#xff0c;文件下载…...

VPG算法

VPG算法 前言 首先来看经典的策略梯度REINFORCE算法&#xff1a; 在REINFORCE中&#xff0c;每次采集一个episode的轨迹&#xff0c;计算每一步动作的回报 G t G_t Gt​&#xff0c;与动作概率对数相乘&#xff0c;作为误差反向传播&#xff0c;有以下几个特点&#xff1a; …...

docker 笔记5:redis 集群分布式存储案例

尚硅谷Docker实战教程&#xff08;docker教程天花板&#xff09;_哔哩哔哩_bilibili 目录 1.cluster(集群)模式-docker版哈希槽分区进行亿级数据存储 1.1面试题 1.1.1 方案1 哈希取余分区 1.1.2 方案2 一致性哈希算法分区 原理 优点 一致性哈希算法的容错性 一致性…...

【Vue2】 axios库

网络请求库-axios库 认识Axios库为什么选择Axios库安装Axios axios发送请求常见的配置选项简单请求可以给Axios设置公共的基础配置发送多个请求 axios创建实例为什么要创建axios的实例 axios的拦截器请求拦截器响应拦截器 axios请求封装 认识Axios库 为什么选择Axios库 在游览…...

云计算 - 百度AIStudio使用小结

云计算 - 百度AIStudio使用小结 前言 本文以ffmpeg处理视频为例&#xff0c;小结一下AI Studio的使用体验及一些避坑技巧。 算力获得 免费的算力获得方式为&#xff1a;每日登录后运行一个项目&#xff08;只需要点击运行&#xff0c;不需要真正运行&#xff09;即可获得8小…...

刷新你对Redis持久化的认知

认识持久化 redis是一个内存数据库&#xff0c;数据存储到内存中。而内存的数据是不持久的&#xff0c;要想做到持久化&#xff0c;就需要让redis把数据存储到硬盘上。因此redis既要在内存上存储一份数据&#xff0c;还要在硬盘上存储一份数据。这样这两份数据在理论上是完全相…...

Greenplum-最佳实践小结

注&#xff1a;本文翻译自https://docs.vmware.com/en/VMware-Greenplum/7/greenplum-database/best_practices-logfiles.html 数据模型 Greenplum数据库是一个分析型MPP无共享数据库。该模型与高度规范化/事务性的SMP数据库明显不同。Greenplum数据库使用适合MPP分析处理的非…...

从Gamma空间改为Linear空间会导致性能下降吗

1&#xff09;从Gamma空间改为Linear空间会导致性能下降吗 2&#xff09;如何处理没有使用Unity Ads却收到了GooglePlay平台的警告 3&#xff09;C#端如何处理xLua在执行DoString时候死循环 4&#xff09;Texture2DArray相关 这是第350篇UWA技术知识分享的推送&#xff0c;精选…...

双轨制的发展,弊端和前景

双轨制是一种经济体制&#xff0c;指两种不同的规则或机制并行运行&#xff0c;以适应不同的市场或客户需求。双轨制最早出现在中国的改革开放中&#xff0c;是从计划经济向市场经济过渡的一种渐进式改革方式。 双轨制的发展可以分为三个阶段&#xff1a; 第一阶段&#xff08;…...

生成对抗网络(GAN):在图像生成和修复中的应用

文章目录 什么是生成对抗网络&#xff08;GAN&#xff09;&#xff1f;GAN在图像生成中的应用图像生成风格迁移 GAN在图像修复中的应用图像修复 拓展应用领域总结 &#x1f389;欢迎来到AIGC人工智能专栏~生成对抗网络&#xff08;GAN&#xff09;&#xff1a;在图像生成和修复…...

扬杰科技携手企企通,召开SRM采购供应链协同系统项目启动会

近日&#xff0c;中国功率半导体领先企业扬州扬杰电子科技股份有限公司&#xff08;以下简称“扬杰科技”&#xff09;与企企通召开SRM采购供应链协同系统项目启动会&#xff0c;双方项目团队成员一同出席本次会议。 会上&#xff0c;双方就扬杰科技采购供应链管理平台项目的目…...

AtCoder Beginner Contest 318

目录 A - Full Moon B - Overlapping sheets C - Blue Spring D - General Weighted Max Matching E - Sandwiches F - Octopus A - Full Moon #include<bits/stdc.h> using namespace std; const int N1e65; typedef long long ll ; const int maxv4e65; typedef …...

《Python魔法大冒险》003 两个神奇的魔法工具

魔法师:小鱼,要开始编写魔法般的Python程序,我们首先需要两个神奇的工具:Python解释器和代码编辑器。 小鱼:这两个工具是做什么的? 魔法师:你可以把Python解释器看作是一个魔法棒,只要你向它说出正确的咒语,它就会为你施展魔法。 小鱼:那这个解释器和我之前用的电…...

每日一题-动态规划(从不同类型的物品中各挑选一个,使得最后花费总和等于1000)

四种类型的物品&#xff0c;每一种类型物品数量都是n&#xff0c;先要从每种类型的物品中挑选一件&#xff0c;使得最后花费总和等于1000 暴力做法10000^4 看到花费总和是1000&#xff0c;很小且固定的数字&#xff0c;肯定有玄机&#xff0c;从这里想应该是用dp&#xff0c;不…...

2023-9-3 试除法判定质数

题目链接&#xff1a;试除法判定质数 #include <iostream>using namespace std;bool is_prime(int n) {if(n < 2) return false;for(int i 2; i < n / i; i){if(n % i 0) return false;}return true; }int main() {int n;cin >> n;while(n--){int x;cin &g…...

【Apollo学习笔记】——规划模块TASK之RULE_BASED_STOP_DECIDER

文章目录 前言RULE_BASED_STOP_DECIDER相关配置RULE_BASED_STOP_DECIDER总体流程StopOnSidePassCheckClearDoneCheckSidePassStopIsPerceptionBlockedIsClearToChangeLaneCheckSidePassStopBuildStopDecisionELSE:涉及到的一些其他函数NormalizeAngleSelfRotate CheckLaneChang…...

【SpringBoot】最基础的项目架构(SpringBoot+Mybatis-plus+lombok+knife4j+hutool)

汝之观览&#xff0c;吾之幸也&#xff01; 从本文开始讲下项目中用到的一些框架和技术&#xff0c;最基本的框架使用的是SpringBoot(2.5.10)Mybatis-plus(3.5.3.2)lombok(1.18.28)knife4j(3.0.3)hutool(5.8.21),可以做到代码自动生成&#xff0c;满足最基本的增删查改。 一、新…...

RNN 单元:分析 GRU 方程与 LSTM,以及何时选择 RNN 而不是变压器

一、说明 深度学习往往感觉像是在雪山上找到自己的道路。拥有坚实的原则会让你对做出决定更有信心。我们都去过那里 在上一篇文章中&#xff0c;我们彻底介绍并检查了 LSTM 单元的各个方面。有人可能会争辩说&#xff0c;RNN方法已经过时了&#xff0c;研究它们是没有意义的。的…...

Linux音频了解

ALPHA I.MX6U 开发板支持音频&#xff0c;板上搭载了音频编解码芯片 WM8960&#xff0c;支持播放以及录音功能&#xff01; 本章将会讨论如下主题内容。 ⚫ Linux 下 ALSA 框架概述&#xff1b; ⚫ alsa-lib 库介绍&#xff1b; ⚫ alsa-lib 库移植&#xff1b; ⚫ alsa-l…...

精心整理了优秀的GitHub开源项目,包含前端、后端、AI人工智能、游戏、黑客工具、网络工具、AI医疗等等,空闲的时候方便看看提高自己的视野

精心整理了优秀的GitHub开源项目&#xff0c;包含前端、后端、AI人工智能、游戏、黑客工具、网络工具、AI医疗等等&#xff0c;空闲的时候方便看看提高自己的视野。 刚开源就变成新星的 igl&#xff0c;不仅获得了 2k star&#xff0c;也能提高你开发游戏的效率&#xff0c;摆…...

Leetcode54螺旋矩阵

思路&#xff1a;用set记录走过的地方&#xff0c;记下走的方向&#xff0c;根据方向碰壁变换 class Solution:def spiralOrder(self, matrix: list[list[int]]) -> list[int]:max_rows len(matrix)max_cols len(matrix[0])block_nums max_cols * max_rowscount 1i 0j…...

element-plus 表格-方法、事件、属性的使用

记录element-plus 表格的使用。方法、事件、属性的使用。因为是vue3的方式用到了const install getCurrentInstance();才能获取表格的相关信息 没解决怎么获取选中的行的行号&#xff0c;采用自己记的方式实习的。 利用row-class-name"setRowClass"实现样式的简单…...

NVME Linux的查询命令-继续更新

NVME Linux的查询命令 查看NVMe设备 # nvme list 查看nvme controller 支持的一些特性 # nvme id-ctrl /dev/nvme0 查看设备smart log信息 # nvme smart-log /dev/nvme0 查看设备error 信息 # nvme error-log /dev/nvme0 设备的所有命名空间 # nvme list-ns /dev/nvmeX 检…...