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

react的redux总结

目录

一、Antd

1.1、基本使用

1.2、自定义主题

二、Redux

2.1、工作流程

2.2、理解react-redux

2.3、优化

2.3.1、简写mapDispatch

2.3.2、Provider组件

2.4、数据共享

2.4.1、编写Person组件

2.4.2、Person组件的reducer

2.4.3、完成数据共享

2.5、求和案例

2.5.1、完整版

2.5.2、异步版

2.6、纯函数

2.7、开发者工具

2.8、求和案例(最终版)

2.9、useSelector 和 useDispatch

三、比较redux、vuex、pinia

3.1、共同点

3.2、不同点

3.2.1、状态变更方式

3.2.2、模块化管理

四、扩展

4.1、setState

4.2、lazyLoad

4.3、Hooks

4.3.1、StateHook--useState

4.3.2、EffectHook--useEffect

4.3.3、RefHook--useRef

4.4、Fragment

4.5、Context

4.6、组件优化(PureComponent)

4.7、renderProps

4.8、错误边界(ErrorBoundary)

一、Antd

1.1、基本使用

官网:组件总览 - Ant Design 【下载:npm i antd】,建议按需引入。

1.2、自定义主题

在 create-react-app 中使用 - Ant Design这个文档3.XX版本写的比较详细。

const { override, fixBabelImports } = require("customize-cra");
const { override, fixBabelImports, addLessLoader } = require("customize-cra");
module.exports = override(fixBabelImports("import", {libraryName: "antd",libraryDirectory: "es",style: "css",style: true,}),addLessLoader({javascriptEnabled: true,modifyVars: { "@primary-color": "#1DA57A" },})
);

二、Redux

中文官网:Redux 中文文档 【下载:npm i redux

redux是一个专门用于做状态管理的JS库,集中式管理react多个组件共享的状态。

2.1、工作流程

总结:

action里都是(dispatch)触发事件的类型

reducers里就是纯函数:用来将获取到的数据进行具体的处理

精简版求和案例

2.2、理解react-redux

下载:npm i react-redux

2.3、优化

2.3.1、简写mapDispatch

2.3.2、Provider组件

import store from './redux/store';
import { Provider } from 'react-redux';
const root = document.getElementById('root')
ReactDOM.render(// 用Provider包裹App,目的是把store传给App的所有后代<Provider store={store}><App /></Provider>,root
);

总结:

1、将Redux的store传递给其所有子组件。不需要<Count store={store}/>单个传递;

2、确保所有组件都能访问到同一个Redux store,保证状态的一致性
3、不需要手动将store传递给每个组件,简化了状态管理的复杂性。

2.4、数据共享

2.4.1、编写Person组件

import React, { Component } from 'react'
import {nanoid} from 'nanoid'
import {connect} from 'react-redux'
import {addPerson} from "../../redux/actions/person"
class Person extends Component {addPerson=()=>{const name=this.nameNode.valueconst age=this.ageNode.value*1const personObj={id:nanoid(),name,age}this.props.addPerson(personObj)this.nameNode.value=''this.ageNode.value=''}render() {return (<div><h1>上方组件求和为:{this.props.count}</h1><input ref={c=>this.nameNode=c} type="text" placeholder='输入名字'/><input ref={c=>this.ageNode=c} type="text" placeholder='输入年龄'/><button onClick={this.addPerson}>添加</button><ul>{this.props.personArr.map((item)=>{return <li key={item.id}>{item.name}--{item.age}</li>})}</ul></div>)}
}
export default connect(state=>({personArr:state.persons,count: state.count}),{addPerson}
)(Person)

2.4.2、Person组件的reducer

先定义actions,再写reducer

import { ADD_PERSON } from "../types/constant";
export const addPerson = person => ({type: ADD_PERSON,data: person})
import { ADD_PERSON } from "../types/constant";
const initState = [{ name: '张三', age: 18, id: 1 }]
export default function personReducer(preState = initState, action) {const { type, data } = actionswitch (type) {case ADD_PERSON:// preState.unshift(data) 此处不可以这样写return [data, ...preState]default:return preState}
}

2.4.3、完成数据共享

在reducer文件夹里集合所有分散的文件.js

import { combineReducers } from "redux";
import count from "./count";
import persons from "./person";
export default combineReducers({count,persons,
});

统一在store里引入

// 1、createStore用于创建Redux的store。
import { createStore, applyMiddleware} from "redux";
import allReducer from "./reducers/index";
// 引入中间件,支持异步action
import thunk from "redux-thunk";
// 引入redux开发者工具
import { composeWithDevTools } from "redux-devtools-extension";
export default createStore(allReducer,composeWithDevTools(applyMiddleware(thunk))
);

2.5、求和案例

2.5.1、完整版

2.5.2、异步版

下载:npm i redux-thunk 

redux-thunk是一个Redux中间件,在Redux的action creators中编写异步逻辑(比如网络请求、定时器等)

2.6、纯函数

1、一类特别的函数:只要是同样的输入(实参),必定得到同样的输出(返回)

2、必须遵守以下约束:

(1)、不得改写参数数据;

(2)、不会产生任何副作用,例如网络请求、输入输出设备;

(3)、不能调用Date.now()或者Math.random()等不纯的方法。

3、redux的reducer函数必须是一个纯函数(参照下方的函数)

export default function personReducer(preState = initState, action) {const { type, data } = actionswitch (type) {case ADD_PERSON:// preState.unshift(data) 此处不可以这样写,会让preState被修改,导致personReducer不是一个纯函数return [data, ...preState]default:return preState}
}

2.7、开发者工具

在浏览器的扩展程序中搜索:Redux DevTools

并在项目里安装npm i redux-devtools-extension,并在store.js里引入,项目右上角图标点亮后,在控制台这一行的redux里可以看到每个事件的触发和数据的变化

// 引入redux开发者工具
import { composeWithDevTools } from "redux-devtools-extension";
export default createStore(allReducer,composeWithDevTools(applyMiddleware(thunk))
);

2.8、求和案例(最终版)

import React, { Component } from "react";
import { connect } from "react-redux";
import {increment,decrement,incrementAsync,
} from "../../redux/actions/count";
class Count extends Component {incrementIfOdd = () => {const { value } = this.selectNumber;if (this.props.count % 2 !== 0) {this.props.increment(value * 1);}};increment = () => {const { value } = this.selectNumber;this.props.increment(value * 1);};decrement = () => {const { value } = this.selectNumber;this.props.decrement(value * 1);};incrementAsync = () => {const { value } = this.selectNumber;this.props.incrementAsync(value * 1, 500);};render() {return (<div><h1>当前求和为:{this.props.count},下方组件总人数为:{this.props.personCount}</h1><select ref={(c) => (this.selectNumber = c)}><option value="1">1</option><option value="2">2</option><option value="3">3</option></select>&emsp;<button onClick={this.increment}>加</button>&emsp;<button onClick={this.decrement}>减</button>&emsp;<button onClick={this.incrementIfOdd}>当前求和为奇数再加</button>&emsp;<button onClick={this.incrementAsync}>异步加</button></div>);}
}
export default connect((state) => ({ count: state.count, personCount: state.persons.length }),{increment,decrement,incrementAsync,}
)(Count);

分析这个页面的数据来源:

1、type文件夹里的constant.js

// 定义action对象中type类型的常量值,避免单词写错(便于管理)
export const INCREMENT = "increment";
export const DECREMENT = "decrement";
export const ADD_PERSON = "add_person";

2、reduces文件夹里依旧是count.js

import {INCREMENT,DECREMENT} from '../types/constant'
const initState = 0;
// preState:之前的状态、action:动作对象
export function countReducer(preState = initState, action) {// 从action对象中获取type和dataconst { type, data } = action;// 根据type决定如何加工数据switch (type) {case INCREMENT:return preState + data;case DECREMENT:return preState - data;default:return preState;}
}

3、将reducers文件夹里的count.js、person.js都合并到index.js,再在store.js里面引入,在Count组件的connect里引入数据和方法,在页面通过this.props.xxx进行使用

2.9、useSelectoruseDispatch

有时候也会见到下面这样的写法,和上面原理是一样的

import React from 'react';
import { useSelector, useDispatch } from 'react-redux';
const MyComponent = () => {const count = useSelector(state => state.counter); // 从 Redux 状态中选择数据const dispatch = useDispatch();const increment = () => {dispatch({ type: 'INCREMENT' }); // 分发 Redux 动作};return (<div><p>Count: {count}</p><button onClick={increment}>Increment</button></div>);
};
export default MyComponent;

三、比较redux、vuex、pinia

3.1、共同点

1、全局状态管理
都提供了全局状态管理的功能,在整个应用中共享和管理状态。
2、单向数据流
都遵循单向数据流的原则,即状态的更新是通过特定的流程进行的。

3、性能稳定,都支持ts

3.2、不同点

3.2.1、状态变更方式

1、Redux
        通过 Reducer 函数处理 Actions 来更新状态。
特点:状态更新必须通过纯函数(Reducer)完成,确保状态的不可变性;异步操作通过中间件(如 Thunk 或 Saga)实现,允许在 Action 中执行异步逻辑。
2、Vuex
        必须通过 Mutations 来更新状态。
特点:状态更新必须是同步的,通过this.$store.commit 派发 Mutations异步操作需要通过 this.$store.dispatch 派发 ActionsActions 再触发 Mutations
3、Pinia
        同步异步操作直接在 Actions 中修改状态,无需 Mutations
特点:简化了状态更新流程,减少了样板代码。

3.2.2、模块化管理

1、Redux
        通过 Reducer 的组合来实现模块化。
特点:支持复杂的状态结构,但需要手动管理模块。
2、Vuex
        通过 Modules 来分割状态管理。
特点:支持模块化,但需要手动配置模块的注册和取消注册。
3、Pinia
        每个Store是独立的,无需手动配置模块。
特点:模块化更灵活,避免了复杂的嵌套结构

四、扩展

4.1、setState

class Index extends Component {state = { count: 0 };add = () => {// 1、对象式setStateconst { count } = this.state;this.setState({ count: count + 1 }, () => {console.log("更新后", this.state.count);//输出1});console.log("此时值还未更新", this.state.count);//输出0// 2、函数式setStatethis.setState(state=>({count:state.count+1}))};render() {return (<div><h1>当前求和为:{this.state.count}</h1><button onClick={this.add}>点我+1</button></div>);}
}

总结:

1、setState异步操作,有对象式和函数式两种写法,对象式是函数式的语法糖

2、使用原则:

      (1)、如果新状态不依赖于原状态===>使用对象方式;

      (1)、如果新状态依赖于原状态===>使用函数方式;

      (1)、如果需要获取执行后最新的状态数据,在第二个callback函数中读取。

4.2、lazyLoad

React 提供了 React.lazy 和 Suspense 来实现组件的懒加载React.lazy 用于动态导入组件,而 Suspense 用于包装懒加载组件,提供加载状态

import React, { Suspense, lazy } from 'react';
import { BrowserRouter as Router, Routes, Route, Link } from 'react-router-dom';
// 动态加载路由组件
const Home = lazy(() => import('./pages/Home'));
const About = lazy(() => import('./pages/About'));
function AppRouter() {return (<Router><nav><ul><li><Link to="/">Home</Link></li><li><Link to="/about">About</Link></li></ul></nav>{/* 使用 Suspense 包裹路由 */}<Suspense fallback={<div>Loading...</div>}><Routes><Route path="/" element={<Home />} /><Route path="/about" element={<About />} /></Routes></Suspense></Router>);
}
export default AppRouter;
// src/router/routes.js  高级配置
import { lazy } from 'react';
const routes = [{path: '/',component: lazy(() => import('../pages/Home')),},{path: '/about',component: lazy(() => import('../pages/About')),}
];
export default routes;

4.3、Hooks

4.3.1、StateHook--useState

import React, { useState } from "react";
export default function Index() {// setXXX:更新状态的函数,状态更新是异步的const [count, setCount] = useState(0);const [name, setName] = useState("tom");function add() {setCount(count + 1); //第一种写法}function changeName() {setName("jerry");}return (<div><h1>当前求和为:{count}</h1><button onClick={add}>点我+1</button>{/*第二种写法 */}<button onClick={() => setCount(count - 1)}>点我-1</button><h1>当前求和为:{name}</h1><button onClick={changeName}>改名</button></div>);
}

参数:第一次初始化指定的值在内部作缓存

返回值:第一个为内部当前状态值,第2个为更新状态值的函数

4.3.2、EffectHook--useEffect

  useEffect(() => {let timer = setInterval(() => {setCount((count) => count + 1);}, 1000);return () => {clearInterval(timer);};},[]);

可以将它看作componentDidMount、componentDidupdate、componentWillUnmount三个函数的组合。

4.3.3、RefHook--useRef

  const inputRef = useRef(null);function getInputValue() {inputRef.current.focus();alert(inputRef.current.value);}return (<div><input type="text" ref={inputRef} /></div>);

总结:
useState:用于在函数组件中添加状态
useEffect:用于处理副作用,例如数据获取、订阅或手动更改 DOM。
useRef:用于创建可变引用,访问DOM元素,存储任何值,而不会触发组件重新渲染

4.4、Fragment

使用简写语法 <></>

<Fragment><p>First paragraph</p><p>Second paragraph</p>
</Fragment>
<>{items.map((item, index) => (<p key={index}>{item}</p>))}
</>

用途:

1、返回多个元素

2、动态生成多个元素

3、避免多余的包装元素,保持结构清晰

4.5、Context

Context在组件树中传递数据,不需要通过逐层传递props。它特别适用于全局状态管理。

Provider:提供上下文值,用于包裹组件树。
Consumer:消费上下文值,用于从上下文中获取值。

function C() {return (// const context = useContext(MyContext);<div className="grand"><h3>我是C组件</h3><h4>从A组件接收的用户名是:<Consumer>{(value) => `${value.username},年龄是:${value.age}`}</Consumer></h4></div>);
}

1、Provider 的作用域:
Provider 提供的上下文值只能在其子组件中访问。如果 C 组件也需要访问这些值,同样需要使用 Consumer 或 useContext。
2、类组件和函数组件的区别:
类组件需要使用 Consumer 来访问上下文值。
函数组件可以直接使用 useContext Hook。

4.6、组件优化(PureComponent)

场景:当子组件接收父组件的数据,父组件触发setState时,子组件也会改变,这样效率低

import React, { PureComponent } from "react";
import "./index.css";
export default class A extends PureComponent {state = { carName: "奔驰" };changeCar = () => {// this.setState({ carName: "宝马" });this.setState({});//这种情况下就不会再次触发render了// const obj=this.state// obj.carName="宝马"// console.log(obj===this.state);// this.setState(obj)};// shouldComponentUpdate(nextProps, nextState) {//   return !this.state.carName === nextState.carName;// }render() {console.log("A组件渲染了");const { carName } = this.state;return (<div className="parent"><h3>我是parent组件</h3><h4>我的用户名是:{carName}</h4><button onClick={this.changeCar}>点我换车</button><B carName={carName} /></div>);}
}
class B extends PureComponent {render() {console.log("B组件渲染了");return <div className="child">接到的车:{this.props.carName}</div>;}
}

低效率原因:

组件中的shouldComponentUpdate()总是返回true

高效率做法:

只有当组建的state或props数据发生改变时才重新render()

解决:

1、比较新旧数据,有变化再返回true,否则返回false

2、将Component改为PureComponent

注意:只是进行state和props数据的浅比较,如果只是数据对象内部变了,返回false,不要直接修改state数据,而是要产生 新数据

4.7、renderProps

import React, { Component } from "react";
import "./index.css";
export default class Parent extends Component {render() {return (<div className="parent"><h3>我是parent组件</h3><A render={(name) => <B name={name} />} /></div>);}
}
class A extends Component {state = { name: "tom" };render() {console.log("A组件渲染了", this.props);const { name } = this.state;return (<div className="a"><h3>A组件渲染了</h3>{this.props.render(name)}</div>);}
}
class B extends Component {render() {console.log("B组件渲染了");return (<div className="b"><h3>B组件渲染了,{this.props.name}</h3></div>);}
}

如何向组件内部动态传入带内容的结构(标签)?

vue中:

使用slot技术,也就是通过组件标签体传入结构 <A><B/></A>

React中:

使用children props:通过组件标签体传入结构

使用render props:通过组件标签属性传入结构,一般用render函数属性

4.8、错误边界(ErrorBoundary)

import React from 'react';
class ErrorBoundary extends React.Component {constructor(props) {super(props);this.state = { hasError: false };}static getDerivedStateFromError(error) {// 更新 state 以便下次渲染显示降级 UIreturn { hasError: true };}componentDidCatch(error, errorInfo) {// 你同样可以将错误日志记录到一个错误报告服务console.log(error, errorInfo);}render() {if (this.state.hasError) {// 渲染一个降级 UIreturn <h1>Something went wrong.</h1>;}return this.props.children; }
}
class MyComponent extends React.Component {render() {return (<div><button onClick={() => { throw new Error('Test'); }}>Click me</button></div>);}
}
function App() {return (<ErrorBoundary><MyComponent /></ErrorBoundary>);
}

它能够捕获其子组件树中发生的 JavaScript 错误,并能够显示一个后备 UI(而不是整个应用崩溃)。错误边界无法捕获以下错误:

(1)、它自身渲染过程中的错误;

(2)、生命周期方法中的错误(如 componentDidMountcomponentDidUpdate 等);

(3)、构造函数中的错误;

(4)、componentDidCatch 中的错误;

(5)、在try块之外进行的异步代码中的错误(因为这些错误不会传播到React的事件系统)。

相关文章:

react的redux总结

目录 一、Antd 1.1、基本使用 1.2、自定义主题 二、Redux 2.1、工作流程 2.2、理解react-redux 2.3、优化 2.3.1、简写mapDispatch 2.3.2、Provider组件 2.4、数据共享 2.4.1、编写Person组件 2.4.2、Person组件的reducer 2.4.3、完成数据共享 2.5、求和案例 2.…...

MySQL视图

一、视图的本质与分类 1. 定义 虚拟表&#xff1a;视图不存储数据&#xff0c;本质是保存的查询语句&#xff08;SELECT&#xff09;&#xff0c;每次访问视图时动态执行查询并返回结果。 逻辑抽象&#xff1a;基于一个或多个基表&#xff08;或视图&#xff09;创建&#xf…...

程序化广告行业(69/89):电商素材制作与展示策略解析

程序化广告行业&#xff08;69/89&#xff09;&#xff1a;电商素材制作与展示策略解析 在如今数字化营销的浪潮中&#xff0c;程序化广告成为众多企业精准触达目标客户的有力武器。作为一名在广告技术领域摸爬滚打多年的从业者&#xff0c;深知学习是不断进步的阶梯&#xff…...

【PCB工艺】发光二极管的原理

你真的知道发光二极管为什么会发光吗&#xff1f; 而为什么另一部分二极管不会发光呢&#xff1f; 这篇文章解释元器件发光二极管&#xff08;LED&#xff09;的底层原理。 发光二极管&#xff08;LED, Light Emitting Diode&#xff09; 是一种能够将电能转换为光能的半导体…...

探秘 DeepSeek:开源生态如何推动 AI 技术普惠?

探秘 DeepSeek:开源生态如何推动 AI 技术普惠? 引言 在人工智能(AI)领域,技术的快速发展和广泛应用正在深刻改变我们的生活。然而,AI 的发展往往伴随着资源和技术的集中化问题,大型科技公司凭借其雄厚的资金和人才优势占据了主导地位,而中小企业、研究机构和个人开发…...

远程主机可能不符合glibc和libstdc++ VS Code服务器的先决条件

这是因为我最近更新了vscode&#xff0c; 服务器中有个GLIBC库&#xff0c;VSCode>1.86.0版本对 低于v2.28.0版本的GLIBC不再满足需求。 解决办法 回退到之前能够连接服务器的版本。我之前用的是January 2025 (version 1.97) vscode旧版本下载地址...

JVM性能调优:参数配置×内存诊断×GC调优实战

&#x1f680;前言 “你的Java应用是否还在经历莫名卡顿&#xff1f;半夜被OOM报警惊醒&#xff1f;GC日志像天书看不懂&#xff1f; 本文将用20个真实案例50个关键参数&#xff0c;带你掌握&#xff1a; 参数调优&#xff1a;如何用-XX:UseG1GC让GC暂停从秒级降到毫秒级&…...

pg_waldump 使用方法和输出验证

目录 pg_waldump 使用方法和输出验证一、pg_waldump 基础用法二、验证输出文件正确性三、关键参数 -p 的作用四、验证示例五、注意事项 pg_waldump 使用方法和输出验证 一、pg_waldump 基础用法 命令格式 pg_waldump [选项] [WAL文件路径]-p, --pgdataDIR&#xff1a;指定 Pos…...

Android 定制飞行模式和通话中设置菜单置灰

业务背景 定制需求实现 目标&#xff1a;通话中禁用移动网络设置中的网络模式和APN入口。 Google原生行为分析 在原生Android中&#xff1a; 飞行模式&#xff1a; 无法在通话中开启&#xff1a;系统会自动阻止&#xff0c;因飞行模式会断开通话所需的射频。APN/网络模式修改…...

C# System.Text.Json 中 ReferenceHandling 使用详解

总目录 一、什么是 ReferenceHandling&#xff1f; 1. 概述 ReferenceHandling 是 System.Text.Json 中用于处理对象引用&#xff08;循环引用或重复引用&#xff09;的选项。它允许开发者在序列化和反序列化时控制如何处理对象之间的引用关系。 默认情况下&#xff0c;Syst…...

【开发经验】调试OpenBMC Redfish EventService功能

EventService功能是Redfish规范中定义的一种事件日志的发送方式。用户可以设置订阅者信息(通常是一个web服务器)&#xff0c;当产生事件日志时&#xff0c;OpenBMC可以根据用户设置的订阅者信息与对日志的筛选设置&#xff0c;将事件日志发送到订阅者。 相比于传统的SNMPTrap日…...

【AI工具】FastGPT:开启高效智能问答新征程

前言 在人工智能飞速发展的当下&#xff0c;各类 AI 工具如雨后春笋般涌现。FastGPT 作为一款基于大语言模型&#xff08;LLM&#xff09;的知识图谱问答系统&#xff0c;凭借其强大的数据处理和模型调校能力&#xff0c;为用户带来了便捷的使用体验。今天&#xff0c;就让我们…...

4.8学习总结 贪心算法+Stream流

贪心算法&#xff1a; 找到局部最优->从而推导全局最优。 Java练习&#xff1a; 获取随机验证码&#xff1a; import java.util.*; import java.util.function.BiConsumer; public class test {public static void main(String[] args) {System.out.println(createCode(…...

入选ICLR‘25 Spotlight!深度强化学习(DRL)迎来新突破!

近年来&#xff0c;深度强化学习相关的成果在顶会顶刊上接受度普遍较高&#xff0c;经常上榜ICLR、Nature、Science等。比如ICLR 2025上的一篇Spotlight&#xff0c;由清华团队提出&#xff0c;介绍了一种SmODE网路&#xff0c;让深度强化学习的控制更加丝滑&#xff01; 另外…...

【学习笔记】HTTP和HTTPS的核心区别及工作原理

一、基础概念 HTTP&#xff08;超文本传输协议&#xff09;&#xff1a;明文传输数据&#xff0c;默认端口80&#xff0c;容易被窃听或篡改。 HTTPS&#xff08;HTTP SSL/TLS&#xff09;&#xff1a;通过加密传输数据&#xff0c;默认端口443&#xff0c;保障安全性。 二、…...

gbase8s之数据字典导出脚本(完美)

有时我们需要将表结构转换成数据库设计文档&#xff08;WORD或者其他格式&#xff09;&#xff0c;这时需要使用脚本将表结构导出&#xff0c;转换成可用格式。 该脚本适用于GBase 8s小版本号在3.0之后的版本&#xff08;含有syscolumnsext、syscomments以及syscolcomments表&a…...

java整合socket通信全流程

前言 大家好,由于工作上业务的需要,在java项目中引入了socket通信,特此记录一下,用以备份,本文章中的socket通信实现了,服务端与客户端的双向通讯,以及二者之间的心跳通信,服务端重启之后,客户端的自动重连功能。 原理 Socket通信是计算机网络中常用的一种通信机制…...

【scikit-learn基础】--『预处理』之 正则化

数据的预处理是数据分析&#xff0c;或者机器学习训练前的重要步骤。 通过数据预处理&#xff0c;可以 提高数据质量&#xff0c;处理数据的缺失值、异常值和重复值等问题&#xff0c;增加数据的准确性和可靠性整合不同数据&#xff0c;数据的来源和结构可能多种多样&#xff…...

WHAT - React 使用 Hook 分离计算逻辑与渲染逻辑

目录 原始代码如何优化1. 函数式简洁风格2. hook 封装&#xff08;重点&#xff09;3. 性能优化 原始代码 const GoodList ({ goods }) > {if (goods.length 0) {return <>暂无数据</>;}let totalCount 0;let totalPrice 0;goods.forEach((good) > {tot…...

AI比人脑更强,因为被植入思维模型【49】冰山理论思维模型

giszz的理解&#xff1a;冰山一角&#xff0c;冰山理论并不深奥&#xff0c;就是这个意思。对我启发比较大的&#xff0c;就是人的一个行为&#xff0c;背后可能藏着行为、应对方式、感受、观点、期待、渴望、自我七个层次。更有一个扩展&#xff0c;就是每个人的自我&#xff…...

【Linux】Git的简单使用

&#x1f4dd;前言&#xff1a; 这篇文章我们来讲讲版本控制器Git&#xff0c;主要掌握一些简单的本地仓库与远端仓库之间的文件传输操作。 &#x1f3ac;个人简介&#xff1a;努力学习ing &#x1f4cb;个人专栏&#xff1a;Linux &#x1f380;CSDN主页 愚润求学 &#x1f30…...

【WebRTC】开源项目Webrtc-streamer介绍

WebRTC-Streamer 这是一个用于通过简单的信令机制&#xff08;参见 api&#xff09;流式传输 WebRTC 媒体源的实验项目&#xff0c;支持以下媒体源&#xff1a; 捕获设备 屏幕捕获 mkv 文件 RMTP/RTSP 源 同时该项目也兼容 WHEP 接口。 注意 * 在线演示已停止&#xff0c…...

Bigemap pro制作行政区域图

Bigemap pro制作行政区域图 第一步&#xff1a;打开bigemap pro软件&#xff0c;右上角加载更多矢量到地图上&#xff0c;加载出来需要的矢量数据&#xff0c;以北京市为例&#xff0c;如图所示&#xff1a; 第二步&#xff1a;在我的矢量图层&#xff0c;点击右键&#xff0c…...

Kotlin 和 spring-cloud-function 兼容问题

错误&#xff1a; [ERROR] Failed to execute goal org.jetbrains.kotlin:kotlin-maven-plugin:1.9.25:compile (compile) on project springdoc-openapi-starter-common: Compilation failure [ERROR] /opt/repository/org/springframework/cloud/spring-cloud-function-conte…...

OpenVINO是什么

OpenVINO&#xff08;Open Visual Inference and Neural Network Optimization&#xff09;是由英特尔&#xff08;Intel&#xff09;开发的一个开源工具套件&#xff0c;用于优化和加速深度学习模型的推理过程&#xff0c;特别是在计算机视觉、自然语言处理和生成式 AI 等领域…...

【学Rust写CAD】38 over_in 函数(alpha256补充方法)

源码 #[inline] // 内联优化标记 pub fn over_in(self, src: Argb, dst: Argb) -> Argb {// 计算目标alpha因子 self * src的alpha通道let dst_alpha self * src.alpha_t();// 预乘源和目标的颜色分量let src_rb src.rb() * self.0; // 源的红蓝分量乘以alpha因子let …...

球类(继承和多态)

父类Ball&#xff0c;设置为抽象类&#xff0c;调用get和set方法创建对象&#xff0c;将子类重写的功能函数抽象化。 // 抽象球类 abstract class Ball {private String name;private double radius; // 半径private double weight; // 重量private double price; // 价格// 构…...

苍穹外卖(1)-部分环境配置(git、数据库)

首先配置git 创建好本地仓库之后 把项目弄到远程仓库里去 先进行提交 &#xff0c;后进行推送 &#xff0c;然后gitee创建一个仓库 把这个url复制好 推送后会出来一个 点击推送&#xff0c;会让你输入gitee账号密码&#xff0c;输入自己的账号密码&#xff0c;就可以连接远程仓…...

避免误用strncmp与memcmp,strcpy与memcpy

(Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu) 注&#xff1a;使用说明部分参考豆包ai 1. 字符串与二进制流认知 许多时候&#xff0c;我们作为软件研发人员&#xff0c;会觉得 一段内存就是一串字符串&#xff1b;字符串就是一段内存&#xff1b; 概念上&#xff…...

华为欧拉系统安装docker

华为欧拉系统安装docker cat /etc/openEuler-release sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo vi /etc/yum.repos.d/docker-ce.repo dnf makecache dnf install https://download.docker.com/linux/centos…...

windows11怎么把notepad++添加到鼠标右键菜单?

在Windows 11中将Notepad添加到鼠标右键菜单&#xff0c;可通过以下两种方法实现&#xff1a; ​​方法一&#xff1a;手动修改注册表&#xff08;推荐&#xff09;​​ ​​打开注册表编辑器​​ 按下 Win R&#xff0c;输入 regedit 并回车 1 2 3 。 ​​定位注册表路径​​…...

HTML5笔记: 什么是HTML

HTML的全称为超文本标记语言&#xff0c;是一种标记语言。它包括一系列标签&#xff0c;通过这些标签可以将网络上的文档格式统一&#xff0c;使分散的Internet资源连接为一个逻辑整体。HTML文本是由HTML命令组成的描述性文本&#xff0c;HTML命令可以说明文字&#xff0c;图形…...

【WRF理论第十五期】WPS中输入geogrid二进制格式

WPS中输入geogrid二进制格式 基本概念&#xff1a;Geogrid二进制格式支持的数据类型 geotiff→tiff的规则说明类型1&#xff1a;主导类别字段&#xff08;Dominant Category Field&#xff09;类型2&#xff1a;连续字段&#xff08;Continuous Field&#xff09;类型3&#xf…...

《UNIX网络编程卷1:套接字联网API》第8章:基本UDP套接字编程深度解析

《UNIX网络编程卷1&#xff1a;套接字联网API》第8章&#xff1a;基本UDP套接字编程深度解析&#xff08;8000字图文实战&#xff09; 一、UDP协议核心特性与编程模型 1.1 UDP协议设计哲学 UDP&#xff08;User Datagram Protocol&#xff09; 是面向无连接的传输层协议&…...

【WPF】IOC控制反转的应用:弹窗但不互相调用ViewModel

全称&#xff1a;Inversion of Control&#xff0c;控制反转 场景&#xff1a;A页面需要调用B/C页面等&#xff0c;防止直接在VM中新建别的页面实例&#xff0c;使用IOC设计架构&#xff1b; 创建Service&#xff0c;在Service中实现页面的实例创建和定义页面输入输出参数。 在…...

解决制作CI流水线时的no host异常报错

方法介绍 使用 HostAliases 向 Pod /etc/hosts 文件添加条目 当dns配置以及其他选项不合理时&#xff0c;可以通过向pod的/etc/hosts添加条目&#xff0c;可以在pod级别覆盖对主机名的解析&#xff0c;可以通过pod spec的pod aliases来自定义添加条目。 默认的hosts文件内容 …...

(AI+医疗)2025最应该学习是--医学AI大模型LLM应用与开发

(AI医疗)2025最应该学习是–医学AI大模型LLM应用与开发!! AI技术正在为医学领域带来的现实变革。而实现这一切的核心&#xff0c;正是自然语言大模型&#xff08;LLM&#xff09;的应用与开发。 为什么医学AI是未来的风口&#xff1f; AI正在重塑医疗行业。从智能问诊到辅助…...

MCP+Deepseck王炸组合 | 附实战操作及其MCPserver | 可替代Manus,实现AGI

MCP介绍 MCP 是一个开放协议&#xff0c;它为应用程序向 LLM 提供上下文的方式进行了标准化。你可以将 MCP 想象成 AI 应用程序的 USB-C 接口。就像 USB-C 为设备连接各种外设和配件提供了标准化的方式一样&#xff0c;MCP 为 AI 模型连接各种数据源和工具提供了标准化的接口。…...

STM32学习之ARM内核自带的中断

&#x1f4e2;&#xff1a;如果你也对机器人、人工智能感兴趣&#xff0c;看来我们志同道合✨ &#x1f4e2;&#xff1a;不妨浏览一下我的博客主页【https://blog.csdn.net/weixin_51244852】 &#x1f4e2;&#xff1a;文章若有幸对你有帮助&#xff0c;可点赞 &#x1f44d;…...

Java 设计模式:工厂模式详解

Java 设计模式&#xff1a;工厂模式详解 工厂模式&#xff08;Factory Pattern&#xff09;是一种创建型设计模式&#xff0c;它通过将对象的创建过程封装到工厂类中&#xff0c;避免了直接使用 new 关键字创建对象&#xff0c;从而提高了代码的灵活性和可维护性。本文将介绍工…...

python内置标准模块--OS

内置标准模块–OS 在 Python 中&#xff0c;os 是一个内置标准模块&#xff0c;全称是 ​Operating System​&#xff08;操作系统&#xff09;。它的核心作用是与当前操作系统交互&#xff0c;提供对文件系统、进程管理、环境变量等操作系统功能的访问接口 1. os 模块的核心功…...

echart实现动态折线图(vue3+ts)

最近接到个任务&#xff0c;需要用vue3实现动态折线图。之前没有用过&#xff0c;所以一路坎坷&#xff0c;现在记录一下&#xff0c;以后也好回忆一下。 之前不清楚echart的绘制方式&#xff0c;以为是在第一秒的基础上绘制第二秒&#xff0c;后面实验过后&#xff0c;发现并…...

Web3(阶段一:入门)——椭圆曲线

一、快速概览 ECC 是一种基于有限域上椭圆曲线代数结构的公钥加​​密系统。它提供与 RSA 相当的安全性&#xff0c;但密钥长度要短得多&#xff0c;从而实现更快的计算速度和更低的资源使用率。ECC 广泛应用于各种应用&#xff0c;包括安全通信、数字签名和加密货币。 二、什…...

vue总结

1.vue是什么。 vue是javascript和html结合后的&#xff0c;实现了html的模块开发&#xff0c;并且样式和js互不影响。组件内的javascript逻辑只在组件内有效&#xff0c;当然父类可通过某些方法调用&#xff0c;但是彼此间没有影响。各个组件的样式&#xff0c;通过scope防止了…...

LCR 131. 砍竹子 I

文章目录 题意思路代码 题意 题目链接 思路 代码 class Solution { public:int cuttingBamboo(int bamboo_len) {if (bamboo_len 2)return 1;if (bamboo_len 3)return 2;if (bamboo_len 4)return 4;int x bamboo_len / 3;int ans pow(3, x);int y bamboo_len % 3;if …...

游戏引擎学习第210天

回顾并为今天的工作做准备 今天我们&#xff0c;进行一些编码工作。这部分的编码内容对那些对代码架构感兴趣的人非常有帮助&#xff0c;我认为今天的编码内容会很有教育意义&#xff0c;尤其是在展示一些代码转化的过程中&#xff0c;希望大家能够从中获得一些启发。 接下来…...

40--华为IPSec VPN实战指南:构建企业级加密通道

&#x1f6e1;️ 华为IPSec VPN实战指南&#xff1a;构建企业级加密通道 “当数据开始穿盔甲&#xff0c;黑客只能望’密’兴叹” —— 本文将手把手教你用华为设备搭建军用级加密隧道&#xff0c;从零开始构建网络长城&#xff01; 文章目录 &#x1f6e1;️ 华为IPSec VPN实战…...

go游戏后端开发28:胡牌算法实现

红中麻将胡牌逻辑开发文档 一、字牌与封牌的字典表构建 在开发红中麻将胡牌逻辑时&#xff0c;首先需要构建非字牌和封牌的字典表。在构建双层表时&#xff0c;需进行判断&#xff1a;若牌为风牌且索引 i 大于 6&#xff0c;则不进行处理。这是因为风牌包含东南西北中&#x…...

CNN注意力机制的进化史:深度解析10种注意力模块如何重塑卷积神经网络

&#x1f31f; 引言&#xff1a;注意力为何改变CNN的命运&#xff1f; 就像人类视觉会优先聚焦于重要信息&#xff0c;深度学习模型也需要"学会看重点"。从2018年SENet首提通道注意力&#xff0c;到2024年SSCA探索空间-通道协同效应&#xff0c;注意力机制正成为CNN…...

字符串与字符数组的对比

在 C 语言中&#xff0c;字符串 和 字符数组 密切相关&#xff0c;但又有重要区别。以下是它们的对比&#xff1a; 1. 基本定义 字符数组 (char array) 是一个固定大小的数组&#xff0c;元素类型是 char。可以存储字符序列&#xff0c;但不一定以 \0 结尾。例如&#xff1a;…...