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

关于Redux的学习(包括Redux-toolkit中间件)

目录

什么是 Redux ?

我为什么要用 Redux ?

我什么时候应该用 Redux ?

Redux 库和工具

React-Redux

Redux Toolkit

Redux DevTools 拓展

一个redux小示例

代码示例(很有用):

Redux 术语

Actions

Reducers

Store

Dispatch

Selectors

核心概念和原则

单一数据源

State 是只读的

使用 Reducer 纯函数进行更改

Redux-toolkit

目的

包含内容

安装

Redux-toolkit+react-redux实现同步修改

提交action传参

Redux与React - 异步状态操作


什么是 Redux ?

在一开始解决这个问题有助于我们理解 "Redux"。Redux 做了什么事?它帮助我们解决了什么问题?为什么我要用它?

Redux 是一个使用叫作 "actions" 的事件去管理和更新应用状态的模式和工具库。 它以集中式 Store(centralized store)的方式对整个应用中使用的状态进行集中管理,其规则确保状态只能以可预测的方式更新。

我为什么要用 Redux ?

当我们有多个组件需要共享和使用相同 state时,可能会变得很复杂,尤其是当这些组件位于应用程序的不同部分时。有时这可以通过 "提升 state " 到父组件来解决,但这并不总是有效。

解决这个问题的一种方法是从组件中提取共享 state,并将其放入组件树之外的一个集中位置。这样,我们的组件树就变成了一个大” view “,任何组件都可以访问 state 或触发 action,无论它们在树中的哪个位置!

通过定义和分离 state 管理中涉及的概念并强制执行维护 view 和 state 之间独立性的规则,代码变得更结构化和易于维护。

这就是 Redux 背后的基本思想:应用中使用集中式的全局状态来管理,并明确更新状态的模式,以便让代码具有可预测性。

我什么时候应该用 Redux ?

Redux 可帮助你处理共享状态的管理,但与任何工具一样,它也有权衡。有更多的概念需要学习,还有更多的代码需要编写。它还为你的代码添加了一些额外代码,并要求你遵循某些限制。这是短期和长期生产力之间的权衡。

Redux 在以下情况下更有用:

  • 在应用的大量地方,都存在大量的状态
  • 应用状态会随着时间的推移而频繁更新
  • 更新该状态的逻辑可能很复杂
  • 中型和大型代码量的应用,很多人协同开发

并非所有应用程序都需要 Redux。 花一些时间思考你正在构建的应用程序类型,并决定哪些工具最能帮助解决你正在处理的问题。

Redux 库和工具

Redux 是一个小型的独立 JS 库。 但是,它通常与其他几个包一起使用:

React-Redux

Redux 可以结合任何 UI 框架一起使用,最常与 React。React-Redux是我们的官方库。它让 React 组件与 Redux 有了交互,可以从 store 读取一些 state,可以通过 dispatch actions 来更新 store。

Redux Toolkit

Redux Toolkit 是我们推荐的编写 Redux 逻辑的方法。 它包含我们认为对于构建 Redux 应用程序必不可少的包和函数。 Redux Toolkit 构建在我们建议的最佳实践中,简化了大多数 Redux 任务,防止了常见错误,并使编写 Redux 应用程序变得更加容易。

Redux DevTools 拓展

Redux DevTools 拓展 可以显示 Redux 存储中状态随时间变化的历史记录。这允许你有效地调试应用程序,包括使用强大的技术,如“时间旅行调试”。

一个redux小示例

代码示例(很有用):

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head><body><button id="decrement">-</button><span id="count">0</span><button id="increment">+</button><script src="https://unpkg.com/redux@4.2.1/dist/redux.min.js"></script><script>// 1.定义reducer函数//作用:根据不同的action对象,返回不同的新的state// state: 管理的数据初始状态// action: 对象 type 标记当前想要做什么样的修改function reducer(state = { count: 0 }, action) {//数据不可变:基于原始状态生成一个新的状态if (action.type === 'INCREMENT') {return { count: state.count + 1 }}if (action.type === 'DECREMENT') {return { count: state.count - 1 }}return state}//2.使用reducer函数生成store实例const store = Redux.createStore(reducer);//3.通过store实例的subscribe订阅数据变化 //回调函数可以在每次state发生变化的时候自动执行store.subscribe(()=>{console.log('state变化了',store.getState());//5.通过store实例的getState方法获取最新状态更新到视图中document.getElementById('count').innerText=store.getState().count;})//4.通过store实例的dispatch函数提交action更改状态const inBtn = document.getElementById('increment')inBtn.addEventListener('click', () => {//增(发起action)store.dispatch({type:'INCREMENT'})})const dBtn = document.getElementById('decrement')dBtn.addEventListener('click', () => {//减(发起action)store.dispatch({type:'DECREMENT'})})</script></body></html>

简单来说

1.

redux的流程就是先创建一个函数叫reducer,这个函数有两个参数:

state,和action,根据action对应的行为来觉得某个数据的state变化,最后返回修改后的state

2.

用使用reducer函数生成store实例(Redux.createStore)

3.

store.subscribe回调函数:用来决定reducer返回之后应该做些什么。store.getState方法获取最新状态更新到视图中

4.

通过点击事件或者其他可以触发store.dispatch,参数为type值

流程:定义reducer=>定义store=>定义store.dispatch=>定义store.subscribe=>执行store.getState更新UI

Redux 术语

Actions

action 是一个具有 type 字段的普通 JavaScript 对象。你可以将 action 视为描述应用程序中发生了什么的事件.

type 字段是一个字符串,给这个 action 一个描述性的名字,比如"todos/todoAdded"。我们通常把那个类型的字符串写成“域/事件名称”,其中第一部分是这个 action 所属的特征或类别,第二部分是发生的具体事情。

action 对象可以有其他字段,其中包含有关发生的事情的附加信息。按照惯例,我们将该信息放在名为 payload 的字段中。

一个典型的 action 对象可能如下所示:

const addTodoAction = {type: 'todos/todoAdded',payload: 'Buy milk'
}

Reducers

reducer 是一个函数,接收当前的 state 和一个 action 对象,必要时决定如何更新状态,并返回新状态。函数签名是:(state, action) => newState你可以将 reducer 视为一个事件监听器,它根据接收到的 action(事件)类型处理事件。

Reducer 必需符合以下规则:

  • 仅使用 stateaction 参数计算新的状态值
  • 禁止直接修改 state。必须通过复制现有的 state 并对复制的值进行更改的方式来做 不可变更新(immutable updates)
  • 禁止任何异步逻辑、依赖随机值或导致其他“副作用”的代码

稍后我们将更多地讨论 reducer 的规则,包括为什么它们很重要以及如何正确地遵循它们。

reducer 函数内部的逻辑通常遵循以下步骤:

  • 检查 reducer 是否关心这个 action
    • 如果是,则复制 state,使用新值更新 state 副本,然后返回新 state
  • 否则,返回原来的 state 不变

下面是 reducer 的小例子,展示了每个 reducer 应该遵循的步骤:

const initialState = { value: 0 }function counterReducer(state = initialState, action) {// 检查 reducer 是否关心这个 actionif (action.type === 'counter/increment') {// 如果是,复制 `state`return {...state,// 使用新值更新 state 副本value: state.value + 1}}// 返回原来的 state 不变return state
}

Reducer 可以在内部使用任何类型的逻辑来决定新状态应该是什么,如 if/elseswitch、循环等等。

Store

当前 Redux 应用的状态存在于一个名为 store 的对象中。

store 是通过传入一个 reducer 来创建的,并且有一个名为 getState 的方法,它返回当前状态值:

import { configureStore } from '@reduxjs/toolkit'const store = configureStore({ reducer: counterReducer })console.log(store.getState())
// {value: 0}

Dispatch

Redux store 有一个方法叫 dispatch更新 state 的唯一方法是调用 store.dispatch() 并传入一个 action 对象。 store 将执行所有 reducer 函数并计算出更新后的 state,调用 getState() 可以获取新 state。

store.dispatch({ type: 'counter/incremented' })console.log(store.getState())
// {value: 1}

dispatch 一个 action 可以形象的理解为 "触发一个事件"。发生了一些事情,我们希望 store 知道这件事。 Reducer 就像事件监听器一样,当它们收到关注的 action 后,它就会更新 state 作为响应。

Selectors

Selector 函数可以从 store 状态树中提取指定的片段。随着应用变得越来越大,会遇到应用程序的不同部分需要读取相同的数据,selector 可以避免重复这样的读取逻辑:

const selectCounterValue = state => state.valueconst currentValue = selectCounterValue(store.getState())
console.log(currentValue)
// 2

核心概念和原则

总的来说,我们可以用三个核心概念来总结 Redux 设计背后的意图:

单一数据源

应用程序的全局状态作为对象存储在单个 store 中。任何给定的数据片段都应仅存在于一个位置,而不是在许多位置重复。

这样,随着事物的变化,可以更轻松地调试和检查应用的状态,并集中需要与整个应用程序交互的逻辑。

State 是只读的

更改状态的唯一方法是 dispatch 一个 action,这是一个描述所发生事件的对象。

这样,UI 就不会意外覆盖数据,并且更容易跟踪发生状态更新的原因。由于 actions 是普通的 JS 对象,因此可以记录、序列化、存储这些操作,并在以后重放这些操作以进行调试或测试。

使用 Reducer 纯函数进行更改

若要指定如何基于 action 更新状态树,请编写 reducer 函数。Reducers 是纯函数,它接收旧 state 和 action,并返回新 state。与任何其他函数一样,你可以将 Reducer 拆分为较小的函数以帮助完成工作,或者为常见任务编写可重用的 Reducer。

Redux-toolkit

目的

Redux工具包 致力于成为编写 Redux 逻辑的标准方式。它最初是为了帮助解决有关 Redux 的三个常见问题而创建的:

  • "配置一个 Redux store 过于复杂"
  • "做任何 Redux 的事情我都需要添加很多包"
  • "Redux 需要太多的样板代码"

无论你是要设置自己的第一个项目的全新的 Redux 用户,或是想简化现有应用程序的有经验的用户,Redux工具包可以帮助你让你的 Redux 代码更好。

包含内容

Redux工具包 包含了如下API:

  • configureStore(): 包装 createStore 以提供简化的配置选项和良好的默认预设。它可以自动组合你的切片 reducers,添加您提供的任何 Redux 中间件,默认情况下包含 redux-thunk ,并允许使用 Redux DevTools 扩展。

  • createReducer(): 为 case reducer 函数提供 action 类型的查找表,而不是编写switch语句。此外,它会自动使用immer库来让您使用普通的可变代码编写更简单的 immutable 更新,例如 state.todos [3] .completed = true

  • createAction(): 为给定的 action type string 生成一个 action creator 函数。函数本身定义了 toString(),因此它可以用来代替 type 常量。

  • createSlice(): 接受一个 reducer 函数的对象、切片名称和初始状态值,并且自动生成具有相应 action creators 和 action 类型的切片reducer。

  • createAsyncThunk: 接受一个 action type string 和一个返回 promise 的函数,并生成一个发起基于该 promise 的pending/fulfilled/rejected action 类型的 thunk。

  • createEntityAdapter: 生成一组可重用的 reducers 和 selectors,以管理存储中的规范化数据

  • createSelector组件 来自 Reselect 库,为了易用再导出。

安装

npm i @reduxjs/toolkit react-redux
  • npm i @reduxjs/toolkit react-redux:安装了 Redux Toolkit 和 React-Redux,适用于 React 应用中使用 Redux 的场景,提供了必要的工具来将 Redux 状态与 React 组件连接起来。

Redux-toolkit+react-redux实现同步修改

import { createSlice } from '@reduxjs/toolkit'const counterStore = createSlice({//模块名name: 'counter',//初始化stateinitialState: {count: 0},//修改状态的方法 同步方法 支持直接修改reducers: {inscrment(state) {state.count++;},decrment(state) {state.count--;}}
})//结构出来actionCreater函数
const { inscrment, decrment } = counterStore.actions;//获取reducer
const reducers = counterStore.reducer;//以按需导出的方式导出actionCreater (别的文件里导出这个文件时,写上方法名就能拿到)
export { inscrment, decrment }
//以默认导出的方式导出reducer
export default reducers
import { configureStore } from "@reduxjs/toolkit";
//导入子模块reducer
import counterReducer from './modules/counterStore'//把所有子模块给封装成根store
const store = configureStore({reducer: {counter: counterReducer}
})export default store
import React from 'react';
import ReactDOM from 'react-dom/client';
import './index.css';
import App from './App';
import reportWebVitals from './reportWebVitals';
import store from './store'
import {Provider} from 'react-redux'const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(<React.StrictMode><Provider store={store}><App /></Provider></React.StrictMode>
);// If you want to start measuring performance in your app, pass a function
// to log results (for example: reportWebVitals(console.log))
// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals
reportWebVitals();
import { useDispatch, useSelector } from "react-redux";
//导入actionCreater
import { inscrment, decrment } from './store/modules/counterStore'
function App() {const { count } = useSelector(state => state.counter)//这里的state.counter就是根store里给的counterconst dispatch = useDispatch();return (<div className="App"><button onClick={() => dispatch(decrment())}>-</button>{count}<button onClick={() => dispatch(inscrment())}>+</button></div>);
}export default App;

提交action传参

import { createSlice } from '@reduxjs/toolkit'const counterStore = createSlice({//模块名name: 'counter',//初始化stateinitialState: {count: 0},//修改状态的方法 同步方法 支持直接修改reducers: {inscrment(state) {state.count++;},decrment(state) {state.count--;},addTonum(state, action) {       //这里的action就是组件那边传的值state.count = action.payload;}}
})//结构出来actionCreater函数
const { inscrment, decrment, addTonum } = counterStore.actions;//获取reducer
const reducers = counterStore.reducer;//以按需导出的方式导出actionCreater (别的文件里导出这个文件时,写上方法名就能拿到)
export { inscrment, decrment, addTonum }
//以默认导出的方式导出reducer
export default reducers
import { useDispatch, useSelector } from "react-redux";
//导入actionCreater
import { inscrment, decrment, addTonum } from './store/modules/counterStore'
function App() {const { count } = useSelector(state => state.counter)//这里的state.counter就是根store里给的counterconst dispatch = useDispatch();return (<div className="App"><button onClick={() => dispatch(decrment())}>-</button>{count}<button onClick={() => dispatch(inscrment())}>+</button><button onClick={() => dispatch(addTonum(10))}>add To 10</button><button onClick={() => dispatch(addTonum(20))}>add To 20</button></div>);
}export default App;

Redux与React - 异步状态操作

import { useDispatch, useSelector } from "react-redux";
//导入actionCreater
import { inscrment, decrment, addTonum } from './store/modules/counterStore'
import { fetchChannlList } from "./store/modules/channelStore";
import { useEffect } from "react";
function App() {const { count } = useSelector(state => state.counter)const { channelList } = useSelector(state => state.channel)//这里的state.counter就是根store里给的counterconst dispatch = useDispatch();//使用useEffect触发异步请求执行useEffect(() => {dispatch(fetchChannlList())}, [dispatch])return (<div className="App"><button onClick={() => dispatch(decrment())}>-</button>{count}<button onClick={() => dispatch(inscrment())}>+</button><button onClick={() => dispatch(addTonum(10))}>add To 10</button><button onClick={() => dispatch(addTonum(20))}>add To 20</button><ul>{channelList.map(item => <li key={item.id}>{item.name}</li>)}</ul></div>);
}export default App;
import { createSlice } from "@reduxjs/toolkit";
import axios from 'axios'
const channelStore = createSlice({name:'channel',initialState:{channelList:[]},reducers:{setChannels(state,action){state.channellist = action.payload}}
})// 异步请求部分
const {setChannels} = channelStore.actions;const fetchChannlList = ()=>{return async (dispatch)=>{const res = await axios.get('https://geek.itheima.net/v1_0/channels')dispatch(setChannels(res.data.data.channels))}
}export {fetchChannlList}const reducer = channelStore.reducer;
export default reducer
import { configureStore } from "@reduxjs/toolkit";
//导入子模块reducer
import counterReducer from './modules/counterStore'
import channelReducer from './modules/channelStore'//把所有子模块给封装成根store
const store = configureStore({reducer: {counter: counterReducer,channel: channelReducer}
})export default store

相关文章:

关于Redux的学习(包括Redux-toolkit中间件)

目录 什么是 Redux &#xff1f; 我为什么要用 Redux &#xff1f; 我什么时候应该用 Redux &#xff1f; Redux 库和工具 React-Redux Redux Toolkit Redux DevTools 拓展 一个redux小示例 代码示例(很有用)&#xff1a; Redux 术语 Actions Reducers Store Dis…...

【无人机】

GJI Mini 4 Pro学习 首次飞行使用 01 开箱 打开长飞套装 依次取出产品及配件 飞行器、DJI RC - N2&#xff08;DJI RC 2&#xff09;、桨叶/螺丝、云台保护罩、束桨器、电池、螺丝刀、USB-C快接线、单肩包、USB-C数据线、充电管家 02 准备飞行器 取下束桨器&#xff0c;…...

Zabbix7.0.6的容器镜像准备

准备Zabbix7.0.6部署所需的容器镜像。 更新时间&#xff1a;20241122 一、准备数据库镜像 1、核对版本支持 根据Zabbix官网文档requirements 可知&#xff0c;当前最新的Zabbix 7.0.6对PostgreSQL数据库的要求如下&#xff1a; support for PostgreSQL versions:- 17.X …...

利用 GitHub 和 Hexo 搭建个人博客【保姆教程】

利用 GitHub 和 Hexo 搭建个人博客 利用 GitHub 和 Hexo 搭建个人博客一、前言二、准备工作&#xff08;一&#xff09;安装 Node.js 和 Git&#xff08;二&#xff09;注册 GitHub 账号 三、安装 Hexo&#xff08;一&#xff09;创建博客目录&#xff08;二&#xff09;安装 H…...

React第四节 组件的三大属性之state

前言 状态 state适用于类式组件中&#xff0c;而再函数式组件中需要使用 useState HOOK 模拟状态; React的组件就是一个状态机&#xff0c;通过与用户的交互&#xff0c;实现不同的状态&#xff0c;根据不同的状态展现出不一样的UI视图 并不是组件中所有的属性 都是组件的状态…...

MongoDB进阶篇-索引(索引概述、索引的类型、索引相关操作、索引的使用)

文章目录 1. 索引概述2. 索引的类型2.1 单字段索引2.2 复合索引2.3 其他索引2.3.1 地理空间索引&#xff08;Geospatial Index&#xff09;2.3.2 文本索引&#xff08;Text Indexes&#xff09;2.3.3 哈希索引&#xff08;Hashed Indexes&#xff09; 3. 索引相关操作3.1 查看索…...

使用FFmpeg实现视频与GIF的画中画效果

用FFmpeg命令行工具将GIF动画作为画中画&#xff08;Picture-in-Picture&#xff0c;简称PiP&#xff09;叠加到视频上。FFmpeg是一个强大的多媒体框架&#xff0c;能够处理几乎所有格式的音频和视频文件。通过这个教程&#xff0c;你将学会如何将一个小的GIF动画循环播放&…...

车载信息安全框架 --- 车载信息安全相关事宜

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 所有人的看法和评价都是暂时的,只有自己的经历是伴随一生的,几乎所有的担忧和畏惧,都是来源于自己的想象,只有你真的去做了,才会发现有多快乐。…...

Unreal5从入门到精通之EnhancedInput增强输入系统详解

前言 从Unreal5开始,老版的输入系统,正式替换为EnhancedInput增强型输入系统,他们之间有什么区别呢? 如果有使用过Unity的同学,大概也知道,Unity也在2020版本之后逐渐把输入系统也升级成了新版输入系统,为什么Unreal和Unity都热衷于升级输入系统呢?这之间又有什么联系…...

泛微E9与金蝶云星空的集成方案:实现审批流程与财务管理的无缝对接

泛微E9与金蝶云星空的集成方案&#xff1a;实现审批流程与财务管理的无缝对接 背景介绍&#xff1a; 在企业日常运营中&#xff0c;泛微OA-E9和金蝶云星空是两个关键的系统。泛微OA-E9是一款广受企业青睐的办公自动化软件&#xff0c;它通过流程管理、文档管理、协同办公等模…...

理解设计模式与 UML 类图:构建稳健软件架构的基石

在软件开发的广阔天地里&#xff0c;设计模式与 UML&#xff08;统一建模语言&#xff09;类图犹如两座灯塔&#xff0c;为开发者照亮前行的道路&#xff0c;指引着我们构建出高质量、可维护且易于扩展的软件系统。今天&#xff0c;就让我们一同深入探索单一职责、开闭原则、简…...

FastAPI重载不生效?解决PyCharm中Uvicorn无法重载/重载缓慢的终极方法!

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 重载缓慢 📒📝 问题概述🚨 相关原因📝 解决方案一📝 解决方案二📝 解决方案三📝 解决方案四⚓️ 相关链接 ⚓️📖 介绍 📖 在使用FastAPI开发时,reload=True 本应让你在修改代码后自动重启服务,提升开发效率…...

最新子比主题zibll8.0开心版源码 无加密无后门

Zibll子比主题专为博客、自媒体及资讯类网站精心打造&#xff0c;以其简约而不失高雅的设计风格&#xff0c;为网站增添独特魅力与视觉美感。 8.0更新内容: 新增发帖选择板块、话题、标签时支持搜索&#xff0c;同时优化了选择栏目&#xff0c;更加方便快捷 新增小工具文章列表…...

【数据分析】认清、明确

1、什么是数据分析。 - 通过对大量的数据进行科学的分析。 - 得出结论&#xff0c;提出建议&#xff0c;辅助公司企业的决策。2、数据分析分为几步。 - 1.明确目的! - 2.收集数据!自己的数据! 自动化采集的数据! - 3.数据处理! - 4.数据分析!数据分析(业务)数据挖掘(代码算法…...

工业生产安全-安全帽第二篇-用java语言看看opencv实现的目标检测使用过程

一.背景 公司是非煤采矿业&#xff0c;核心业务是采选&#xff0c;大型设备多&#xff0c;安全风险因素多。当下政府重视安全&#xff0c;头部技术企业的安全解决方案先进但价格不低&#xff0c;作为民营企业对安全投入的成本很敏感。利用我本身所学&#xff0c;准备搭建公司的…...

人工智能(AI)与机器学习(ML)基础知识

目录 1. 人工智能与机器学习的核心概念 什么是人工智能&#xff08;AI&#xff09;&#xff1f; 什么是机器学习&#xff08;ML&#xff09;&#xff1f; 什么是深度学习&#xff08;DL&#xff09;&#xff1f; 2. 机器学习的三大类型 &#xff08;1&#xff09;监督式学…...

得物彩虹桥架构演进之路-负载均衡篇

文 / 新一 一、前言 一年一更的彩虹桥系列又来了&#xff0c;在前面两期我们分享了在稳定性和性能2个层面的一些演进&优化思路。近期我们针对彩虹桥 Proxy 负载均衡层面的架构做了一次升级&#xff0c;目前新架构已经部署完成&#xff0c;生产环境正在逐步升级中&#xf…...

Jmeter中的断言(四)

13--XPath断言 功能特点 数据验证&#xff1a;验证 XML 响应数据是否包含或不包含特定的字段或值。支持 XPath 表达式&#xff1a;使用 XPath 表达式定位和验证 XML 数据中的字段。灵活配置&#xff1a;可以设置多个断言条件&#xff0c;满足复杂的测试需求。 配置步骤 添加…...

vue2 src_Todolist编辑($nextTick)

main.js //引入Vue import Vue from "vue"; //引入App import App from ./App;//关闭Vue的生产提示 Vue.config.productionTip false;new Vue({el: #app,render: h > h(App),beforeCreate() {//事件总线Vue.prototype.$bus this;} });App.vue <template>…...

driver.js实现页面操作指引

概述 在访问某些网站的时候&#xff0c;第一次进去你会发现有个操作指引&#xff0c;本文引用driver.js&#xff0c;教你在你的页面也加入这般高大上的操作指引。 实现效果 实现 driver.js简介 driver.js是一个功能强大且高度可定制的基于原生JavaScript开发的新用户引导库…...

springboot 百货中心供应链管理系统小程序

一、前言 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;百货中心供应链管理系统被用户普遍使用&#xff0c;为方…...

23-Oracle 23 ai 区块链表(Blockchain Table)

小伙伴有没有在金融强合规的领域中遇见&#xff0c;必须要保持数据不可变&#xff0c;管理员都无法修改和留痕的要求。比如医疗的电子病历中&#xff0c;影像检查检验结果不可篡改行的&#xff0c;药品追溯过程中数据只可插入无法删除的特性需求&#xff1b;登录日志、修改日志…...

如何将联系人从 iPhone 转移到 Android

从 iPhone 换到 Android 手机时&#xff0c;你可能需要保留重要的数据&#xff0c;例如通讯录。好在&#xff0c;将通讯录从 iPhone 转移到 Android 手机非常简单&#xff0c;你可以从本文中学习 6 种可靠的方法&#xff0c;确保随时保持连接&#xff0c;不错过任何信息。 第 1…...

数据链路层的主要功能是什么

数据链路层&#xff08;OSI模型第2层&#xff09;的核心功能是在相邻网络节点&#xff08;如交换机、主机&#xff09;间提供可靠的数据帧传输服务&#xff0c;主要职责包括&#xff1a; &#x1f511; 核心功能详解&#xff1a; 帧封装与解封装 封装&#xff1a; 将网络层下发…...

(转)什么是DockerCompose?它有什么作用?

一、什么是DockerCompose? DockerCompose可以基于Compose文件帮我们快速的部署分布式应用&#xff0c;而无需手动一个个创建和运行容器。 Compose文件是一个文本文件&#xff0c;通过指令定义集群中的每个容器如何运行。 DockerCompose就是把DockerFile转换成指令去运行。 …...

多模态大语言模型arxiv论文略读(108)

CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文标题&#xff1a;CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文作者&#xff1a;Sayna Ebrahimi, Sercan O. Arik, Tejas Nama, Tomas Pfister ➡️ 研究机构: Google Cloud AI Re…...

Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?

在大数据处理领域&#xff0c;Hive 作为 Hadoop 生态中重要的数据仓库工具&#xff0c;其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式&#xff0c;很多开发者常常陷入选择困境。本文将从底…...

CSS设置元素的宽度根据其内容自动调整

width: fit-content 是 CSS 中的一个属性值&#xff0c;用于设置元素的宽度根据其内容自动调整&#xff0c;确保宽度刚好容纳内容而不会超出。 效果对比 默认情况&#xff08;width: auto&#xff09;&#xff1a; 块级元素&#xff08;如 <div>&#xff09;会占满父容器…...

佰力博科技与您探讨热释电测量的几种方法

热释电的测量主要涉及热释电系数的测定&#xff0c;这是表征热释电材料性能的重要参数。热释电系数的测量方法主要包括静态法、动态法和积分电荷法。其中&#xff0c;积分电荷法最为常用&#xff0c;其原理是通过测量在电容器上积累的热释电电荷&#xff0c;从而确定热释电系数…...

push [特殊字符] present

push &#x1f19a; present 前言present和dismiss特点代码演示 push和pop特点代码演示 前言 在 iOS 开发中&#xff0c;push 和 present 是两种不同的视图控制器切换方式&#xff0c;它们有着显著的区别。 present和dismiss 特点 在当前控制器上方新建视图层级需要手动调用…...