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 提供了多种机制来实现组件间的数据传递和状态共享。以下是几种常见的组件通信方式,包括:父子组件通信&…...
Maven 详细配置:Maven 项目 POM 文件解读
Maven 是 Java 开发领域中广泛使用的项目管理和构建工具,通过其核心配置文件——POM(Project Object Model)文件,开发者能够定义项目的基本信息、依赖关系、插件配置以及构建生命周期等关键要素。POM 文件不仅是 Maven 项目的核心…...
selenium
pythonselenium selenium是一个第三方库,python有很多库; 1、什么是ui自动化? 通过模拟手工操作用户ui页面的方式,用代码去实现自动化操作和验证的行为。 2、ui自动化的优点? (1)解决重复性的功能测试…...
网络安全:设备原理与操作
设备型号概述 网络安全企业有哪些? 国外:思科,Juniper,惠普,3Com,。。。。 国内:华为,中性,锐捷,蓝盾,绿盟,山石网科,36…...
pytorch中nn.Conv2d详解及参数设置原则
文章目录 基础参数1. in_channels (输入通道数)2. out_channels (输出通道数)3. kernel_size (卷积核大小)4. stride (步幅)5. padding (填充)6. dilation (膨胀)7. groups (分组卷积)8. bias (偏置) 如何设置参数?1. **in_channels 和 out_channels(输入…...
select下拉框,首次进入页面没有显示value的情况
bug场景: 类似这种bug情况排查如下: 首先 理解含义 options就是存放键值对的,id就是key,对上了它就自动把label显示 而且如果你用来当作key和label的字段,与后端返回的不一致,还可以进行更改 其次 排查接…...
接口项目操作图-thinkphp6-rabbitmq
一、用户开户流程 用户首次需要联系商务开通账户,需要提供手机号及来访问的IP。开好户之后,平台方将提供用户访问的key值及header头部参数的公钥加密文件、body访问参数以及返回数据的公私钥加解密文件。 二、用户请求流程 用户将拿到的key值进行rsa公钥…...
thinkphp6.0常用设计模式实例
单例模式 (Singleton) 场景:确保一个类只有一个实例,并提供一个全局访问点。 实际业务:数据库连接、日志记录器、配置管理等。 ThinkPHP 6.0 实现: namespace app\common;class DatabaseConnection {private static $instance …...
微服务保护——Sentinel
什么是微服务保护? 微服务保护是一系列用于保障微服务架构稳定、可靠运行的策略与技术手段,在复杂的分布式微服务系统里,它能避免局部故障引发连锁反应,从而维持整个系统的可用性,主要涵盖以下几个关键部分:…...
php 多进程那点事,用 swoole 如何解决呢 ?
在 PHP 中,多进程的处理通常会遇到一些挑战,比如资源共享、进程间通信、性能优化等。Swoole 是一个高性能的协程和多进程框架,旨在为 PHP 提供异步、并发、协程等功能,解决了传统 PHP 环境中的多进程管理问题。通过使用 Swoole&am…...
STM32+ADC+DMA快速循环转换
测试平台:STM32F405RGT6 uint32_t AD_Buf[100]{0}; HAL_ADC_Start_DMA(&hadc2,(uint32_t *)AD_Buf,100); while(1) {printf("AD_Buf:%d\n",AD_Buf[0]); }...
移动电商的崛起与革新:以开源AI智能名片2+1链动模式S2B2C商城小程序为例的深度剖析
摘要:本文旨在探讨移动电商的崛起背景、特点及其对传统电商模式的革新影响,并以开源AI智能名片21链动模式S2B2C商城小程序为具体案例,深入分析其在移动电商领域的创新实践。随着移动互联网技术的飞速发展,移动电商已成为电商行业的…...
QT实现 端口扫描暂停和继续功能 3
上篇QT给端口扫描工程增加线程2-CSDN博客 为按钮pushButton_Stop添加clicked事件,功能为暂停扫描,并在暂停后显示继续按钮,点击继续按钮之后继续扫描 1.更新UI 添加继续按钮 点击转到槽则会自动声明 2. 更新 MainWindow.h 需要新增的部分…...
C_字符数组存储汉字字符串及其索引
字符串就是字符数组,可以定义一个char类型的数组来存储字符串。 如果要存储多个字符串则可以定义一个char类型的二维数组。 存储多个汉字字符串的话,可以考虑用char类型的二维数组。 不过要注意,一个汉字在内存中占用的字节数确实大于一个…...
Linux标准IOday1
1:思维导图 2:将 student.c这个练习题,改成链表后实现 头文件link.h #ifndef __STRUCT_H__ #define __STRUCT_H__ #include <stdio.h> #include <stdlib.h> typedef struct Student{char name[20];double math;double chinese;double english;double…...
SEO内容优化:如何通过用户需求赢得搜索引擎青睐?
在谷歌SEO优化中,内容一直是最重要的因素之一。但要想让内容真正发挥作用,关键在于满足用户需求,而不是简单地堆砌关键词。谷歌的算法越来越智能化,更注重用户体验和内容的实用性。 了解目标用户的需求。通过工具如Google Trends…...
API调用淘宝京东商品详情接口示例参考,json格式数据示例
以下是API调用淘宝和京东商品详情接口的JSON格式数据示例: 淘宝商品详情接口JSON数据示例 淘宝商品详情接口(通常称为item_get或类似的名称)是淘宝开放平台提供的一个API接口,允许开发者根据商品的ID(Item ID&#x…...
css实现垂直文本
效果 知识 writing-mode: <value>; 可选值 horizontal-tb: 默认值。文本从左到右(或从右到左)排列,然后从上到下。vertical-rl: 文本从上到下排列,然后从右到左。适用于垂直书写的方向,如日语和中文。vertica…...
【AI日记】25.01.07
【AI论文解读】【AI知识点】【AI小项目】【AI战略思考】【AI日记】【读书与思考】 AI 参加:kaggle 比赛 Forecasting Sticker Sales 读书 书名:国家为什么会失败阅读原因:2024 年诺贝尔经济学奖得主的力作,之前我已经读过他另一…...
logback日志
一、使用两个以上spring环境变量做三目操作 <springProperty name"application_name" scope"context" source"spring.application.name"/><springProperty name"trace_app_name" scope"context" source"sprin…...
Android NDK开发入门3之基本语法
JNI语法基础 函数生成语法: extern “ C” 作⽤:避免编绎器按照C的⽅式去编绎C函数 1、C不⽀持函数的重载,编译之后函数名不变; 2、C⽀持函数的重载(这点与Java⼀致),编译之后函数名会改变…...
unity学习9:unity的Asset 导入和导出
目录 1 Assets 资产/资源 1.1 编辑器里Assets 和explorer文件夹 里一一对应 1.2 在编辑器里操作,和文件夹内操作,多数相同还是有些不同 2 往Assets里导入零散文件 2.1 往Assets里导入零散文件 2.2 把fbx文件导入到hierarcy /scene 里,…...
Unity学习笔记(七)使用状态机重构角色攻击
前言 本文为Udemy课程The Ultimate Guide to Creating an RPG Game in Unity学习笔记 攻击状态重构 首先我们重构攻击状态的动画 之前的动画,我们是使用状态(isAttacking)攻击次数(comboCounter)完成动画的过渡,这样虽然能完成功能,但是如…...
【整理集合大全】MySQL(4) 数据库增删改查SQL语句
查看数据库 show databases; 使用数据库 use 数据库名;创建数据库 CREATE DATABASE 数据库名;删除数据库 DROP DATABASE 数据库名;创建表 create table 表名(列名1 类型(长度) [约束],列名2 类型(长度) [约束],…… );长度区别 int类型带长度:不影响存取值&…...
Flutter 鸿蒙化 flutter和鸿蒙next混和渲染
前言导读 这一个节课我们讲一下PlatformView的是使用 我们在实战中有可能出现了在鸿蒙next只加载一部分Flutter的情况 我们今天就讲一下这种情况具体实现要使用到我们的PlatformView 效果图 具体实现: 一、Native侧 使用 DevEco Studio工具打开 platform_view_example\oho…...
Flask返回浏览器无乱码方法
# -*- coding: utf-8 -*- from flask import Flask, request, jsonify, Response import os import json import re from datetime import datetime import logging import sys import crawling_web_knowledgeapp Flask(__name__)app.json.ensure_ascii False # 解决中文乱码…...
Tauri教程-基础篇-第二节 Tauri的核心概念下篇
“如果结果不如你所愿,就在尘埃落定前奋力一搏。”——《夏目友人帐》 “有些事不是看到了希望才去坚持,而是因为坚持才会看到希望。”——《十宗罪》 “维持现状意味着空耗你的努力和生命。”——纪伯伦 Tauri 技术教程 * 第四章 Tauri的基础教程 第二节…...
直播预告|StarRocks 3.4,打造 AI 时代的智能数据基座,应用场景全面扩展
随着新年的到来,StarRocks 3.4 即将上线,为 AI Workload 和更多应用场景提供强大支持!此次升级聚焦于提升 AI 场景支持,并扩展更多应用场景,全方位提升数据分析体验。 更强的 AI 场景支持: 引入 Vector In…...
Maven的基本使用
Maven apache 旗下的开源项目,是一款用于管理构建Java的项目的工具 一 作用 1依赖管理:管理jar包,避免依赖冲突 2统一项目结构 : 3项目构建: 二 安装 下面是全球唯一的中央仓库 https://repo1.maven.org/maven2…...
【深度学习入门_基础篇】线性代数本质
开坑本部分主要为基础知识复习,新开坑中,学习记录自用。 学习目标: 熟悉向量、线性组合、线性变换、基变换、矩阵运算、逆函数、秩、列空间、零空间、范式、特征指、特征向量等含义与应用。 强烈推荐此视频: 【官方双语/合集】…...
数据库模型全解析:从文档存储到搜索引擎
目录 前言1. 文档存储(Document Store)1.1 概念与特点1.2 典型应用1.3 代表性数据库 2. 图数据库(Graph DBMS)2.1 概念与特点2.2 典型应用2.3 代表性数据库 3. 原生 XML 数据库(Native XML DBMS)3.1 概念与…...
LED背光驱动芯片RT9293应用电路
一)简介: RT9293 是一款高频、异步的 Boost 升压型 LED 定电流驱动控制器,其工作原理如下: 1)基本电路结构及原理 RT9293的主要功能为上图的Q1. Boost 电路核心原理:基于电感和电容的特性实现升压功能。当…...
Ubuntu挂载云盘操作步骤
1. 查看磁盘分区情况 使用 fdisk -l 命令查看当前系统中所有磁盘的分区情况,找到需要挂载的云盘设备,例如/dev/vdc。 2. 创建新分区 使用 fdisk /dev/vdc 命令对云盘进行分区操作: 输入n创建新分区。 输入p选择创建主分区。 输入1指定分区…...
【中间件】docker+kafka单节点部署---zookeeper模式
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言消息中间件介绍1. KRaft模式2. zookeeper模式2.1. 单节点部署安装验证 前言 最近生产环境上准备部署ELFK日志监控,先在测试环境部署单节点kafka验证…...
Arduino IDE刷微控制器并下载对应固件的原由
在使用Arduino IDE刷写某个微控制器时,下载对应的固件通常是为了确保微控制器能够正确识别和执行Arduino IDE中编写的代码。以下是对这一过程的详细解释: 一、固件的作用 固件是微控制器或嵌入式设备上运行的软件,它负责控制硬件设备的操作…...
深兰科技董事长陈海波应邀为华东师大心理学专业师生做AI专题讲座
12月28日,应上海华东师范大学的邀请,上海市科协常委、上海交通大学博士生导师、深兰科技创始人兼董事长陈海波专程到校,为该校心理学专业的全体师生做了一场关于人工智能推动个人数字化未来的专题讲座。 他在演讲中,首先详细讲述了…...
iOS - 引用计数(ARC)
1. 基本数据结构 // 对象结构 struct objc_object {isa_t isa; // isa 指针,包含引用计数信息 };// isa 的位域结构 union isa_t {uintptr_t bits;struct {uintptr_t nonpointer : 1; // 是否启用优化的 isa 指针uintptr_t has_assoc : 1; // 是…...
【物联网原理与运用】知识点总结(上)
目录 名词解释汇总 第一章 物联网概述 1.1物联网的基本概念及演进 1.2 物联网的内涵 1.3 物联网的特性——泛在性 1.4 物联网的基本特征与属性(五大功能域) 1.5 物联网的体系结构 1.6 物联网的关键技术 1.7 物联网的应用领域 第二章 感知与识别技术 2.1 …...
Flux“炼丹炉”——fluxgym安装教程
一、介绍 这个炼丹炉目前可以训练除了flux-dev之外的其它模型,只需更改一个配置文件内容即可。重要的是训练时不需要提前进行图片裁剪、打标等前置工作,只需下图的三个步骤即可开始训练。它就是——fluxgym。 fluxgym:用于训练具有低 VRAM &…...
【Jsoncpp】manipulating JSON data in C++
源代码 #include <iostream> // 引入输入输出流库,用于标准输入输出操作 #include <fstream> // 引入文件流库,用于文件读写操作 #include <json/json.h> // 引入JSON库,用于解析和操作JSON数据using namespace std; …...
Ardupilot开源无人机之Geek SDK进展2024
Ardupilot开源无人机之Geek SDK进展202501 1. 源由2. 状态3. TODO3.1 跟踪目标框3.2 onnxruntime版本3.3 CUDA 11.8版本3.4 pytorch v2.5.1版本3.5 Inference性能3.6 特定目标集Training 4. 参考资料 1. 源由 前期搭建《Ardupilot开源无人机之Geek SDK》,主要目的是…...
肝了半年,我整理出了这篇云计算学习路线(新手必备,从入门到精通)
大家好!我是凯哥,今天给大家分享一下云计算学习路线图。这是我按照自己最开始学习云计算的时候的学习路线,并且结合自己从业多年所涉及的知识精心总结的云计算的思维导图。这是凯哥精心总结的,花费了不少精力哦,希望对…...
配置数据的抗辐照加固方法
SRAM 型FPGA 的配置存储器可以看成是由0 和1 组成的二维阵列,帧的高度为矩阵阵列的高度,相同结构的配置帧组成配置列,如CLB 列、IOB 列、输入输出互联(Input Output Interconnect,IOI)列、全局时钟(Global Clock, GCLK)列、BRAM 列和BRAM 互联…...
【linux系统之redis6】处理可视化工具无法连接服务器端的redis
redis跑在虚拟机上的linux系统是可以正常的,但是用宿主机的可视化工具链接就连不上 可视化工具无法连接 问题排查 确保配置文件开启了bind 0.0.0.0,允许外部任何终端的链接密码确保正确要关闭linux系统的防火墙(我的属于这种) systemctl stop firewalld.servic…...
云计算操作系统的核心-OpenStack框架全解析
文章目录 一、OpenStack简介二、OpenStack架构1.认证服务Keystone2.镜像服务Glance3.计算服务Nova4.块存储服务Clinder5.对象存储服务Swift6.网络服务Neutron7.计量服务Ceilometer 三、服务简介3.1 OpenStack界面管理3.2 Keystone 认证3.3 Glance3.3 Nova3.4 存储服务3.5 Neutr…...
【设计模式-2】23 种设计模式的分类和功能
在软件工程领域,设计模式是解决常见设计问题的经典方案。1994 年,Erich Gamma、Richard Helm、Ralph Johnson 和 John Vlissides(四人帮,GoF)在《设计模式:可复用面向对象软件的基础》一书中系统性地总结了…...
记录一下Coding一直不能clone
配置 下载git客户端,进行配置 git config --list user.name姓名全称 user.emailIAM_xxxxxx.com ,这个就是你的邮箱地址 user.signingkey 注册coding平台的密码 一般不需要配置公钥私钥 下载TortoiseGit,配置这几个参数 配置凭据管理器 注意 这里用户名是…...
Backend - C# EF Core 执行迁移 Migrate
目录 一、创建Postgre数据库 二、安装包 (一)查看是否存在该安装包 (二)安装所需包 三、执行迁移命令 1. 作用 2. 操作位置 3. 执行(针对visual studio) 查看迁移功能的常用命令: 查看…...
检索增强生成 和思维链 结合: 如何创建检索增强思维链 (RAT)?
论文地址:https://arxiv.org/pdf/2403.05313 Github地址:https://github.com/CraftJarvis/RAT 想象一下,一个人工智能助手可以像莎士比亚一样写作,像专家一样推理。这听起来很了不起,对吧?但是࿰…...
第四届电子信息与通信工程国际学术会议(EICE 2025)
第四届电子信息与通信工程国际学术会议(EICE 2025)定于2025年1月10日至12日在中国广州举行。大会交流全球相关领域科技学术最新发展趋势,链接重点领域国内外顶尖、活跃、最新学术资源,通过经验分享和智慧碰撞,推动科研…...