React知识盲点——组件通信、性能优化、高级功能详解(大纲)
组件通信
React 组件通信详解
在 React 中,组件通信是一个核心概念,主要指的是如何让不同的组件共享和传递数据。React 提供了多种机制来实现组件间的数据传递和状态共享。以下是几种常见的组件通信方式,包括:父子组件通信(props)、子父组件通信(回调函数传递数据)、Context API(跨层级共享状态) 和 自定义 Hooks(共享逻辑)。
1. 父子组件通信(通过 props
)
概念:
在 React 中,父组件可以通过 props
向子组件传递数据。props
是只读的,因此子组件不能直接修改 props
的值,只能通过它来展示数据或传递给其他子组件。
如何工作:
- 父组件通过在子组件的 JSX 标签中传递属性来向子组件传递数据。
- 子组件通过
props
接收数据并渲染或执行其他逻辑。
使用场景:
- 适用于父组件向子组件传递单向数据流。
- 父组件控制的状态可以通过
props
传递给多个子组件。
示例:
function Parent() {const parentData = "Hello from parent!";return <Child data={parentData} />;
}function Child(props) {return <h1>{props.data}</h1>;
}
在这个例子中,父组件 Parent
通过 props
向子组件 Child
传递了数据 parentData
,而子组件则通过 props.data
来使用该数据。
注意:
props
是不可变的,子组件不能修改props
,只能读取和展示。- 数据是从父组件流向子组件的,遵循单向数据流。
2. 子父组件通信(通过回调函数传递数据)
概念:
子组件可以通过调用父组件传递给它的回调函数,向父组件发送数据。这是一种典型的 自下而上的通信方式,即子组件将数据传递回父组件。
如何工作:
- 父组件定义回调函数,并通过
props
将回调函数传递给子组件。 - 子组件通过调用该回调函数并传递参数,将数据发送给父组件。
使用场景:
- 适用于需要在子组件中操作数据并将其反馈给父组件的场景。
- 用于处理父组件中的状态更新。
示例:
function Parent() {const [data, setData] = useState("");const handleDataChange = (newData) => {setData(newData);};return (<div><Child onDataChange={handleDataChange} /><p>Data from child: {data}</p></div>);
}function Child(props) {const sendDataToParent = () => {props.onDataChange("Hello from Child!");};return <button onClick={sendDataToParent}>Send Data to Parent</button>;
}
在这个例子中,父组件 Parent
定义了一个回调函数 handleDataChange
,并通过 props.onDataChange
将其传递给子组件 Child
。子组件在点击按钮时调用 props.onDataChange
,将数据传递给父组件,从而更新父组件的状态。
注意:
- 子组件通过调用父组件传递的回调函数来“通知”父组件更新数据。
- 这种方式使得子组件不需要直接修改父组件的状态,保持了单向数据流。
3. Context API(跨层级共享状态)
概念:
Context API
是 React 提供的一个强大工具,用于跨多个组件传递数据。Context
可以让你在组件树的深层次直接共享数据,而无需通过逐层传递 props
。
如何工作:
- 使用
React.createContext
创建一个上下文(Context),该上下文可以提供和消费数据。 - 父组件通过
Context.Provider
向子组件树提供数据。 - 子组件通过
Context.Consumer
或useContext
来消费数据。
使用场景:
- 适用于全局数据(如主题、语言、认证状态等)的共享。
- 解决了多层组件嵌套时需要传递
props
的问题,避免了“prop drilling”问题。
示例:
// 创建 Context
const ThemeContext = React.createContext('light');function Parent() {return (<ThemeContext.Provider value="dark"><Child /></ThemeContext.Provider>);
}function Child() {const theme = useContext(ThemeContext);return <h1>Current theme: {theme}</h1>;
}
在这个例子中,ThemeContext.Provider
将 theme
的值传递给子组件 Child
,而 Child
通过 useContext(ThemeContext)
获取该值并渲染。
注意:
- 使用
Context API
时,任何使用Context.Consumer
或useContext
的组件都会在上下文的值变化时重新渲染。 - 如果需要频繁地更新上下文的值,可能会导致性能问题,因此可以考虑拆分多个 Context 来优化性能。
4. 自定义 Hooks(共享逻辑)
概念:
自定义 Hook 是 React 中的一种复用组件逻辑的方式。通过将逻辑封装到自定义 Hook 中,可以使多个组件共享相同的逻辑,而不需要通过传递 props
或使用 Context
。
如何工作:
- 自定义 Hook 是一个 JavaScript 函数,它可以使用 React 内置的 Hook(如
useState
、useEffect
等),并返回一些状态或行为,供多个组件共享。 - 自定义 Hook 可以用于封装业务逻辑,使其可以在多个组件之间复用。
使用场景:
- 用于共享具有副作用的逻辑(如数据获取、事件处理、表单状态等)。
- 用于避免代码重复,提高组件的可维护性。
示例:
// 自定义 Hook 用于获取窗口宽度
function useWindowWidth() {const [width, setWidth] = useState(window.innerWidth);useEffect(() => {const handleResize = () => setWidth(window.innerWidth);window.addEventListener('resize', handleResize);return () => window.removeEventListener('resize', handleResize);}, []);return width;
}function App() {const width = useWindowWidth();return <h1>Window width: {width}px</h1>;
}
在这个例子中,useWindowWidth
是一个自定义 Hook,它封装了获取窗口宽度的逻辑,并可以在多个组件中复用。
注意:
- 自定义 Hook 可以包含状态、生命周期方法(
useEffect
)和其他 React Hook。 - 使用自定义 Hook 不会改变组件的渲染逻辑,它只是将逻辑从组件中提取出来,便于复用。
总结
React 提供了多种组件通信方式来管理和传递数据,以下是每种方式的简要总结:
- 父子组件通信(
props
):父组件通过props
向子组件传递数据,保持单向数据流。 - 子父组件通信(回调函数传递数据):子组件通过调用父组件传递的回调函数来向父组件传递数据。
- Context API(跨层级共享状态):通过
Context
让数据跨越多个组件层级传递,避免props
嵌套传递(prop drilling)。 - 自定义 Hooks(共享逻辑):通过自定义 Hook 提取并复用逻辑,使多个组件共享相同的行为或状态。
理解这些通信方式并合理应用,可以帮助你构建更灵活、可维护的 React 应用程序。
性能优化
React 性能优化详解
React 性能优化是前端开发中非常重要的一部分,尤其是在构建复杂的应用时。React 提供了多种优化技术和工具来提升渲染性能,减少不必要的渲染和更新,确保用户体验的流畅性。以下是 React 性能优化的几种常见方式,具体包括:React.memo
、useMemo
、useCallback
、shouldComponentUpdate
、React Profiler
以及懒加载与代码分割(React.lazy
& Suspense
)。
1. React.memo
概念:
React.memo
是 React 的一个高阶组件,用于优化函数组件的性能。它通过浅比较 props,避免在 props 不变时重新渲染组件。
如何工作:
React.memo
对组件进行包裹,使其在 props 未变化时跳过重新渲染。只有在 props 发生变化时,才会重新渲染组件。
使用场景:
React.memo
适用于纯函数组件(没有副作用的组件),特别是在高频渲染的场景下,能显著提高性能。
示例:
const MyComponent = React.memo(function MyComponent(props) {console.log("Rendering MyComponent");return <div>{props.name}</div>;
});function App() {const [count, setCount] = useState(0);return (<div><MyComponent name="React" /><button onClick={() => setCount(count + 1)}>Increment</button></div>);
}
在这个例子中,MyComponent
组件只有在 name
props 发生变化时才会重新渲染,点击按钮会更新 count
,但是 MyComponent
不会因为 count
的变化而重新渲染。
注意:
React.memo
默认使用浅比较来检测props
是否发生变化。如果需要更复杂的比较,可以提供自定义的compare
函数。
const MyComponent = React.memo(function MyComponent(props) {return <div>{props.name}</div>;
}, (prevProps, nextProps) => prevProps.name === nextProps.name);
2. useMemo
概念:
useMemo
是 React 的一个 Hook,用于记忆计算结果。它能确保某些计算只在依赖项发生变化时重新计算,而在依赖项不变时直接返回缓存的值,从而减少不必要的计算。
如何工作:
useMemo
会返回一个记忆化的值,只有当依赖项发生变化时才会重新计算。如果依赖项没有变化,React 会返回之前计算的缓存值。
使用场景:
- 适用于开销较大的计算,如复杂的排序、过滤、数据转换等。
- 用来避免不必要的渲染和计算。
示例:
function App() {const [count, setCount] = useState(0);const [items, setItems] = useState([1, 2, 3]);const sortedItems = useMemo(() => {return [...items].sort();}, [items]); // 只有 items 发生变化时才会重新计算return (<div><p>Count: {count}</p><button onClick={() => setCount(count + 1)}>Increment</button><ul>{sortedItems.map(item => (<li key={item}>{item}</li>))}</ul></div>);
}
在这个例子中,sortedItems
只在 items
数组发生变化时才会重新排序计算,否则它会返回之前的排序结果。
注意:
useMemo
只会在其依赖项发生变化时重新计算。它用于缓存值而不是缓存渲染。- 在某些情况下,
useMemo
会增加额外的内存开销,因此需要根据具体情况来决定是否使用。
3. useCallback
概念:
useCallback
是 React 的一个 Hook,用于记忆回调函数。它的作用与 useMemo
类似,只是用于记忆函数,而不是值。useCallback
会返回一个记忆化的函数实例,只有在依赖项发生变化时才会重新创建该函数。
如何工作:
useCallback
确保只有在依赖项发生变化时,回调函数才会被重新创建。否则,React 会返回上次渲染时使用的同一个函数实例。
使用场景:
- 当回调函数被传递给子组件,并且子组件使用
React.memo
时,可以通过useCallback
来避免不必要的重新渲染。 - 用于避免每次渲染时创建新的函数实例,尤其是那些作为 props 传递给子组件的函数。
示例:
function Parent() {const [count, setCount] = useState(0);const increment = useCallback(() => {setCount(c => c + 1);}, []); // `increment` 函数只有在 `count` 发生变化时才会重新创建return <Child onClick={increment} />;
}const Child = React.memo(({ onClick }) => {console.log("Child rendered");return <button onClick={onClick}>Increment</button>;
});
在这个例子中,Child
组件只有在 increment
函数发生变化时才会重新渲染。通过 useCallback
,increment
函数只会在初始渲染时创建,之后会一直重用。
注意:
useCallback
适合用于回调函数的传递,但过度使用可能导致代码更复杂,性能优化的收益不明显。
4. shouldComponentUpdate
概念:
shouldComponentUpdate
是类组件中的一个生命周期方法,用于控制组件是否需要重新渲染。它接收 nextProps
和 nextState
作为参数,如果返回 false
,React 会跳过该组件的渲染过程,从而优化性能。
如何工作:
shouldComponentUpdate
允许开发者在组件的 props
或 state
变化时,手动决定是否执行重新渲染。该方法默认返回 true
,表示每次更新都会重新渲染组件。如果返回 false
,则会跳过渲染。
使用场景:
- 用于优化高频渲染的组件。
- 如果组件的
props
或state
没有变化,就可以通过返回false
来避免不必要的渲染。
示例:
class MyComponent extends React.Component {shouldComponentUpdate(nextProps, nextState) {if (nextProps.value !== this.props.value) {return true;}return false;}render() {return <div>{this.props.value}</div>;}
}
在这个例子中,只有当 props.value
发生变化时,shouldComponentUpdate
会返回 true
,否则返回 false
,从而避免不必要的渲染。
5. React Profiler
概念:
React Profiler
是 React 的一个内置性能分析工具,用于帮助开发者识别组件的渲染性能瓶颈。它可以显示哪些组件渲染的时间过长,并提供有关渲染次数、渲染时间等详细信息。
如何工作:
React Profiler 是通过 Profiler
组件使用的。它允许你在开发过程中跟踪每个渲染的性能数据。
使用场景:
- 用于分析和诊断 React 应用的性能瓶颈。
- 适用于长时间运行的大型应用。
示例:
import { Profiler } from 'react';function onRenderCallback(id, phase, actualDuration, baseDuration, startTime, commitTime) {console.log(`Rendered ${id} during ${phase} phase`);console.log(`Actual Duration: ${actualDuration}`);console.log(`Base Duration: ${baseDuration}`);
}function App() {return (<Profiler id="App" onRender={onRenderCallback}><MyComponent /></Profiler>);
}
在这个例子中,Profiler
会监控 MyComponent
的渲染性能,并通过 onRenderCallback
回调函数输出性能数据。
注意:
- React Profiler 只在开发模式下启用,在生产模式下不会记录性能数据。
- 它可以帮助定位性能瓶颈,但不能自动修复性能问题。
6. 懒加载与代码分割(React.lazy & Suspense)
概念:
懒加载和代码分割是一种优化性能的技术,通过将应用的代码拆分成更小的块,按需加载,从而减少初次加载时的 JavaScript 文件大小。
- React.lazy:React 提供的一个 API,用于懒加载组件
。
- Suspense:React 提供的一个组件,用于包装懒加载的组件,并在加载过程中提供回退界面(loading 状态)。
如何工作:
- 使用
React.lazy
动态导入组件,并在Suspense
中包裹它,指定加载过程中显示的 UI。
示例:
import React, { Suspense } from 'react';// 使用 React.lazy 动态导入组件
const MyComponent = React.lazy(() => import('./MyComponent'));function App() {return (<Suspense fallback={<div>Loading...</div>}><MyComponent /></Suspense>);
}
在这个例子中,MyComponent
组件会在实际需要的时候懒加载,加载过程中会显示 <div>Loading...</div>
作为回退界面。
使用场景:
- 用于拆分大型应用,减少初始加载时间。
- 适用于那些在初始渲染时不需要立即加载的部分。
总结
通过合理使用 React.memo
、useMemo
、useCallback
、shouldComponentUpdate
、React Profiler
和懒加载技术(如 React.lazy
和 Suspense
),可以显著提高 React 应用的性能。这些工具和方法有助于减少不必要的渲染、避免性能瓶颈,并优化页面加载速度和响应时间。
高级功能
React 高级功能详解
React 提供了多种高级功能,使开发者能够更灵活、模块化地构建应用程序。以下是一些 React 中的高级功能及其详细解释,包括:动态导入(React.lazy)、Suspense 与错误边界、React Portals、高阶组件(HOC)、Render Props、自定义 Hooks 和 Context API 优化。
1. 动态导入(React.lazy)
概念:
React.lazy
允许你按需加载(懒加载)组件。它是 React 提供的一个 API,能够动态地加载模块,减少初始页面加载的文件大小,从而提高性能。React.lazy
配合 Suspense
使用可以优雅地处理异步组件加载。
如何工作:
React.lazy
通过import()
来异步加载一个组件。Suspense
负责处理组件加载期间的状态,例如展示加载指示器。
使用场景:
- 适用于大型应用,特别是在有多个路由或复杂的组件时,使用
React.lazy
可以按需加载,减少不必要的初始加载时间。
示例:
import React, { Suspense } from 'react';// 动态导入组件
const MyComponent = React.lazy(() => import('./MyComponent'));function App() {return (<div><Suspense fallback={<div>Loading...</div>}><MyComponent /></Suspense></div>);
}
在这个示例中,MyComponent
会在需要的时候懒加载,Suspense
会在加载过程中显示 Loading...
。
注意:
React.lazy
只能用来加载默认导出的组件。- 当多个懒加载组件时,可以通过 Suspense 的
fallback
属性定制加载状态。
2. Suspense 与错误边界
概念:
Suspense
:是 React 提供的一个组件,用于等待懒加载的组件加载完成。它可以包裹一个或多个懒加载组件,显示一个回退 UI(如 loading 状态)。- 错误边界(Error Boundaries):是 React 提供的一种捕获子组件渲染时出现错误的机制,允许开发者在应用崩溃时显示一个优雅的错误页面,而不是让整个应用崩溃。
如何工作:
Suspense
用于显示加载中的 UI。- 错误边界 使用
componentDidCatch
或getDerivedStateFromError
来捕获 JavaScript 错误,防止应用崩溃。
示例:
// ErrorBoundary 组件
class ErrorBoundary extends React.Component {constructor(props) {super(props);this.state = { hasError: false };}static getDerivedStateFromError(error) {return { hasError: true };}componentDidCatch(error, info) {console.log("Error caught:", error, info);}render() {if (this.state.hasError) {return <h1>Something went wrong!</h1>;}return this.props.children;}
}// 使用 Suspense 和 ErrorBoundary
const MyComponent = React.lazy(() => import('./MyComponent'));function App() {return (<ErrorBoundary><Suspense fallback={<div>Loading...</div>}><MyComponent /></Suspense></ErrorBoundary>);
}
在这个例子中,Suspense
处理组件的懒加载,ErrorBoundary
捕获并处理可能出现的错误。
注意:
- 错误边界仅能捕获生命周期方法、事件处理函数、构造函数和渲染方法中的错误,不会捕获异步函数中的错误(如
setState
、useEffect
中的错误)。 - 错误边界仅在类组件中使用,函数组件需要使用其他方法(如
try-catch
)来处理错误。
3. React Portals
概念:
React Portals 提供了一种将子组件渲染到父组件 DOM 结构以外的方式。通常,React 会将子组件渲染为父组件的 DOM 树的一个子节点,而 Portals
允许你将子组件渲染到其他 DOM 节点中。
使用场景:
- 常用于模态框(modals)、提示框(tooltips)、弹出层等 UI 元素,它们通常需要渲染到
body
元素中,而不是嵌套在父组件的 DOM 树中。
如何工作:
- 使用
ReactDOM.createPortal
来创建 Portal,传递子组件和目标 DOM 节点。
示例:
import ReactDOM from 'react-dom';function Modal() {return ReactDOM.createPortal(<div className="modal">This is a modal</div>,document.getElementById('modal-root') // 将 modal 渲染到 modal-root 节点);
}function App() {return (<div><h1>React Portal Example</h1><Modal /></div>);
}
在这个示例中,Modal
组件被渲染到 modal-root
节点,而不是 App
组件的 DOM 树中。
注意:
Portals
可以在任何组件内使用。- 通过
Portals
渲染的组件仍然遵循 React 的事件冒泡机制。
4. 高阶组件(HOC)
概念:
高阶组件(HOC,Higher-Order Component)是一个函数,它接收一个组件作为输入并返回一个新的增强版组件。HOC 可以用来复用组件逻辑、提高组件的可组合性。
使用场景:
- 适用于跨多个组件共享逻辑,如权限验证、日志记录、数据获取等。
如何工作:
- HOC 是通过包装原组件,增强原组件的功能。
示例:
// HOC: withUserData
function withUserData(Component) {return function WrappedComponent(props) {const [user, setUser] = useState(null);useEffect(() => {fetch('/user').then(res => res.json()).then(data => setUser(data));}, []);return <Component {...props} user={user} />;};
}// 使用 HOC
function UserProfile({ user }) {if (!user) return <div>Loading...</div>;return <div>Welcome, {user.name}</div>;
}const EnhancedUserProfile = withUserData(UserProfile);function App() {return <EnhancedUserProfile />;
}
在这个例子中,withUserData
是一个高阶组件,它将 user
数据作为 props 传递给 UserProfile
组件。
注意:
- HOC 不会改变原组件的
props
结构,而是包装并返回一个新的组件。 - 在 HOC 中使用 hooks 时,需要确保正确使用
useState
和useEffect
等 hooks,避免副作用的错误。
5. Render Props
概念:
Render Props 是一种通过传递一个函数作为 props 来共享组件之间的代码的技术。该函数会返回一个 React 元素,通常用于动态渲染组件内容。
使用场景:
- 适用于需要动态渲染某些内容的组件(如处理表单输入、动画等)。
如何工作:
- 使用一个接受 render 函数的组件,返回 UI 的同时可以将状态和行为作为参数传递给该函数。
示例:
function MouseTracker({ render }) {const [position, setPosition] = useState({ x: 0, y: 0 });const handleMouseMove = (event) => {setPosition({x: event.clientX,y: event.clientY});};return (<div style={{ height: '100vh' }} onMouseMove={handleMouseMove}>{render(position)}</div>);
}function App() {return (<MouseTrackerrender={(position) => (<h1>The mouse is at ({position.x}, {position.y})</h1>)}/>);
}
在这个例子中,MouseTracker
组件通过 render
props 将 position
信息传递给父组件,并根据鼠标的坐标动态渲染内容。
注意:
Render Props
和HOC
类似,也用于组件间的逻辑共享。- 它通过一个函数的形式传递动态内容,通常用于需要共享行为的场景。
6. 自定义 Hooks
概念:
自定义 Hooks 允许开发者将组件逻辑提取到独立的函数中,增强代码的复用性和可维护性。通过 useState
、useEffect
等 Hooks,开发者可以实现自己的业务逻辑封装。
使用场景:
适用于多个组件之间共享逻辑,例如处理表单、动画等。
如何工作:
- 创建一个函数,使用内建的 React hooks,然后返回需要共享的状态或行为。
示例:
function useWindowWidth() {const [width, setWidth] = useState(window.innerWidth);useEffect(() => {const handleResize = () => setWidth(window.innerWidth);window.addEventListener('resize', handleResize);return () => window.removeEventListener('resize', handleResize);}, []);return width;
}function App() {const width = useWindowWidth();return <h1>Window width: {width}px</h1>;
}
在这个示例中,useWindowWidth
是一个自定义 Hook,用于共享窗口宽度的状态。
注意:
- 自定义 hooks 是普通的 JavaScript 函数,但它们必须以
use
开头。 - 自定义 Hooks 可以用来提取组件内部的逻辑,增强代码的复用性。
7. Context API 优化详解
概念:
Context API 是 React 用来在组件树中共享数据的机制。它可以让你在整个组件树中传递数据,而无需手动通过每个中间组件传递 props。
优化策略:
- 避免不必要的重新渲染:通过将 context 分成更小的部分来避免每个上下游组件都重新渲染。
- Memoization:可以使用
React.memo
或useMemo
来优化 Context 的提供和消费,避免每次提供的数据变动时都重新渲染消费者组件。
使用场景:
- 适用于全局共享数据,如认证信息、主题设置、语言等。
示例:
const ThemeContext = React.createContext();function App() {const [theme, setTheme] = useState('light');return (<ThemeContext.Provider value={theme}><div><button onClick={() => setTheme(theme === 'light' ? 'dark' : 'light')}>Toggle Theme</button><ThemedComponent /></div></ThemeContext.Provider>);
}function ThemedComponent() {const theme = useContext(ThemeContext);return <div>Current theme: {theme}</div>;
}
在这个例子中,ThemeContext
用来在整个应用中共享当前主题,并通过 useContext
来消费该数据。
注意:
- 如果 Context 的值变化,所有使用该 Context 的组件都会重新渲染。
- 使用
React.memo
或useMemo
优化性能,避免过多的重新渲染。
总结
React 提供的高级功能如 动态导入(React.lazy)、Suspense 与错误边界、React Portals、高阶组件(HOC)、Render Props、自定义 Hooks 和 Context API 优化 为开发者提供了强大的工具来构建更高效、可维护和可复用的组件。掌握这些技术可以帮助你更好地管理组件的行为和状态,优化性能,并提高开发的灵活性和可维护性。
相关文章:
React知识盲点——组件通信、性能优化、高级功能详解(大纲)
组件通信 React 组件通信详解 在 React 中,组件通信是一个核心概念,主要指的是如何让不同的组件共享和传递数据。React 提供了多种机制来实现组件间的数据传递和状态共享。以下是几种常见的组件通信方式,包括:父子组件通信&…...

Vue 按键生成多个表单
本文通过 vueele,通过循环ref的方法生成多个表单,代码如下: <template><div><el-button click"addText" style"margin: 15px 0; ">添加字段</el-button><div v-for"item, index in dataList"…...

网络安全:交换机技术
单播,组播广播 单播(unicast): 是指封包在计算机网络的传输中,目的地址为单一目标的一种传输方式。它是现今网络应用最为广泛,通常所使用的网络协议或服务大多采用单播传输,例如一切基于TCP的协议。组播(multicast): 也叫多播&am…...
Flask 快速入门
1. Flask 简介 1.1 什么是 Flask Flask 是一个用 Python 编写的轻量级 Web 框架,被誉为 微框架。它提供基础功能,如路由、请求处理和模板引擎,但不强迫开发者使用特定库或工具,赋予开发人员高度的自由选择权,以满足不…...
C#设计模式(行为型模式):备忘录模式,时光倒流的魔法
C#设计模式:备忘录模式,时光倒流的魔法 在软件开发中,我们经常会遇到需要保存对象状态,并在未来某个时刻恢复的场景。例如: 撤销操作: 文本编辑器中的撤销功能,游戏中的回退操作。事务回滚&am…...

数据库高安全—角色权限:权限管理权限检查
目录 3.3 权限管理 3.4 权限检查 书接上文数据库高安全—角色权限:角色创建角色管理,从角色创建和角色管理两方面对高斯数据库的角色权限进行了介绍,本篇将从权限管理和权限检查方面继续解读高斯数据库的角色权限。 3.3 权限管理 &#x…...
FastAPI 的依赖注入与生命周期管理深度解析
FastAPI 的依赖注入与生命周期管理深度解析 目录 🔧 依赖注入与 FastAPI 高级特性 1.1 依赖注入的基础与核心概念1.2 FastAPI 的依赖注入机制与设计理念1.3 FastAPI 依赖注入的异步特性 🕹 生命周期与依赖的异步管理 2.1 依赖的生命周期管理࿱…...

【express-generator】05-路由中间件和错误处理(第一阶段收尾)
一、前言 上篇文章我们介绍了express-generator的请求体解析,重点讲了常用的请求体数据格式(JSON/URL 编码的表单数据)以及一个FILE文件上传,同时搭配代码示范进行辅助理解。 二、本篇重点 我们继续第一阶段的知识,…...
Linux环境下确认并操作 Git 仓库
在软件开发和版本控制中,Git 已成为不可或缺的工具。有时,我们需要确认某个目录是否是一个 Git 仓库,并在该目录中运行脚本。本文将详细介绍如何确认 /usr/local/src/zcxt/backend/policy-system-backend 目录是否是一个 Git 仓库,…...

UDP -- 简易聊天室
目录 gitee(内有详细代码) 图解 MessageRoute.hpp UdpClient.hpp UdpServer.hpp Main.hpp 运行结果(本地通信) 如何分开对话显示? gitee(内有详细代码) chat_room zihuixie/Linux_Lear…...

NVIDIA在CES 2025上的三大亮点:AI芯片、机器人与自动驾驶、全新游戏显卡
每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…...

【通俗理解】AI的两次寒冬:从感知机困局到深度学习前夜
AI的两次寒冬:从感知机困局到深度学习前夜 引用(中英双语) 中文: “第一次AI寒冬,是因为感知机局限性被揭示,让人们失去了对算法可行性的信心。” “第二次AI寒冬,则是因为专家系统的局限性和硬…...

transformer深度学习实战CCTSDB中国交通标志识别
本文采用RT-DETR作为核心算法框架,结合PyQt5构建用户界面,使用Python3进行开发。RT-DETR以其高效的实时检测能力,在多个目标检测任务中展现出卓越性能。本研究针对CCTSDB交通标志数据集进行训练和优化,该数据集包含丰富的CCTSDB交…...

JavaWeb开发(六)XML介绍
1. XML介绍 1.1. 什么是XML (1)XML 指可扩展标记语言(EXtensible Markup Language)XML 是一种很像HTML的标记语言。 (2)XML 的设计宗旨是传输数据(目前主要是作为配置文件),而不是显示数据。 (3&a…...
使用pbootcms开发一个企业官网
V:llike620 pbootcms开源PHP建站系统 https://www.pbootcms.com/ 配置网站 域名解析后,网站绑定到程序根目录即可 例如:本地域名是dobot.test ,那么也要同步本地的hosts是 127.0.0.1 dobot.test 需要配置下伪静态规则 location / {if (!-e $r…...

Linux C编程——文件IO基础
文件IO基础 一、简单的文件 IO 示例二、文件描述符三、open 打开文件1. 函数原型2. 文件权限3. 宏定义文件权限4. 函数使用实例 四、write 写文件五、read 读文件六、close 关闭文件七、Iseek 绍 Linux 应用编程中最基础的知识,即文件 I/O(Input、Outout…...
【信息系统项目管理师】高分论文:论信息系统项目的风险管理(人民医院的信息系统)
更多内容请见: 备考信息系统项目管理师-专栏介绍和目录 文章目录 论文1、规划风险管理2、项目风险识别3、风险定性分析4、风险定量分析5、制定风险应对6、实施风险应对计划7、监督风险论文 2022年6月,我作为项目经理承担了XX县人民医院的信息系统建设,该项目总投资300万,其…...

UE播放声音
蓝图中有两个播放声音的函数 Play Sound 2D 和 Play Sound at Location Play Sound 2D没有声音距离衰减,一般用于界面ui Play Sound at Location 有声音距离衰减,一般用于枪声,场景声等,比较常用...
Docker Compose 启动 Harbor 并指定网络
1. 介绍 Harbor 是一个开源的企业级 Docker 镜像仓库,提供镜像存储、访问控制、安全扫描等功能。使用 Docker Compose 启动 Harbor 时,您可以指定一个自定义网络,以便管理容器之间的网络通信。在本示例中,我们将创建一个名为 har…...
WebSocket 实战案例:从设计到部署
在前六篇文章中,我们深入探讨了 WebSocket 的基础原理、服务端开发、客户端实现、安全实践、性能优化和测试调试。今天,让我们通过一个实战案例,看看如何将这些知识应用到实际项目中。我曾在一个大型在线教育平台中,通过 WebSocket 实现了实时互动课堂,支持了数万名师生的同时在…...
质量体系的重要
质量体系是为确保产品、服务或过程质量满足规定要求,由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面: 🏛️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限,形成层级清晰的管理网络…...

1.3 VSCode安装与环境配置
进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件,然后打开终端,进入下载文件夹,键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...
linux 错误码总结
1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...

高危文件识别的常用算法:原理、应用与企业场景
高危文件识别的常用算法:原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件,如包含恶意代码、敏感数据或欺诈内容的文档,在企业协同办公环境中(如Teams、Google Workspace)尤为重要。结合大模型技术&…...
高防服务器能够抵御哪些网络攻击呢?
高防服务器作为一种有着高度防御能力的服务器,可以帮助网站应对分布式拒绝服务攻击,有效识别和清理一些恶意的网络流量,为用户提供安全且稳定的网络环境,那么,高防服务器一般都可以抵御哪些网络攻击呢?下面…...

mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包
文章目录 现象:mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时,可能是因为以下几个原因:1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南 在数字化营销时代,邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天,我们将深入解析邮件打开率、网站可用性、页面参与时…...
Python 包管理器 uv 介绍
Python 包管理器 uv 全面介绍 uv 是由 Astral(热门工具 Ruff 的开发者)推出的下一代高性能 Python 包管理器和构建工具,用 Rust 编写。它旨在解决传统工具(如 pip、virtualenv、pip-tools)的性能瓶颈,同时…...
IP如何挑?2025年海外专线IP如何购买?
你花了时间和预算买了IP,结果IP质量不佳,项目效率低下不说,还可能带来莫名的网络问题,是不是太闹心了?尤其是在面对海外专线IP时,到底怎么才能买到适合自己的呢?所以,挑IP绝对是个技…...
Mysql8 忘记密码重置,以及问题解决
1.使用免密登录 找到配置MySQL文件,我的文件路径是/etc/mysql/my.cnf,有的人的是/etc/mysql/mysql.cnf 在里最后加入 skip-grant-tables重启MySQL服务 service mysql restartShutting down MySQL… SUCCESS! Starting MySQL… SUCCESS! 重启成功 2.登…...