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

Vue 常用组件间通信方式

Vue 常用组件间通信方式

1. 父子组件通信

1.1 Props

父组件通过 props 向子组件传递数据,子组件通过 props 接收数据。

<!-- ParentComponent.vue -->
<template><ChildComponent :message="parentMessage"></ChildComponent>
</template><script>
import ChildComponent from './ChildComponent.vue';export default {components: { ChildComponent },data() {return {parentMessage: 'Hello from Parent',};},
};
</script>
<!-- ChildComponent.vue -->
<template><div>{{ message }}</div>
</template><script>
export default {props: ['message'],
};
</script>

1.2 Event Emitting

子组件通过 $emit 触发事件,父组件监听事件并接收数据。

<!-- ChildComponent.vue -->
<template><button @click="sendMessage">Send Message to Parent</button>
</template><script>
export default {methods: {sendMessage() {this.$emit('message-from-child', 'Hello from Child');},},
};
</script>
<!-- ParentComponent.vue -->
<template><ChildComponent @message-from-child="receiveMessage"></ChildComponent>
</template><script>
import ChildComponent from './ChildComponent.vue';export default {components: { ChildComponent },methods: {receiveMessage(message) {console.log(message);},},
};
</script>

1.3 优缺点

Props 和 Event Emitting

优点

  • 简单直观:适用于父子组件之间的数据传递,易于理解和使用。
  • 单向数据流:保持了数据从父组件流向子组件,事件从子组件流向父组件的单向数据流,有助于维护数据的一致性和可预测性。
  • 明确的数据传递:通过 props 和事件,可以明确地看到数据的来源和去向。

缺点

  • 多级传递:在深层次组件结构中,可能需要逐级传递 props 和事件,导致代码冗长和复杂。
  • 事件管理:需要小心管理事件的触发和监听,避免事件名冲突和处理逻辑的混乱。

2. 兄弟组件通信

2.1 Event Bus

通过一个中央事件总线(Event Bus)在兄弟组件之间传递数据。

// EventBus.js
import Vue from 'vue';
export const EventBus = new Vue();

在需要发送事件的组件中,通过 Event Bus 触发事件:

<!-- ComponentA.vue -->
<template><button @click="sendMessage">Send Message to Component B</button>
</template><script>
import { EventBus } from './EventBus';export default {methods: {sendMessage() {EventBus.$emit('message', 'Hello from Component A');},},
};
</script>

在需要接收事件的组件中,通过 Event Bus 监听事件:

<!-- ComponentB.vue -->
<template><div>{{ message }}</div>
</template><script>
import { EventBus } from './EventBus';export default {data() {return {message: '',};},created() {EventBus.$on('message', (msg) => {this.message = msg;});},beforeDestroy() {EventBus.$off('message'); // 避免内存泄漏},
};
</script>

2.2 优缺点

Event Bus

优点

  • 解耦合:通过中央事件总线进行通信,组件之间不需要直接引用对方,减少了组件之间的耦合度。
  • 灵活性高:可以在任何组件中触发和监听事件,适应不同的通信需求。
  • 简单易用:实现和使用都比较简单,适用于兄弟组件之间的通信。

缺点

  • 难以调试和维护:在大型应用中,事件的传递和监听链条可能会变得复杂,调试和维护会比较困难。
  • 事件命名冲突:如果没有良好的命名规范,事件名称可能会发生冲突,导致意外的问题。
  • 性能问题:如果频繁触发和监听大量事件,可能会对性能造成影响。

3. 跨层级组件通信

3.1 Provide/Inject

父组件通过 provide 提供数据,任意深度的子组件通过 inject 接收数据。

<!-- GrandparentComponent.vue -->
<template><div><parent-component></parent-component></div>
</template><script>
import ParentComponent from './ParentComponent.vue';export default {components: {ParentComponent},provide() {return {message: 'Hello from Grandparent',};},methods: {}
};
</script>
<!-- ChildComponent.vue -->
<template><div>{{ message }}</div>
</template><script>
export default {inject: ['message'],
};
</script>

3.2 优缺点

Provide/Inject

优点

  • 简化跨层级数据传递:避免逐级传递 props,简化了数据在多层组件之间的传递。
  • 解耦合:祖先组件和后代组件通过 provideinject 进行数据共享,不需要直接引用对方,降低了组件间的耦合度。
  • 灵活性高:可以在任意层级的组件中使用,适用于多种复杂的组件结构。

缺点

  • 隐式数据依赖:数据依赖关系是隐式的,不如 props 和事件那样显式,可能会使代码的可读性和可维护性降低。
  • 单向数据流限制inject 只能获取由 provide 提供的数据,不能直接修改提供的数据。如果需要修改数据,需要通过事件通知祖先组件进行更新。
  • 缺少响应式provideinject 提供的数据虽然是响应式的,但如果祖先组件的数据是通过对象解构或其他方式传递,可能会失去响应式特性。

4. 使用 Vuex 状态管理

4.1 Vuex

Vuex 是一个专为 Vue.js 应用开发的状态管理模式,适用于复杂的应用场景。

// store.js
import Vue from 'vue';
import Vuex from 'vuex';Vue.use(Vuex);export default new Vuex.Store({state: {message: 'Hello from Vuex',},mutations: {setMessage(state, newMessage) {state.message = newMessage;},},
});
<!-- ComponentOne.vue -->
<template><button @click="updateMessage">Update Message</button>
</template><script>
import { mapMutations } from 'vuex';export default {methods: {...mapMutations(['setMessage']),updateMessage() {this.setMessage('New Message from Component One');},},
};
</script>
<!-- ComponentTwo.vue -->
<template><div>{{ message }}</div>
</template><script>
import { mapState } from 'vuex';export default {computed: {...mapState(['message']),},
};
</script>

4.2 优缺点

Vuex 状态管理

优点

  • 全局状态管理:提供了一个全局的、响应式的数据存储,适用于复杂的应用场景。
  • 单向数据流:Vuex 通过单向数据流和严格的状态管理,有助于维护数据的一致性和可预测性。
  • 调试工具:提供了 Vue Devtools 插件,帮助开发者调试和管理状态。

缺点

  • 学习成本:引入了额外的复杂性和学习成本,特别是对于小型项目,可能显得过于繁琐。
  • 模板代码:需要编写大量的模板代码(actions、mutations、getters 等),增加了开发负担。
  • 性能开销:在频繁更新状态的场景中,可能会带来一定的性能开销。

5. $attrs 和 $listeners

$attrs$listeners 是 Vue.js 提供的两个实例属性,用于父组件和子组件之间传递属性和事件。它们可以简化中间组件的代码,将属性和事件传递给深层次的子组件。

5.1 $attrs

$attrs 是一个包含了父组件传递给当前组件的所有属性(props 除外)的对象。使用 $attrs 可以将这些属性传递给子组件,特别是在中间组件不关心这些属性的情况下。

<!-- GrandparentComponent.vue -->
<template><parent-component message="Hello from Grandparent" class="grandparent-class"></parent-component>
</template><script>
import ParentComponent from './ParentComponent.vue';export default {components: { ParentComponent }
};
</script>
<!-- ParentComponent.vue -->
<template><child-component v-bind="$attrs"></child-component>
</template><script>
import ChildComponent from './ChildComponent.vue';export default {components: { ChildComponent },inheritAttrs: false // 需要关闭属性继承,以便手动控制 $attrs
};
</script>
<!-- ChildComponent.vue -->
<template><div>{{ message }}</div>
</template><script>
export default {props: ['message']
};
</script>

在这个示例中,GrandparentComponentParentComponent 传递了一个属性 message 和一个 class 属性。ParentComponent 通过 v-bind="$attrs" 将这些属性传递给 ChildComponentChildComponent 接收到 message 属性,并将其展示出来。

5.2 $listeners

$listeners 是一个包含了父组件传递给当前组件的所有事件监听器的对象。使用 $listeners 可以将这些事件监听器传递给子组件,特别是在中间组件不关心这些事件的情况下。

<!-- GrandparentComponent.vue -->
<template><parent-component @custom-event="handleCustomEvent"></parent-component>
</template><script>
import ParentComponent from './ParentComponent.vue';export default {components: { ParentComponent },methods: {handleCustomEvent() {console.log('Custom event handled in GrandparentComponent');}}
};
</script>
<!-- ParentComponent.vue -->
<template><child-component v-on="$listeners"></child-component>
</template><script>
import ChildComponent from './ChildComponent.vue';export default {components: { ChildComponent }
};
</script>
<!-- ChildComponent.vue -->
<template><button @click="emitCustomEvent">Click Me</button>
</template><script>
export default {methods: {emitCustomEvent() {this.$emit('custom-event');}}
};
</script>

在这个示例中,GrandparentComponentParentComponent 传递了一个事件监听器 @custom-eventParentComponent 通过 v-on="$listeners" 将这个事件监听器传递给 ChildComponentChildComponent 触发 custom-event 事件,最终由 GrandparentComponent 处理。

5.3 优缺点

$attrs 和 $listeners

优点

  • 简化中间组件的代码:通过 $attrs$listeners,可以将属性和事件传递给深层次的子组件,减少中间组件的代码量。
  • 灵活性高:适用于需要将大量属性和事件传递给深层次组件的场景。

缺点

  • 隐式传递:数据和事件的传递是隐式的,可能会使代码的可读性和可维护性降低。
  • 仅适用于父子组件:只能用于父子组件之间的通信,无法解决跨层级或兄弟组件的通信问题。

6. ref 和 $refs

6.1 ref 和 $refs

适用于在父组件中直接访问子组件实例或 DOM 元素。

<!-- ParentComponent.vue -->
<template><div><child-component ref="childRef"></child-component><button @click="callChildMethod">Call Child Method</button></div>
</template><script>
import ChildComponent from './ChildComponent.vue';export default {components: { ChildComponent },methods: {callChildMethod() {this.$refs.childRef.someChildMethod();},},
};
</script>

6.2 优缺点

ref 和 $refs

优点

  • 直接访问组件实例和 DOM 元素:可以在父组件中直接操作子组件的实例和模板中的 DOM 元素,方便进行复杂的操作。
  • 简单易用:语法简单,容易理解和使用。

缺点

  • 紧耦合:使用 ref 会使父组件和子组件紧密耦合,增加了组件之间的依赖性,不利于组件的复用和测试。
  • 仅限于父子组件通信:这种方式只能在父子组件之间使用,无法解决兄弟组件或跨层级组件的通信问题。

7. Scoped Slots 插槽

7.1 Scoped Slots

Scoped Slots 是 Vue.js 提供的一种强大的插槽机制,允许父组件向子组件传递数据或回调函数,并在子组件的插槽中使用这些数据或函数。

<!-- ParentComponent.vue -->
<template><child-component><template v-slot:default="slotProps"><div>{{ slotProps.message }}</div></template></child-component>
</template><script>
import ChildComponent from './ChildComponent.vue';export default {components: { ChildComponent }
};
</script>
<!-- ChildComponent.vue -->
<template><div><slot :message="message"></slot></div>
</template><script>
export default {data() {return {message: 'Hello from Child'};}
};
</script>

7.2 优缺点

优点

  • 灵活性高:父组件可以完全控制插槽内容,并且子组件可以通过插槽传递数据。
  • 解耦合:父子组件之间通过插槽通信,保持了组件的解耦合。
  • 适用复杂场景:适用于需要在父组件中自定义子组件内容的复杂场景。

缺点

  • 学习成本:Scoped Slots 的概念和使用方法相对复杂,需要一定的学习成本。
  • 代码可读性:在模板中使用 Scoped Slots 可能会导致代码结构复杂,影响可读性。

8. Vue Router 导航守卫

8.1 Vue Router for Navigation Guards

Vue Router 的导航守卫可以在路由切换时进行组件间通信,特别是处理全局状态或数据加载。

// router.js
const router = new VueRouter({routes: [{path: '/some-path',component: SomeComponent,beforeEnter: (to, from, next) => {// 在导航时进行通信或状态更新console.log('Entering route');next();}}]
});

8.2 优缺点

优点

  • 适用导航相关逻辑:适用于处理导航相关的逻辑,如权限验证、数据加载等。
  • 全局控制:可以在路由级别控制组件的进入和离开,提供全局状态管理的机会。

缺点

  • 限制性强:仅适用于导航相关的通信场景,不能广泛应用于一般的组件通信。

9. Mixins

9.1 Mixins

Mixins 是一种复用代码的机制,可以将可复用的逻辑注入到多个组件中,从而实现组件间的间接通信。

// myMixin.js
export const myMixin = {data() {return {mixinData: 'Hello from Mixin'};},methods: {mixinMethod() {console.log('Mixin method called');}}
};
<!-- MyComponent.vue -->
<template><div>{{ mixinData }}</div>
</template><script>
import { myMixin } from './myMixin';export default {mixins: [myMixin]
};
</script>

9.2 优缺点

优点

  • 代码复用:可以将可复用的逻辑抽取到 mixin 中,减少重复代码。
  • 简化组件:通过 mixin 可以简化组件的代码,使组件更专注于自身逻辑。

缺点

  • 命名冲突:不同组件混入同一个 mixin 时,可能会导致命名冲突。
  • 调试困难:由于 mixin 的逻辑分散在多个文件中,调试时可能会较为困难。

10. Vue Composition API

10.1 Vue Composition API

Vue Composition API 是 Vue 3 引入的一种新的逻辑复用机制,可以通过组合函数的方式将逻辑复用到多个组件中。

// useMyComposable.js
import { ref } from 'vue';export function useMyComposable() {const data = ref('Hello from Composable');function method() {console.log('Composable method called');}return { data, method };
}
<!-- MyComponent.vue -->
<template><div>{{ data }}</div>
</template><script>
import { useMyComposable } from './useMyComposable';export default {setup() {const { data, method } = useMyComposable();method();return { data };}
};
</script>

10.2 优缺点

优点

  • 逻辑复用:通过组合函数可以实现高效的逻辑复用。
  • 模块化:逻辑更加模块化,易于维护和测试。
  • 适用范围广:适用于各种场景的逻辑复用和组件通信。

缺点

  • 学习成本:需要学习新的 API 和编程模式。
  • Vue 2 不完全支持:仅适用于 Vue 3 或引入了 Composition API 插件的 Vue 2 项目。

总结

在 Vue.js 中,组件间通信有多种方式,每种方式都有其适用的场景和优缺点。合理选择和组合这些方式,可以实现高效、清晰的组件间通信,满足不同的应用需求。常用的通信方式包括:

  1. Props 和 Event Emitting:适用于父子组件通信,简单直观,保持单向数据流。
  2. Event Bus:适用于兄弟组件通信,灵活高效,但难以调试和维护。
  3. Provide/Inject:适用于跨层级组件通信,简化数据传递,但存在隐式数据依赖。
  4. Vuex:适用于全局状态管理,适合大型应用,但引入了额外的复杂性。
  5. $attrs 和 $listeners:简化中间组件代码,适用于属性和事件的传递,但隐式传递可能影响可读性。
  6. ref 和 $refs:直接访问组件实例和 DOM 元素,适用于父子组件通信。
  7. Scoped Slots:灵活高效,适用于复杂的插槽内容传递。
  8. Vue Router for Navigation Guards:适用于导航相关逻辑的通信。
  9. Mixins:实现代码复用,但可能导致命名冲突和调试困难。
  10. Vue Composition API:高效的逻辑复用,适用于 Vue 3 项目。

相关文章:

Vue 常用组件间通信方式

Vue 常用组件间通信方式 1. 父子组件通信 1.1 Props 父组件通过 props 向子组件传递数据&#xff0c;子组件通过 props 接收数据。 <!-- ParentComponent.vue --> <template><ChildComponent :message"parentMessage"></ChildComponent>…...

NineData云原生智能数据管理平台新功能发布|2024年7月版

本月发布 12 项更新&#xff0c;其中性能优化 3 项、功能优化 8 项、安全性发布 1 项。 1. 性能优化 数据复制 - SQL Server 增量性能优化 调整读取和写入方式&#xff0c;让 SQL Server 增量复制的性能轻松达到 5000 RPS 以上。 数据复制 - Doris|SelectDB|StarRocks 性能优…...

验收测试:确保软件符合业务需求和合同要求

目录 前言1. 验收测试的概念1.1 用户验收测试&#xff08;UAT&#xff09;1.2 操作验收测试&#xff08;OAT&#xff09; 2. 验收测试的主要作用2.1 确认业务需求的满足2.2 验证合同要求的实现2.3 提升用户信心 3. 验收测试在整个测试中的地位3.1 测试的最后一道关卡3.2 用户与…...

Qt | QChartView+QDateTimeAxis(日期和时间数据图表)+QPieSeries(饼图)

点击上方"蓝字"关注我们 01、QDateTimeAxis QDateTimeAxis 是 Qt 中用于图表的轴类,它专门用于处理日期和时间数据。这个类允许你在图表上显示和解释与日期和时间相关的数据点。例如,在 Qt 的图表库中,你可以使用 QDateTimeAxis 来创建一个时间序列图表,展示股票…...

用闲置的阿里云服务器使用 NPS 实现内网穿透

最近有个项目需要给外地的同事预览一下&#xff0c;但是公司没有可以公网访问的测试服务器&#xff0c;所以想到用内网穿透的方式让外地同事可以访问到我的本机。刚好我有一台阿里云的服务器&#xff0c;双十一打折买了3年&#xff0c;1000左右&#xff0c;2核8G&#xff0c;买…...

一款免费开源绿色免安装的透明锁屏工具

一款免费开源绿色免安装的透明锁屏工具 这个工具的特点就是电脑锁屏的时候&#xff0c;仍然显示原桌面&#xff0c;但是无法操作&#xff0c;需要输入密码才可以解锁。输入密码界面也是隐藏的需要按键才能显示输入密码框。 电脑★★★★★透明锁屏工具&#xff1a;https://pa…...

程序员保持健康的 10 个技巧

长时间坐在电脑前&#xff0c;整天甚至通宵编程、处理 bug 和面对 dealine 的压力。作为一名软件工程师绝对不是一个非常健康的职业。 我经常去欧洲和美国会见许多开发人员。我经常注意到的是&#xff1a;许多开发人员把自己当成机器。他们已经完全放弃了感受身体的感觉&#…...

Java并发迷宫:同步的魔法与死锁的诅咒

在Java编程的宇宙中&#xff0c;有一个充满神秘与挑战的维度——并发编程。它如同一座错综复杂的迷宫&#xff0c;每个角落都潜藏着惊喜与陷阱。在这篇博客里&#xff0c;我们将一起探索这座迷宫的深处&#xff0c;揭开同步的魔法与死锁的诅咒。 第一章&#xff1a;同步魔法的…...

CoderGuide

CoderGuide是一个针对同学们前后端求职面试的开源项目&#xff0c;作为一名互联网/IT从业人员&#xff0c;经常需要搜索一些书籍、面试题等资源&#xff0c;在这个过程中踩过很多坑、浪费过很多时间。欢迎大家 Watch、Star&#xff0c;供各位同学免费使用&#xff0c;永不收费&…...

链式二叉树

链式二叉树&#xff0c;也称为二叉链表&#xff0c;是数据结构中一种非常重要的树形结构表示方法。在链式二叉树中&#xff0c;每个节点不仅包含数据域&#xff0c;还包含两个指针域&#xff0c;分别指向其左子节点和右子节点。这种结构允许二叉树动态地增长和缩减&#xff0c;…...

PHP高校迎新系统-计算机毕业设计源码08468

摘要 随着高校规模的不断扩大和新生人数的增加&#xff0c;传统的手工登记和管理方式已经无法满足高效、准确的需求。为了提升大学新生入学迎新工作的效率和质量&#xff0c;本研究设计开发了一套高校迎新系统。系统通过信息技术的应用&#xff0c;集成了首页、交流论坛、通知公…...

泛微开发修炼之旅--41Ecology基于触发器实现增量数据同步(人员、部门、岗位、人员关系表、人岗关系表)

一、需求背景 我们在项目上遇到一个需求&#xff0c;需要将组织机构数据&#xff08;包含人员信息、部门信息、分部信息、人岗关系&#xff09;生成的增量数据&#xff0c;实时同步到三方的系统中&#xff0c;三方要求&#xff0c;只需要增量数据即可。 那么基于ecology系统&a…...

FVM安装及配置

一、下载fvm 包 git&#xff1a;Release fvm 3.1.7 leoafarias/fvm GitHub 解压到本地文件夹&#xff0c;然后添加环境变量 管理员模式打开cmd&#xff0c;查看是否成功 fvm --version 二、安装Dart SDK 下载Dart SDK&#xff1a;Dart for Windows 三、安装GIT 四、指定…...

[Git][认识Git]详细讲解

目录 1.什么是仓库&#xff1f;2.认识工作区、暂存区、版本库3.认识 .git1.index2.HEAD && master3.objects4.总结 1.什么是仓库&#xff1f; 仓库&#xff1a;进⾏版本控制的⼀个⽂件⽬录 2.认识工作区、暂存区、版本库 工作区&#xff1a;在电脑上写代码或⽂件的⽬录…...

Win11系统Docker部署Blazor程序

1. 开发环境 Windows 11 家庭版&#xff0c;默认支持WSL2 2. Docker安装 安装Docker Desktop需要启用Win11的Linux子系统和虚拟机。以管理员身份运行命令行程序&#xff0c;执行如下命令&#xff1a; 启用适用于 Linux 的 Windows 子系统 dism.exe /online /enable-featur…...

C语言自定义类型结构体与位段超详解

文章目录 1. 结构体类型的声明1. 1 结构体声明1. 2 结构体变量的创建和初始化1. 3 结构体的特殊声明1. 3 结构体的自引用 2. 结构体内存对齐2. 1 对齐规则2. 2 为什么存在内存对齐2. 3 修改默认对齐数 3. 结构体传参4. 结构体实现位段4. 1 什么是位段4. 2 位段成员的内存分配4.…...

JS中关于预编译的【关键知识点】总结

在JavaScript中&#xff0c;预编译&#xff08;hoisting&#xff09;是指在代码执行之前&#xff0c;JavaScript引擎会首先对代码进行扫描&#xff0c;将所有的变量声明和函数声明提升到代码的最顶部。这一过程使得我们在代码中可以在声明之前使用变量和函数。理解预编译对于深…...

Elasticsearch 映射(mapping)

概念 在 Elasticsearch 中&#xff0c;映射&#xff08;Mapping&#xff09;定义了索引中字段的类型和属性。它是索引数据结构的基础&#xff0c;类似于传统数据库中的表结构定义。映射不仅定义了字段的类型&#xff08;如 ​text​、​keyword​、​integer​ 等&#xff09;…...

开放式耳机更适合运动的时候使用?开放式耳机推荐指南

开放式耳机确实非常适合运动时使用&#xff0c;原因主要有以下几点。 首先&#xff0c;保持对外界的感知是很重要的一点。在运动的时候&#xff0c;我们需要听到周围的环境声音&#xff0c;比如车辆的行驶声、行人的呼喊等&#xff0c;以便及时做出反应&#xff0c;保证自身安全…...

食堂窗口自助点餐小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;用户管理&#xff0c;商家管理&#xff0c;店铺信息管理&#xff0c;菜品分类管理&#xff0c;菜品信息管理&#xff0c;订单管理&#xff0c;系统管理 微信端账号功能包括&#xff1a;系统首页&#…...

请说出路由传参和获取参数的三种方式

在Vue.js中使用Vue Router进行路由管理时&#xff0c;传递和获取参数是常见的需求。这里介绍三种主要的路由传参和获取参数的方式&#xff1a; 1. 通过URL的查询参数&#xff08;Query Parameters&#xff09; 传递参数&#xff1a; 当你需要传递一些非敏感数据&#xff08;…...

精准防控,高效管理:AI智能分析网关V4区域未停留检测算法的介绍及应用

一、区域未停留AI检测算法概述 随着人工智能和计算机视觉技术的飞速发展&#xff0c;区域未停留AI检测算法作为一种重要的视频分析技术&#xff0c;逐渐在各个领域得到广泛应用。该算法通过高效处理视频流数据&#xff0c;能够实时分析并判断目标对象是否在预设区域内有足够的…...

html+css練習:iconfont使用

1.網址地址&#xff1a;https://www.iconfont.cn/search/index 2.註冊登錄&#xff0c;將需要的圖標添加到購物車 3.下載代碼 4.下載后的代碼有一個html頁面&#xff0c;裡面有詳細的使用方式...

算法导论 总结索引 | 第五部分 第二十一章:用于不相交集合的数据结构

一些应用涉及 将n个不同的元素分成一组不相交的集合。寻找包含给定元素的唯一集合 和 合并两个集合 1、不相交集合的操作 1、一个不相交集合 数据结构 维持了 一个不相交动态集的集合 S {S_1, S_2,…, S_n}。用一个代表 来标识每个集合&#xff0c;它是这个集合的某个成员。…...

【单例设计模式】揭秘单例模式:从原理到实战的全方位解析(开发者必读)

文章目录 深入理解单例设计模式&#xff1a;原理、实现与最佳实践引言第一部分&#xff1a;设计模式简介第二部分&#xff1a;单例模式定义第三部分&#xff1a;单例模式的优点和缺点第四部分&#xff1a;单例模式的实现方式懒汉式非线程安全的实现线程安全的实现&#xff08;双…...

VTK8.2.0编译(Qt 5.14.2+VS2017)

VTK8.2.0编译&#xff08;Qt 5.14.2VS2017&#xff09; 关于Qt和MSVC的安装&#xff0c;可以参考文章&#xff08;QtMSVC2017&#xff09;。 本篇VTK在QtMSVC的配置下的编译。VTK 以8.2.0为例。 一、环境变量的配置 我们打开电脑的环境变量&#xff0c;可以看到没有Qt相关的…...

武汉流星汇聚:亚马逊跨境电商龙头,市场份额稳固,服务品质卓越

在全球跨境电商的版图上&#xff0c;亚马逊无疑是一颗璀璨的明星&#xff0c;以其庞大的市场规模、卓越的用户体验和强大的品牌影响力&#xff0c;稳居行业龙头地位。即便在诸多新兴跨境平台竞相崛起的背景下&#xff0c;亚马逊依然以其独特的优势&#xff0c;保持着难以撼动的…...

我出一道面试题,看看你能拿 3k 还是 30k!

大家好&#xff0c;我是程序员鱼皮。欢迎屏幕前的各位来到今天的模拟面试现场&#xff0c;接下来我会出一道经典的后端面试题&#xff0c;你只需要进行 4 个简单的选择&#xff0c;就能判断出来你的水平是新手&#xff08;3k&#xff09;、初级&#xff08;10k&#xff09;、中…...

opecv c++计算图像的曲率

公式 κ z x x ⋅ z y 2 − 2 ⋅ z x ⋅ z y ⋅ z x y z y y ⋅ z x 2 ( z x 2 z y 2 1 ) 3 / 2 \kappa \frac{z_{xx} \cdot z_y^2 - 2 \cdot z_x \cdot z_y \cdot z_{xy} z_{yy} \cdot z_x^2}{(z_x^2 z_y^2 1)^{3/2}}\newline κ(zx2​zy2​1)3/2zxx​⋅zy2​−2⋅zx​…...

鸿蒙 IM 即时通讯开发实践,融云 IM HarmonyOS NEXT 版

融云完成针对“纯血鸿蒙”操作系统的 SDK 研发&#xff0c;HarmonyOS NEXT 版融云 IM SDK 已上线&#xff0c;开发者可在“鸿蒙生态伙伴 SDK 市场”查询使用。 发挥 20 年通信行业技术积累和领创品牌效应&#xff0c;融云为社交、娱乐、游戏、电商、出行、医疗等各行业提供专业…...

仿wordpress站/精准客户信息一条多少钱

1、苹果公司的借鉴 1&#xff09;、硬件为软件服务2&#xff09;、软件为用户体验服务3&#xff09;、用户体验为情感服务4&#xff09;、产品为真正的需求服务2、如何在成熟的市场抢占一席之地&#xff1f;1&#xff09;、对目标市场了如指掌&#xff0c;对现有产品的缺陷洞若…...

高大上的自助建站网站/tool站长工具

目录一、本地运行模式1. 主要项目结构&#xff1a;2. 配置pom.xml引入需要的jar包3. Map过程4. Reduce过程5. 核心类Driver&#xff1a;二、集群运行模式&#xff1a;1. 打包项目为jar包2. 上传打包的项目jar包到data目录下3. 运行项目jar包一、本地运行模式 1. 主要项目结构&…...

武汉小程序开发制作/站长工具seo综合查询工具

场景&#xff1a; 我们现在有一个树状结构的数据&#xff0c;如下图&#xff1a; 大概的数据结构如下&#xff1a; const tree {value: 根节点,children: [{value: 学校,children: [{value: 学生,children: [{value: 年龄,children: [{value: 身高}]}]}......]}]}现在我们要…...

网站建设客户问题/网络推广公司名字

本文为美国北达科他州立大学&#xff08;作者&#xff1a;Revathi Dhamotharan&#xff09;的硕士论文&#xff0c;共42页。 由于云存储维护成本低&#xff0c;被广泛用于数据共享。但是&#xff0c;在云端保护数据也是必要的。云上的安全数据共享主要集中在&#xff1a;a&…...

兰州网站建设价/站长网站seo查询

http://one.laptop.org/...

如何在网站上做免费广告/百度云app下载安装

http://www.cnblogs.com/cherri/archive/2010/12/03/1895541.html 一.多线程对于iPhone应用程序开发很重要 在一个程序中&#xff0c;这些独立运行的程序片断叫作“线程”&#xff08;Thread&#xff09;&#xff0c;利用它编程的概念就叫作“多线程处理”。多线程处理一个常见…...