前端面经-VUE3篇(二)--vue3组件知识(二)依赖注入、异步组件、生命周期、组合式函数、插件
目录
一、依赖注入
1、 依赖注入是什么?
2、最基础的使用
3、为什么使用依赖注入?
4、 使用 Symbol 作注入名
二、异步组件
1、什么是异步组件?
2、最基础用法:defineAsyncComponent
3、在模板中使用异步组件
4、配置加载状态:加载提示 / 超时 / 错误处理
三、生命周期
1、生命周期的本质:组件从“出生”到“死亡”的过程
2、生命周期钩子总览
3、 各生命周期钩子的详细解释
1. setup()
2. onBeforeMount()
3. onMounted()
4. onBeforeUpdate()
5.onUpdated()
6. onBeforeUnmount()
7. onUnmounted()
4、钩子参数
四、组合式函数
1、什么是组合式函数?
2、组合式函数的结构
3、组合式函数的核心特征
4、组合式函数能做什么?
5、实战场景汇总
6、总结一句话
五、插件
1、什么是 Vue 插件?
2、插件的核心格式
3、注册方式
4、插件内部能做的事(功能总结)
5、注意事项
6、总结一句话
一、依赖注入
通常情况下,当我们需要从父组件向子组件传递数据时,会使用 props。想象一下这样的结构:有一些多层级嵌套的组件,形成了一棵巨大的组件树,而某个深层的子组件需要一个较远的祖先组件中的部分数据。在这种情况下,如果仅使用 props 则必须将其沿着组件链逐级传递下去,这会非常麻烦:
1、 依赖注入是什么?
依赖注入是一种让“祖先组件提供”和“后代组件注入使用”的机制,使用
provide
和inject
配合实现。
-
provide(key, value)
:祖先组件中声明可供后代使用的内容 -
inject(key)
:后代组件中声明需要注入的内容
2、最基础的使用
父组件(祖先)使用 provide
<script setup>
import { provide } from 'vue'
provide('color', 'blue')
</script>子组件(任意后代)使用 inject
<script setup>
import { inject } from 'vue'const color = inject('color')
</script>
<template><p style="color: {{ color }}">我是注入的颜色</p>
</template>
✅ 这样,子组件就无需 props,可以跨越多层组件拿到祖先组件提供的数据。
如果提供的值是一个 ref,注入进来的会是该 ref 对象,而不会自动解包为其内部的值。这使得注入方组件能够通过 ref 对象保持了和供给方的响应性链接。
3、为什么使用依赖注入?
传统方式 | 问题 |
---|---|
使用 props | 需要每层组件手动传递,维护困难 |
使用 Vuex / pinia | 重,但适合全局状态 |
使用 event bus | 不推荐,易维护混乱 |
✅ 依赖注入适合:
-
状态共享(如配置、主题、权限)
-
插件式封装(如表单、组件注册)
-
面向组合逻辑的解耦
默认值与类型检查
如果子组件注入的 key 不存在,返回值为 undefined
,你可以设置默认值:
const theme = inject('theme', 'light') // 默认值 fallback
你还可以传入工厂函数作为默认值:
const config = inject('config', () => ({ color: 'blue' }))
4、 使用 Symbol 作注入名
但如果你正在构建大型的应用,包含非常多的依赖提供,或者你正在编写提供给其他开发者使用的组件库,建议最好使用 Symbol 来作为注入名以避免潜在的冲突。
// keys.js
export const myInjectionKey = Symbol()// 在供给方组件中
import { provide } from 'vue'
import { myInjectionKey } from './keys.js'
provide(myInjectionKey, { /* 要提供的数据 */
})// 注入方组件
import { inject } from 'vue'
import { myInjectionKey } from './keys.js'const injected = inject(myInjectionKey)
二、异步组件
Vue 的 异步组件(Async Components) 是一种优化性能与用户体验的机制,它允许你在需要时按需加载某个组件,而不是在应用启动时一次性加载全部组件。
异步组件在构建大型应用、提升首屏加载速度、实现懒加载等场景中非常重要,Vue 为此提供了专门的语法和加载配置。
1、什么是异步组件?
异步组件是指:组件不是立即加载的,而是在需要时才异步地被加载。
它的核心思想是:“用的时候才加载”,这对以下场景非常有用:
-
页面拆分(如路由页面)
-
大型组件库懒加载
-
多个组件中只有部分在运行中用到
2、最基础用法:defineAsyncComponent
Vue 提供了官方函数 defineAsyncComponent()
来创建异步组件。
基本语法:
import { defineAsyncComponent } from 'vue'const AsyncComponent = defineAsyncComponent(() =>import('./MyHeavyComponent.vue')
)
这个组件会被延迟加载,只有在模板中首次渲染它时,Vue 才会触发 import()
加载它对应的文件。
3、在模板中使用异步组件
<template><div><AsyncComponent /></div>
</template><script setup>
import { defineAsyncComponent } from 'vue'const AsyncComponent = defineAsyncComponent(() =>import('./MyHeavyComponent.vue')
)
</script>
4、配置加载状态:加载提示 / 超时 / 错误处理
defineAsyncComponent
还可以接受一个对象,配置异步加载的过程行为。
import { defineAsyncComponent } from 'vue'const AsyncComponent = defineAsyncComponent({loader: () => import('./MyHeavyComponent.vue'),// 加载时展示的组件loadingComponent: LoadingSpinner,// 出错时展示的组件errorComponent: ErrorMessage,// 延迟多长时间显示 loadingComponent(毫秒)delay: 200,// 加载超时时间(毫秒)timeout: 3000,// 出错时重试机制onError(error, retry, fail, attempts) {if (attempts <= 3) {retry()} else {fail()}}
})
各配置解释:
选项 | 功能 |
---|---|
loader | 必填。返回组件的异步加载 Promise(即 import() ) |
loadingComponent | 加载过程中显示的 UI |
errorComponent | 加载失败后显示的 UI |
delay | 加载多少毫秒后才显示 loading |
timeout | 超过此时间未加载完成视为失败 |
onError | 异步加载失败时自定义处理(可自动重试) |
注意:Vue Router 内部会自动处理 loading 状态,不需要你手动 defineAsyncComponent
。
三、生命周期
Vue 的生命周期(Lifecycle)指的是 Vue 组件从创建到销毁过程中经历的一系列阶段性钩子函数,你可以在这些钩子中执行逻辑,如数据初始化、DOM 操作、网络请求、清理等。
每个 Vue 组件实例在其创建过程中都会经历一系列初始化步骤,例如设置数据监听、编译模板、挂载 DOM,直到被销毁。Vue 提供了生命周期钩子函数,让我们有机会在不同阶段插入代码。
1、生命周期的本质:组件从“出生”到“死亡”的过程
整个过程大致如下:
创建阶段 → 挂载阶段 → 更新阶段 → 销毁阶段
2、生命周期钩子总览
阶段 | 钩子函数 | 作用 |
---|---|---|
创建前 | setup() | Vue 3 中唯一入口 |
挂载前 | onBeforeMount() | 组件尚未挂载,DOM 还未生成 |
挂载后 | onMounted() | 组件已挂载,DOM 可操作 |
更新前 | onBeforeUpdate() | 响应式数据变更,但 DOM 还未更新 |
更新后 | onUpdated() | DOM 更新完毕,可做响应处理 |
卸载前 | onBeforeUnmount() | 组件将被销毁,做清理前工作 |
卸载后 | onUnmounted() | 已销毁,清理资源、解绑事件等 |
3、 各生命周期钩子的详细解释
1. setup()
阶段:组件创建阶段(最先执行)
调用时机:组件实例刚创建,data
、props
、methods
都还没绑定到 this
上
作用:
-
是组合式 API 的入口;
-
用来声明响应式数据、props、emit、watch、计算属性等;
-
不能访问
this
; -
返回的变量会暴露给模板使用。
2. onBeforeMount()
阶段:挂载前
调用时机:组件即将挂载到 DOM(el
创建完毕但未插入 DOM)
作用:
-
此时模板已编译,但 DOM 未挂载;
-
可以进行某些准备工作或日志记录。
常见用途:
-
初始化数据日志;
-
注册未依赖 DOM 的第三方逻辑。
从组件“出生到上场”来理解生命周期
你可以把组件想象成一个“舞台演员”:
阶段 | 比喻 | 生命周期钩子 |
---|---|---|
写好剧本 | 编译模板等准备工作 | setup() |
穿好衣服化妆 | DOM 虚拟结构准备就绪 | onBeforeMount() ✅ |
走上舞台 | 挂载 DOM,出现在页面 | onMounted() |
所以 onBeforeMount()
就是演员 刚准备好,马上就要上场 的那一刻。
Vue 在内部的执行流程:
setup() → 编译模板 → 创建虚拟 DOM →
→ 🔹onBeforeMount() →
→ 渲染并插入真实 DOM →
→ 🔹onMounted()
onBeforeMount 做了什么?
-
组件已经准备好数据(比如
props
、ref
); -
已经生成了虚拟 DOM(VNode);
-
但还没有插入真实页面中;
-
所以此时你不能直接操作 DOM 元素。
能干什么?
虽然还不能访问 DOM,但可以:
-
准备数据(如果依赖 DOM 可延迟);
-
进行日志埋点或调试;
-
记录组件加载时间;
-
检查组件状态是否完整;
-
准备动画过渡参数(比如进入动画前的状态)。
3. onMounted()
阶段:挂载后
调用时机:首次 DOM 渲染完成,所有 DOM 元素可操作
作用:
-
执行需要访问 DOM 的逻辑;
-
发起初始请求;
-
注册事件监听器;
-
引入第三方库(如 ECharts、Swiper)。
常见用途:
-
页面初始化请求;
-
DOM 操作(如获取滚动容器、焦点);
-
动画执行。
你可以把它理解为:
“我的组件已经出现在页面上了,现在可以操作它的 DOM、做异步请求、初始化动画、注册事件等。”
可以用 onMounted()
做哪些事?
用途 | 说明 |
---|---|
✅ 操作 DOM | 可以安全地访问 document.querySelector 或 ref 引用的元素 |
✅ 发起 API 请求 | 初始化组件数据,如加载表格数据、详情数据等 |
✅ 注册监听器 | 注册 scroll 、resize 、keyboard 等全局事件 |
✅ 使用第三方库 | 比如挂载图表(ECharts)、富文本编辑器(Quill)等 |
✅ 初始化动画 | 初始化进入动画或过渡效果 |
✅ 上报埋点 | 发送统计日志、埋点监控等 |
4. onBeforeUpdate()
阶段:更新前
调用时机:响应式状态变化,DOM 还未更新
作用:
-
可用于比较新旧状态;
-
做一些缓存或临时逻辑。
注意事项:
-
不建议操作 DOM;
-
不要进行异步逻辑处理。
onBeforeUpdate()
是 Vue 组件中的一个更新阶段生命周期钩子,它在 响应式数据发生变化、DOM 还没有更新之前 被调用。
你可以把它理解为:
“组件数据变了,DOM 马上要重新渲染了,现在是我插手干预的最后机会。”
onBeforeUpdate() 的作用
用途 | 说明 |
---|---|
✅ 获取旧的 DOM 状态 | DOM 还没变,你可以访问“变化前”的样子 |
✅ 计算更新前的一些值 | 比如滚动高度、旧位置 |
✅ 清除旧状态标记 | 如之前的样式、数据缓存 |
❌ 不适合做异步请求 | 更新前阶段不能引起新响应式更新(否则会递归) |
5.onUpdated()
阶段:更新后
调用时机:响应式数据更新完成,DOM 也已更新
作用:
-
可以对新 DOM 做处理;
-
常用于监听局部 DOM 变化后执行逻辑。
onUpdated()
是 Vue 组件在 响应式数据变更导致 DOM 更新完成后 自动调用的生命周期钩子。
你可以理解为:
“Vue 已经把新数据同步到了页面上,现在你可以看到更新后的 DOM,想操作它、获取它的新状态、触发动画等等——就靠
onUpdated()
。”
onUpdated() 能做什么?
能做的事 | 应用场景 |
---|---|
✅ 读取更新后的 DOM 状态 | 比如新的高度、内容、布局 |
✅ 执行过渡动画、样式变化 | 比如 fade-in、滚动动画等 |
✅ 动态调整布局 | 比如等高布局、表格自适应列宽 |
✅ 与旧值对比 | 和 onBeforeUpdate() 配合使用 |
❌ 不推荐用来发请求 | 页面每次更新都会触发,可能频繁调用 |
和onBeforeUpdate区别
项目 | onBeforeUpdate() | onUpdated() |
---|---|---|
调用时机 | DOM 更新前 | DOM 更新后 |
访问的是 | 旧 DOM | 新 DOM |
场景 | 缓存、准备、清理 | 更新后调整布局、动画 |
能否操作新结构 | ❌ 不行 | ✅ 可以 |
理解类比:装修房子
你可以把 Vue 更新比喻成“家装翻新”:
-
onBeforeUpdate()
:工人刚拿到设计图纸,准备改造,但还没开始动工; -
onUpdated()
:已经把墙刷好、灯装上、地板换了,可以检查结果了。
6. onBeforeUnmount()
阶段:卸载前
调用时机:组件即将从页面上被卸载
作用:
-
做清理工作,如清除定时器、取消监听器;
-
防止内存泄漏;
-
通知外部容器取消操作。
onBeforeUnmount()
是 Vue 组件即将被销毁前调用的生命周期钩子。
你可以理解为:
“Vue 准备把这个组件从页面中移除,我现在有一个机会做一些清理工作或资源释放。”
适合用 onBeforeUnmount()
做哪些事?
用途 | 举例 |
---|---|
✅ 清除定时器 | clearInterval() 、clearTimeout() |
✅ 取消网络请求 | 调用 AbortController.abort() 或取消 token |
✅ 移除事件监听器 | removeEventListener() |
✅ 停止动画或任务 | 比如取消动画帧 cancelAnimationFrame() |
✅ 通知父组件或全局状态 | 通知组件退出、清除缓存等 |
7. onUnmounted()
阶段:卸载后
调用时机:组件 DOM 被完全移除
作用:
-
彻底释放资源;
-
日志记录、事件通知等。
注意事项:
-
通常清理逻辑建议放在
onBeforeUnmount()
,onUnmounted()
比较少用。
onUnmounted()
是 Vue 组件在 被销毁之后 自动调用的生命周期钩子。
你可以理解为:
“Vue 已经把这个组件从页面中移除了,DOM 不再存在,响应式状态也都释放了。这是我最后一次处理事情的机会。”
onUnmounted()
的典型用途
用途 | 示例 |
---|---|
✅ 日志记录 / 调试 | 组件销毁后打 log |
✅ 通知外部状态 | 如 Vuex、Pinia 中的状态重置 |
✅ 执行异步销毁操作 | 提交状态到后端、更新埋点日志等 |
✅ 销毁订阅 / 解耦逻辑清理 | 比如 event bus 或 WebSocket 等注册事件 |
和 onBeforeUnmount()
的区别
钩子 | 时机 | 是否可以访问 DOM? | 用途 |
---|---|---|---|
onBeforeUnmount() | 销毁前 | ✅ 是 | 清除定时器/监听器 |
onUnmounted() | 销毁后 | ❌ 否 | 日志、通知、埋点、最后状态更新 |
一个指令的定义对象可以提供几种钩子函数 (都是可选的):
const myDirective = {// 在绑定元素的 attribute 前// 或事件监听器应用前调用created(el, binding, vnode) {// 下面会介绍各个参数的细节},// 在元素被插入到 DOM 前调用beforeMount(el, binding, vnode) {},// 在绑定元素的父组件// 及他自己的所有子节点都挂载完成后调用mounted(el, binding, vnode) {},// 绑定元素的父组件更新前调用beforeUpdate(el, binding, vnode, prevVnode) {},// 在绑定元素的父组件// 及他自己的所有子节点都更新后调用updated(el, binding, vnode, prevVnode) {},// 绑定元素的父组件卸载前调用beforeUnmount(el, binding, vnode) {},// 绑定元素的父组件卸载后调用unmounted(el, binding, vnode) {}
}
4、钩子参数
指令的钩子会传递以下几种参数:
-
el
:指令绑定到的元素。这可以用于直接操作 DOM。 -
binding
:一个对象,包含以下属性。value
:传递给指令的值。例如在v-my-directive="1 + 1"
中,值是2
。oldValue
:之前的值,仅在beforeUpdate
和updated
中可用。无论值是否更改,它都可用。arg
:传递给指令的参数 (如果有的话)。例如在v-my-directive:foo
中,参数是"foo"
。modifiers
:一个包含修饰符的对象 (如果有的话)。例如在v-my-directive.foo.bar
中,修饰符对象是{ foo: true, bar: true }
。instance
:使用该指令的组件实例。dir
:指令的定义对象。
-
vnode
:代表绑定元素的底层 VNode。 -
prevVnode
:代表之前的渲染中指令所绑定元素的 VNode。仅在beforeUpdate
和updated
钩子中可用。
四、组合式函数
Vue 3 中的组合式函数(Composables)是基于组合式 API 构建的一个逻辑复用机制,它允许你将组件的状态逻辑抽离成可重用的函数,这种方式比 Vue 2 的 Mixin、HOC 更清晰、更灵活、更易维护。
1、什么是组合式函数?
组合式函数是一个以
useXxx()
命名的普通 JavaScript 函数,在其中使用 Vue 的组合式 API(如ref
,reactive
,watch
,computed
等),然后将这些逻辑封装并返回供多个组件使用。
简化理解就是:
“把多个组件中重复的响应式逻辑、状态、侦听器等代码封装成函数,复用它们。”
2、组合式函数的结构
一个组合式函数的基本结构如下:
// useCounter.js
import { ref } from 'vue'export function useCounter() {const count = ref(0)function increment() {count.value++}return {count,increment}
}
在组件中使用它:
<script setup>
import { useCounter } from './useCounter'const { count, increment } = useCounter()
</script><template><button @click="increment">点击:{{ count }}</button>
</template>
3、组合式函数的核心特征
特征 | 描述 |
---|---|
✅ 可重用 | 不同组件可调用相同的逻辑函数 |
✅ 组合式 API 支持 | 内部可以使用任何 ref、reactive、watch、computed 等 |
✅ 与组件解耦 | 逻辑不再依赖组件上下文 |
✅ 类型推导友好 | TypeScript 支持极好 |
✅ 易测试 | 普通函数,易于单元测试 |
4、组合式函数能做什么?
1. 封装状态逻辑export function useToggle(initial = false) {const state = ref(initial)const toggle = () => (state.value = !state.value)return { state, toggle }
}
2. 封装异步请求逻辑export function useFetch(url) {const data = ref(null)const error = ref(null)fetch(url).then(res => res.json()).then(json => (data.value = json)).catch(err => (error.value = err))return { data, error }
}
3. 封装监听器逻辑export function useMouse() {const x = ref(0)const y = ref(0)function update(e) {x.value = e.pageXy.value = e.pageY}onMounted(() => window.addEventListener('mousemove', update))onBeforeUnmount(() => window.removeEventListener('mousemove', update))return { x, y }
}
5、实战场景汇总
场景 | 封装为组合式函数 |
---|---|
表单验证 | useFormValidation() |
网络请求 | useFetch() , useAxios() |
用户状态管理 | useUser() |
页面权限控制 | usePermission() |
响应式缓存 | useLocalStorage() , useSessionStorage() |
主题/系统设置 | useTheme() , useSystemConfig() |
响应式计数器 | useCounter() |
6、总结一句话
组合式函数是 Vue 3 中最推荐的逻辑复用机制,它允许你把多个组件重复的状态、侦听器、生命周期逻辑提取为独立函数,提高代码复用性、可维护性和清晰度。
五、插件
1、什么是 Vue 插件?
Vue 插件(Plugin)是一个可以通过
app.use()
方法注册到 Vue 应用中的扩展模块。
它通常用于:
-
向应用注入功能(如添加全局方法、指令、组件等)
-
对整个应用进行配置或初始化
-
集成第三方库(如 Vue Router、Vuex、Pinia、Element Plus 等)
2、插件的核心格式
Vue 插件其实就是一个具有 install(app, options)
方法的对象或函数:
插件的标准写法(对象形式):
// MyPlugin.js
export default {install(app, options) {// 1. 添加全局方法app.config.globalProperties.$hello = () => {console.log('Hello from plugin!')}// 2. 注册全局组件app.component('MyGlobalComp', {template: `<div>I am global</div>`})// 3. 添加全局指令app.directive('focus', {mounted(el) {el.focus()}})// 4. 注入 provide/inject 数据app.provide('pluginName', 'MyPlugin')}
}
3、注册方式
// main.js
import { createApp } from 'vue'
import App from './App.vue'
import MyPlugin from './MyPlugin'const app = createApp(App)
app.use(MyPlugin, { customOption: true }) // 安装插件
app.mount('#app')
4、插件内部能做的事(功能总结)
功能 | 用法 |
---|---|
注册全局组件 | app.component('Xxx', Component) |
注册全局指令 | app.directive('xxx', definition) |
添加全局属性 | app.config.globalProperties.$xxx = fn |
使用 provide/inject 传递全局依赖 | app.provide('xxx', value) |
启动外部库或执行初始化 | 如初始化配置项、加载配置文件等 |
5、注意事项
注意点 | 说明 |
---|---|
插件必须使用 app.use() 安装 | 否则不会执行其 install() 方法 |
不要滥用全局属性 | app.config.globalProperties 会污染组件上下文 |
插件之间避免命名冲突 | 推荐用命名空间前缀(如 $myXxx ) |
插件应保持纯函数和无副作用 | 避免影响应用的稳定性 |
6、总结一句话
Vue 插件是通过
app.use()
安装的功能扩展模块,适合封装和共享全局逻辑,如注册组件、添加方法、集成第三方库等,是构建大型项目或封装组件库的重要机制。
相关文章:
前端面经-VUE3篇(二)--vue3组件知识(二)依赖注入、异步组件、生命周期、组合式函数、插件
目录 一、依赖注入 1、 依赖注入是什么? 2、最基础的使用 3、为什么使用依赖注入? 4、 使用 Symbol 作注入名 二、异步组件 1、什么是异步组件? 2、最基础用法:defineAsyncComponent 3、在模板中使用异步组件 4、配置加载状态…...
Manus联合创始人:公司产品基于Claude和阿里千问大模型开发
3月11日消息,日前,Manus官方在社交平台转发了公司联合创始人、首席科学家季逸超对Manus的技术解读,季逸超在评论区回复网友关于“Manus使用了哪一个基础大模型”这一问题时回复称,“我们用过Claude,也用过不同版本的Qw…...
华为云Flexus+DeepSeek征文|快速搭建Dify LLM应用开发平台教程
目录 部署Dify-LLM应用开发平台开始使用一键卸载注意事项 部署Dify-LLM应用开发平台 1、首先需要访问快速搭建Dify-LLM应用开发平台-华为云 2、使用"一键部署"功能快速搭建Dify平台快速搭建Dify LLM应用开发平台-云社区-华为云,本文在这里选择一键部署&…...
简介QML中的Canvas
2025年5月3日,周六晚上 QML中的Canvas是一个强大的绘图组件,允许开发者通过JavaScript在界面上进行动态的2D图形绘制。它类似于HTML5的<canvas>元素,适用于实现自定义图形、动画、游戏开发以及图表绘制等场景。 核心特性 绘图能力 • …...
装饰器@wraps(func)详解
1. wraps(func) 的核心作用 wraps 是 Python 标准库 functools 提供的装饰器,用于保留被装饰函数的原始元信息。 它通过将原函数的 __name__、__doc__、__module__ 等属性复制到装饰器内部的包装函数中,避免装饰器对函数身份信息的“掩盖”。 2. 元信息…...
vue的diff算法是什么、比较方式,原理分析、示例解释讲解
Vue Diff算法概述 Vue 的 Diff 算法是一种高效的虚拟 DOM 更新机制,用于最小化真实 DOM 的操作开销。它通过比较新旧 Virtual DOM 树中的差异,仅更新那些实际发生改变的部分,从而提升性能。 定义 Diff 算法的核心目标是在 MVVM 开发模式下…...
Day04 新增套餐
###今天的任务主要是自主完成套餐管理的模块### 1.新增套餐 在前端页面接口中我们可以看到在新增套餐的时候需要选择添加到菜单中的菜品 因此我们需要设计一个接口可以通过根据分类id(category_id)来查询该分类下的菜品 1.1根据分类id查询分类下的菜…...
WEB前端小练习——记事本
一、登陆页面 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>记事本登录注册</title><link…...
在多线程环境下如何设计共享数据结构保证原子操作与数据一致性
在多线程环境下如何设计共享数据结构保证原子操作与数据一致性 1. 引言 在现代软件开发中,多线程编程是提升程序性能和响应速度的重要手段。然而,多线程环境下的 共享数据管理 极具挑战性,若处理不当,可能引发 竞争条件(Race Conditions)、数据不一致(Data Inconsiste…...
洛谷 P1850 [NOIP 2016 提高组] 换教室
题目传送门 前言 终于自己想出概率期望 d p dp dp 的状态了,但是依旧没能相对转移方程。(招笑) 暴力 这题部分分和特殊情况分给的挺多的,所以先拿部分分。 一、思路 先跑一边 F l o y d Floyd Floyd 最短路求出两点间最短距…...
1penl配置
好的,根据您提供的 1pctl 命令输出信息,我们来重新依次回答您的所有问题: 第一:1Panel 怎么设置 IP 地址? 根据您提供的 user-info 输出: 面板地址: http://$LOCAL_IP:34523/93d8d2d705 这里的 $LOCAL_I…...
Windows下调试WebRTC源码
一、引言 《Windows下编译WebRTC源码》讲述了Windows下编译WebRTC源码的方法。本文在其基础之上,讲述使用Visual Studio调试WebRTC源码的方法。 二、生成Visual Studio工程文件 按照 《Windows下编译WebRTC源码》编译出webrtc.lib 后,执行下面的命令生…...
基于大模型的肾结石诊疗全流程风险预测与方案制定研究报告
目录 一、引言 1.1 研究背景与意义 1.2 国内外研究现状 1.3 研究目标与内容 二、大模型技术原理与应用概述 2.1 大模型的基本原理 2.2 大模型在医疗领域的应用进展 2.3 适用于肾结石预测的大模型选择与依据 三、术前风险预测与准备 3.1 患者身体状况评估 3.2 结石情…...
《ATPL地面培训教材13:飞行原理》——第5章:升力
翻译:刘远贺;工具:Cursor & Claude 3.7;过程稿 第5章:升力 目录 空气动力系数基本升力方程回顾升力曲线升力曲线的解释速度-动压关系密度高度翼型剖面升力特性阻力特性简介升阻比飞机重量对最小飞行速度的影响表…...
STM32部分:2、环境搭建
飞书文档https://x509p6c8to.feishu.cn/wiki/DQsBw76bCiWaO4kS8TXcWDs0nAh Keil MDK用于编写代码,编译代码芯片支持包,用于支持某类芯片编程支持STM32CubeMX用于自动生成工程,减少手动重复工作 STM32F1系列芯片支持包 软件下载 直接下载&am…...
STL之list容器
list的介绍 1.list的底层是双向链表结构,双向链表中的每个元素在互不相关的独立结点中,在结点中通过指针指向前一个元素和后一个元素 2.list是可以在常数范围内在任意位置的插入和删除的序列式容器,并且该容器可以前后双向迭代 3.vector的…...
DNS 域名解析
DNS(Domain Name System) 是一个将域名转换为IP地址的系统。它的主要功能是使用户能够通过易于记忆的域名访问互联网资源,而不是记住复杂的IP地址。DNS类似于“互联网的电话簿”,帮助计算机找到彼此的位置。 一、DNS的基本概念 …...
我写了一个分析 Linux 平台打开文件描述符跨进程传递的工具
Linux 系统的设计中,继承了 Unix “一切皆文件” (Everything is a file) 的思想,系统中的众多对象,都可以表示为文件,可以对它们执行文件操作,如 read()、write()、mmap()、ioctl()、close() 和 poll() 等。Linux 系统…...
QML图像提供器 (Image Provider)
QML 中的图像提供器是一种自定义图像加载机制,允许你从非文件源(如数据库、网络或程序生成的内容)提供图像数据。 主要类型 QQuickImageProvider - 基础图像提供器 QPixmapImageProvider - 提供 QPixmap 图像 QImageImageProvider - 提供 …...
【Java学习】通配符?
面向对象系列八:泛型(二) 一、通配符? 二、泛型符<> 1.泛型类里 2.泛型类外 2.1使用过程中 2.2使用最后末 三、限制 1.泛型类里的限制 2.延申处的限制 2.1extend限制上界 2.1.1返回值接 2.1.2形参传 2.2super限制下界 2.2.1形参传 2.2.2返回值…...
安卓基础(悬浮窗和摄像)
ACTION_MANAGE_OVERLAY_PERMISSION 的作用就是 打开系统设置的「悬浮窗权限管理页面」 Intent intent new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION,Uri.parse("package:" getPackageName()) ); startActivity(intent); 直接跳转目标应用的权限…...
一种实波束前视扫描雷达目标二维定位方法——论文阅读
一种实波束前视扫描雷达目标二维定位方法 1. 专利的研究目标与实际问题意义2. 专利提出的新方法、模型与公式2.1 运动平台几何建模与回波信号构建2.1.1 距离历史建模2.1.2 回波信号模型2.2 距离向运动补偿技术2.2.1 匹配滤波与距离压缩2.3 加权最小二乘目标函数2.3.1 方位向信号…...
基于springboot的金院银行厅预约系统的设计及实现(源码+lw+部署文档+讲解),源码可白嫖!
摘要 随着信息技术在管理上越来越深入而广泛的应用,信息管理系统的实施在技术上已逐步成熟。信息管理系统是一个不断发展的新型学科,任何一个单位要生存要发展,要高效率地把内部活动有机地组织起来,就必须建立与自身特点相适应的…...
AVFormatContext 再分析零
随着对于AVFormatContext 各个参数的学习,逐渐可以从 整体架构上 再认识一下 AVFormatContext 了。 还是从解封装的第一步开始。 int avformat_open_input(AVFormatContext **ps, const char *url, ff_const59 AVInputFormat *fmt, AVDictionary **options); 实际上…...
【学习心得】魔塔(ModelScope)和抱抱脸(Hugging Face)下载模型小细节
介绍常用的两种在模型社区如魔塔(ModelScope)和抱抱脸(Hugging Face),下载预训练模型的方法,然后说明各种方法里面的小细节。 一、SDK下载 对于希望直接通过编程方式集成模型下载功能到自己的项目中的开发…...
嵌入式硬件篇---STM32 系列单片机型号命名规则
文章目录 前言一、STM32 型号命名规则二、具体型号解析1. STM32F103C8T6F103:C:8:T6:典型应用2. STM32F103RCT6F103:R:C:T6:典型应用三、命名规则扩展1. 引脚数与封装代码2. Flash 容量代码3. 温度范围代码四、快速识别技巧性能定位:F1/F4后缀差异硬件设计参考:引脚数…...
关于算法设计与分析——拆分表交换问题
题目: 用蛮力法设计一个算法,将A{a1, a2, ..., an}拆成B和C两个表,使A中值大于等于0的元素存入表B,值小于0的元素存入表C,要求表B和C不另外设置存储空间而利用表A的空间。 1)问题分析 题目要求设计一个算…...
在pycharm profession 2020.3上离线安装.whl类型的包(以PySimpleGUI为例)
今天写个小代码,用到了PySimpleGUI。 在pycharm profession 2020.3的项目中的Terminal里运行如下代码即可安装。 python3 -m pip install --force-reinstall --extra-index-url https://PySimpleGUI.net/install PySimpleGUI 安装方法如图: 安装后使用…...
c++回调函数
函数指针 //函数 bool lengthCompare(const string&, const string&); //pf为指针,指向一个函数,函数的类型为:bool (const string&, const string&) bool (*pf)(const string&, const string&); //函数࿰…...
mysql主从复制搭建,并基于Keepalived + VIP实现高可用
以下是基于 Keepalived VIP 实现 MySQL 主从复制高可用的详细步骤,涵盖主从复制搭建与故障自动切换: 一、MySQL 主从复制搭建(基础步骤回顾) 1. 主库(Master)配置 修改配置文件 /etc/my.cnf&…...
时间交织(TIADC)的失配误差校正处理(以4片1GSPS采样率的12bitADC交织为例讲解)
待写…有空再写,有需要的留言。 存在失配误差的4GSPS交织 校正完成后的4GSPS交织...
K8S自动弹性伸缩机制详解
Kubernetes (K8S) 自动弹性伸缩机制详解 Kubernetes 通过多种控制器和指标系统实现 自动弹性伸缩,主要包括 Pod水平伸缩(HPA)、垂直伸缩(VPA)、集群节点伸缩(CA) 三种方式。以下是核心机制和实…...
C++模版结构体的使用
1. convert_pointer 结构体模板 template<typename _SourceIterator, typename _DestT> struct convert_pointer {typedef typename convert_pointer<typename _SourceIterator::pointer, _DestT>::type type; };作用 这是一个递归模板,用于处理 _Sou…...
WebRTC 服务器之Janus架构分析
1. Webrtc三种类型通信架构 1.1 1 对 1 通信 1 对 1 通信模型设计的主要⽬标是尽量让两个终端进⾏直联,这样即可以节省服务器的资源,⼜可以提⾼ ⾳视频的服务质量。WebRTC ⾸先尝试两个终端之间是否可以通过 P2P 直接进⾏通信,如果⽆法直接…...
音视频开发成长之路与音视频知识总结
音视频开发曾经是一个富有挑战性和技术深度的领域。我来分享整理音视频开发的成长路径和知识体系: 音视频开发成长路线图 1. 基础阶段(1-3个月) 计算机基础:C/C、数据结构、操作系统音视频基础概念:采样率、比特率、…...
batch normalization和layer normalization区别
Normalization无非就是这样一个操作: 其中x是输入数据,维度为(B,T,C),其中B是batchsize,T是序列长度,C是embedding维度;括号内是标准化操作,γ和…...
Android Compose 层叠布局(ZStack、Surface)源码深度剖析(14)
Android Compose 层叠布局(ZStack、Surface)源码深度剖析 一、引言 在 Android 应用开发领域,用户界面(UI)的设计与实现一直是至关重要的环节。随着技术的不断演进,Android Compose 作为一种全新的声明式…...
数据仓库方法论书籍及其阅读建议
A、关于数据仓库方法论的各书籍详细分析及汇总 1. 《Building the Data Warehouse (Third Edition)》 by W.H. Inmon 核心观点 企业级数据仓库(EDW):自上而下的架构,采用第三范式(3NF)模型&…...
数据库 1.0
数据库就是放数据的地方 程序里面的数据就是暂时性的 要是想把数据永久性的储存 MySQL是典型的C / S架构 Client 云端 Sever 服务端 数据库服务的开启和关闭 可以在这里选择关闭开启,关闭之后就无法通过终端再连接mysql了 通过命令行的方式开启和关闭mysql&…...
给QCustomPlot添加一个QScrollBar滚动条、限制缩放范围、自动设置大小和右边栏垂直缩放
实现效果 实现思路 从QCustomPlot类派生一个类,进行个性化设置,在轴矩形的上边设置Margin,放一个滚动条,设置滚动条的样式 常量定义 #define NQSCRB 1000构造函数初始化 // 设置QScrollBar的样式// 顶部空--5,左侧空--6...
计算机系统结构 第二章 :缓存优化
零-1:复习cache的基础知识: 一、映像方式 直接映射 原理:主存被分成若干区,每个区大小与 Cache 相同,区内再分块,主存每个区中块的大小和 Cache 中块大小相等,且每个区包含的块数也与 Cache 中块数相等。主存中任意…...
软件工程实践
例一 用例文档 UC1注册 执行者 潜在会员 前置条件 潜在会员访问系统 后置条件 系统已记录注册信息 涉众利益 潜在会员——希望注册尽量简单,希望自己的信息不会泄露 商店——希望获得尽可能多的未来客户信息,特别是联系方法 基本路径 1.潜在会员请求注册…...
将Airtable导入NocoDB
将Airtable导入NocoDB 0. 前提条件1. 详细步骤 NocoDB提供了一种简化流程,可在几分钟内将您的Airtable数据库无缝转移到各种数据库管理系统,包括MySQL、Postgres和SQLite。此功能特别适合希望将Airtable数据库迁移到更强大且可扩展的数据库管理系统中的用…...
【云备份】服务端数据管理模块设计与实现
目录 一、要管理的数据 二、如何管理数据 三.数据管理类的设计 3.1.数据信息结构体的设计 3.2.数据管理类的设计 四.数据管理类实现 4.1.数据信息结构体的数据填充 4.2.数据管理类的实现 五. 源代码测试 数据管理模块:需要管理的数据有哪些,而…...
Qt开发:按钮类的介绍和使用
文章目录 一、命令按钮类 (QPushButton)1.1 基本功能介绍1.2 常用构造函数1.3 常用方法1.4 信号与槽使用示例1.5 开关按钮(Checkable)1.6 创建出菜单按钮(Menu Button) 二、工具按钮类 (QToolBu…...
Clickhouse基于breakpad生成minidump文件,方便问题定位
背景 breakpad能够在程序崩溃的时候自动生成一个mini的core文件,能够帮助进行问题定位,但是clickhouse对于集成breappad的难度较大 查看github发现之前有大佬基于以前的分支有个MR,但是一直没有合并到社区,想来是有什么其他的原因…...
华为云Astro轻应用自定义连接器对接OBS云对象存储操作指南
操作难点图例(详细见下文详细操作步骤) 操作成功图例 说明:以下是通过自定义连接器创建新的OBS桶的图例 说明:以下是通过自定义连接器将数据内容嵌入创建新的OBS桶的图例 操作难点图例 说明:连接器编排需要注意的是动作选择、输入参数的设置等...
C# 运算符重载深度解析:从基础到高阶实践
运算符重载是 C# 中一项强大的特性,它允许开发者为用户自定义类型定义运算符的行为,使得代码更直观、更符合领域逻辑。本文将通过理论解析与实战示例,全面讲解运算符重载的实现规则、适用场景及注意事项。 一、运算符重载的核心概念 1. 什么…...
面试现场“震”情百态:HashMap扩容记
(以下为符合要求的文章内容) 【场景】 2024年秋招季某互联网大厂会议室 面试官:张工(P8级架构师) 求职者:马小帅(双非二本应届生) 第一轮提问(Java基础篇) …...
SCAU18124--N皇后问题
18124 N皇后问题 时间限制:5000MS 代码长度限制:10KB 提交次数:0 通过次数:0 题型: 编程题 语言: G;GCC;VC Description 有N*N的国际象棋棋盘,要求在上面放N个皇后,要求任意两个皇后不会互杀,有多少种不同的放法? 输入格式 …...