Vue 3 的组件式开发(3)

news2024/10/27 23:16:32

1 Vue 3 组件高级特性

1.1 提供/注入(Provide/Inject)

Vue 3中的Provide/Inject是一种高级组件通信方法,允许父组件向其所有子孙组件提供数据或方法,而无需通过props逐层传递。

1.1.1 基本概念

  • Provide:父组件通过provide函数提供数据或方法,这些数据或方法可以被其所有子孙组件通过inject函数注入。
  • Inject:子孙组件通过inject函数注入由祖先组件提供的数据或方法。

1.1.2 使用方法

  1. 在父组件中使用Provide

    • 引入provide函数。
    • 使用provide函数提供数据或方法,通常是在父组件的setup函数中进行。
    • provide函数接收两个参数:第一个参数是注入名(可以是字符串或Symbol),用于标识提供的数据或方法;第二个参数是提供的值(可以是任何类型的数据或方法)。
  2. 在子孙组件中使用Inject

    • 引入inject函数。
    • 使用inject函数注入由祖先组件提供的数据或方法,通常是在子孙组件的setup函数中进行。
    • inject函数接收一个参数:注入名(与provide函数中提供的注入名相匹配)。
    • 如果祖先组件没有提供对应的数据或方法,inject函数会返回一个默认值(如果指定了的话)。

1.1.3 应用场景

  1. 跨层级通信:当需要在多层嵌套的组件之间进行数据传递时,使用Provide/Inject可以简化数据流,避免在每个中间组件中都使用props进行传递。
  2. 避免重复声明:在一些场景下,可能需要在多个组件中使用相同的数据或方法。通过Provide/Inject,可以在一个组件中提供这些数据或方法,并在其他组件中注入使用,从而避免重复声明。
  3. 封装通用服务:可以将一些通用的逻辑或数据封装在父组件中,并通过provide提供给需要的子孙组件。这样可以提高代码的可复用性和可维护性。

1.1.4 注意事项

  1. 非响应式:Provide和Inject本身不是响应式的。如果父组件提供的值发生变化,子组件不会自动更新。如果需要响应式的数据传递,可以考虑使用Vuex或其他状态管理库。
  2. 不可选项:无论父组件是否真的提供了数据,子组件都会尝试注入。如果没有提供对应的provide,则inject的属性将会有一个默认值(如果指定了的话)。
  3. 使用Symbol提供独一无二的注册名:为了避免注入名冲突,可以使用Symbol来提供独一无二的注册名。这样可以确保每个组件都正确地注入到所需的数据或方法。

1.1.5 示例代码

以下是一个简单的示例代码,演示了如何在Vue 3中使用Provide/Inject进行组件通信:

<!-- 父组件 -->
<template>
  <div class="parent">
    <h1>父组件</h1>
    <child-component></child-component>
  </div>
</template>

<script setup>
import { ref, provide } from 'vue';
import ChildComponent from './ChildComponent.vue';

const message = ref('Hello from Parent!');

provide('message', message);
</script>
<!-- 子组件 -->
<template>
  <div class="child">
    <h2>子组件</h2>
    <p>{{ injectedMessage }}</p>
  </div>
</template>

<script setup>
import { inject } from 'vue';

const injectedMessage = inject('message', 'Default Message'); // 如果没有提供'message',则使用默认值'Default Message'
</script>

在这个示例中,父组件通过provide函数提供了一个名为’message’的数据,子组件通过inject函数注入了这个数据,并在模板中进行了显示。如果父组件没有提供’message’,则子组件将显示默认值’Default Message’。

1.2 组件的递归调用

在Vue 3中,组件的递归调用指的是一个组件在其模板中调用自身的情况。这种技术通常用于处理具有递归结构的数据,如树形菜单、评论的嵌套回复、文件系统的目录结构等。

1.2.1 基本概念

  • 递归组件:一个能够调用自身的Vue组件。
  • 递归结构:数据本身具有层次性,每一层的数据结构都与上一层相同或相似,从而可以形成树状结构。

1.2.2 实现步骤

  1. 定义递归组件

    首先,你需要定义一个Vue组件,并在其模板中设置递归调用的条件。这通常是通过一个v-for指令来遍历一个数组或对象,并在遍历的过程中调用自身组件。

  2. 设置递归终止条件

    递归调用必须有一个终止条件,否则会导致无限递归,最终引发栈溢出错误。在Vue组件中,这个终止条件通常是通过检查数据的某个属性来实现的。例如,对于树形结构的数据,你可以检查节点是否有子节点来决定是否继续递归调用组件。

  3. 传递数据

    在递归调用组件时,你需要将当前节点的数据作为props传递给子组件。这样,子组件就可以根据这些数据来渲染自己的内容,并决定是否继续递归调用。

1.2.3 注意事项

  1. 性能问题:递归组件可能会导致性能问题,特别是当数据层次很深时。因此,在使用递归组件时,你需要注意性能优化,如使用虚拟滚动、懒加载等技术。

  2. 避免无限递归:确保你的递归组件有一个明确的终止条件。如果终止条件设置不当,可能会导致无限递归,从而引发性能问题或错误。

  3. 组件命名:在递归调用中,确保组件的命名不会与全局或局部注册的组件冲突。

  4. 数据更新:当递归组件的数据发生变化时,Vue会重新渲染组件。但是,由于递归组件的复杂性,有时可能需要手动处理一些更新逻辑,如重置滚动位置等。

1.2.4 示例代码

在Vue 3中,当你想在组件内部递归调用自身时,你需要确保组件已经正确注册,并且能够在模板中被识别。这通常意味着你需要在单文件组件(.vue文件)中定义组件,并为其指定一个name选项,或者在父组件中局部注册该组件。

以下是一个完整的示例,展示了如何在Vue 3中创建一个递归组件来渲染一个树形结构的数据:

TreeMenuItem.vue

<template>
  <div class="tree-menu-item">
    <div>{{ node.name }}</div>
    <div v-if="hasChildren" class="children">
      <tree-menu-item
        v-for="child in node.children"
        :key="child.id"
        :node="child"
      />
    </div>
  </div>
</template>

<script>
export default {
  name: 'TreeMenuItem',
  props: {
    node: {
      type: Object,
      required: true,
      default: () => ({})
    }
  },
  computed: {
    hasChildren() {
      return this.node.children && this.node.children.length > 0;
    }
  }
};
</script>

<style scoped>
.tree-menu-item {
  margin-left: 20px;
}

.children {
  margin-top: 5px;
}
</style>

在这个组件中,我们定义了一个名为TreeMenuItem的组件,它接受一个node作为prop。这个node对象应该有一个name属性和一个可选的children数组,其中children数组包含更多的节点对象。我们使用v-if指令来检查是否有子节点,如果有,则递归地渲染TreeMenuItem组件。

ParentComponent.vue

<template>
  <div class="parent-component">
    <h1>Tree Menu</h1>
    <tree-menu-item :node="treeData" />
  </div>
</template>

<script setup>
import { ref } from 'vue';
import TreeMenuItem from './TreeMenuItem.vue';

const treeData = ref({
  id: 1,
  name: 'Root',
  children: [
    {
      id: 2,
      name: 'Child 1',
      children: [
        { id: 3, name: 'Grandchild 1', children: [] },
        { id: 4, name: 'Grandchild 2', children: [] }
      ]
    },
    {
      id: 5,
      name: 'Child 2',
      children: []
    }
  ]
});
</script>

<style scoped>
.parent-component {
  padding: 20px;
}
</style>

在父组件ParentComponent.vue中,我们导入了TreeMenuItem组件,并在模板中使用了它。我们传递了一个名为treeData的ref作为nodeprop给TreeMenuItem组件。这个treeData对象代表了一个树形结构的数据,其中包含了根节点和它的子节点。

现在,当你运行这个Vue应用时,你应该能够看到一个递归渲染的树形菜单,其中每个节点都根据其层次结构进行了适当的缩进。

注意,这个示例假设你的树形数据是静态的,并且已经在父组件中定义好了。在实际应用中,你可能需要动态地获取这些数据,并在获取到数据后更新treeData ref。此外,对于大型树形结构,你可能需要考虑性能优化,比如使用虚拟滚动或懒加载等技术来减少渲染时间和内存占用。

1.3 组件样式隔离(Scoped CSS)

Vue 3组件样式隔离是前端开发中的一个重要概念,它有助于确保组件的样式不会相互干扰,从而提高代码的可维护性和可重用性。以下是对Vue 3组件样式隔离的详细讲解:

1.3.1 样式隔离的概念

样式隔离是指在一个组件内部定义的样式不会影响到其他组件或全局样式。在Vue 3中,实现样式隔离的方法主要有两种:scoped和CSS Modules。

1.3.2 scoped实现样式隔离

  1. 使用方式

    • 在Vue单文件组件中,可以使用<style scoped>标签来包裹样式,这样这些样式就只会对当前组件起作用,不会影响其他组件或全局样式。
  2. 实现原理

    • Vue会通过PostCSS插件为每个<style scoped>标签生成一个唯一的data-v-xxxhash字符串,并将其作为属性添加到该组件内的每个元素上。
    • 同时,<style scoped>标签内的每个选择器都会联合这个属性选择器,以确保样式只作用于带有该属性的元素。
  3. 注意事项

    • scoped样式无法穿透到子组件内部,除非使用:deep()伪类来实现样式穿透。
    • scoped样式也无法被父组件的选择器所选中,从而保证了样式的隔离性。

1.3.3 CSS Modules实现样式隔离

  1. 使用方式

    • 在Vue单文件组件中,可以通过在<style>标签上添加module属性来启用CSS Modules功能。
    • 这样,Vue会将导入的CSS模块里的自定义CSS类名替换为一个无语义但唯一的字符串类名,并提供一个对象充当map映射来访问转换后的类名。
  2. 实现原理

    • CSS Modules会在编译时自动生成唯一的类名,并将这些类名与元素关联起来。
    • 在模板中,可以通过映射对象来访问这些唯一的类名,并将其应用到元素上。
  3. 注意事项

    • 使用CSS Modules时,需要确保CSS文件的后缀名为.module.css(或其他支持的模块后缀名)。
    • 在模板中,需要使用:class绑定来应用CSS Modules生成的类名。

1.3.4 其他样式隔离方法

除了scoped和CSS Modules之外,Vue 3还支持其他样式隔离方法,如:

  1. BEM命名规范

    • 通过在样式类名中添加特定的命名约定(如BEM命名规范),可以减少样式冲突的可能性。
    • 这种方法虽然不如scoped和CSS Modules那样严格,但在某些情况下仍然是一种有效的样式隔离策略。
  2. CSS-in-JS

    • 使用CSS-in-JS库(如styled-components、emotion等)可以在组件代码中直接编写样式,并通过JavaScript对象或模板字符串的形式动态生成样式。
    • 这种方法将样式与组件紧密关联,实现了更高程度的样式隔离和可重用性。但需要注意的是,它引入了额外的依赖和复杂性,可能不适合所有项目。

1.4 组件库的使用与自定义组件库

Vue 3组件库的使用与自定义组件库是前端开发中的重要技能,它有助于提升开发效率,实现代码的复用和模块化。

1.4.1 Vue 3组件库的使用

  1. 选择组件库

    • Vue 3生态系统中有许多现成的组件库可供选择,如Element Plus、Vuetify、Ant Design Vue等。这些组件库提供了丰富的UI组件,可以满足大多数项目的需求。
  2. 安装组件库

    • 使用npm或yarn等包管理工具安装所选的组件库。例如,安装Element Plus可以使用以下命令:
    npm install element-plus --save
    

    或者

    yarn add element-plus
    
  3. 引入组件库

    • 在Vue应用的入口文件中(如main.jsmain.ts),引入组件库及其样式。例如,对于Element Plus:
    import { createApp } from 'vue';
    import ElementPlus from 'element-plus';
    import 'element-plus/dist/index.css';
    import App from './App.vue';
    
    const app = createApp(App);
    app.use(ElementPlus);
    app.mount('#app');
    
  4. 使用组件

    • 在组件的模板中,可以直接使用组件库提供的组件。例如,使用Element Plus的按钮组件:
    <template>
      <el-button type="primary">主要按钮</el-button>
    </template>
    
  5. 自定义主题和样式

    • 大多数组件库都支持自定义主题和样式。可以通过修改组件库的样式变量或使用CSS预处理器来实现。

1.4.2 自定义Vue 3组件库

  1. 创建项目结构

    • 使用Vue CLI或Vite等工具创建一个新的Vue 3项目。然后,根据项目需求创建组件库所需的目录结构,如src/components用于存放组件代码,src/styles用于存放样式文件等。
  2. 编写组件

    • src/components目录下编写自定义组件。每个组件都包含HTML模板、JavaScript逻辑和CSS样式。例如,创建一个简单的按钮组件:
    <!-- Button.vue -->
    <template>
      <button :class="['my-button', { 'is-disabled': disabled }]">
        <slot></slot>
      </button>
    </template>
    
    <script>
    export default {
      name: 'MyButton',
      props: {
        disabled: {
          type: Boolean,
          default: false
        }
      }
    };
    </script>
    
    <style scoped>
    .my-button {
      padding: 10px 20px;
      background-color: #42b983;
      color: white;
      border: none;
      border-radius: 4px;
      cursor: pointer;
    }
    .my-button.is-disabled {
      background-color: #ccc;
      cursor: not-allowed;
    }
    </style>
    
  3. 注册组件

    • 在Vue应用的入口文件中或使用组件的父组件中注册自定义组件。例如,在main.js中全局注册:
    import { createApp } from 'vue';
    import App from './App.vue';
    import MyButton from './components/Button.vue';
    
    const app = createApp(App);
    app.component('MyButton', MyButton);
    app.mount('#app');
    

    或者在父组件中局部注册:

    <template>
      <div>
        <MyButton>自定义按钮</MyButton>
      </div>
    </template>
    
    <script>
    import MyButton from './components/Button.vue';
    
    export default {
      components: {
        MyButton
      }
    };
    </script>
    
  4. 发布组件库

    • 如果希望将自定义组件库发布为npm包,以便在其他项目中使用,需要按照npm包的规范进行打包和发布。通常,这涉及到配置package.json文件、编写构建脚本、使用Rollup或Webpack等工具进行打包等步骤。
  5. 使用自定义组件库

    • 发布后,可以在其他Vue项目中使用自定义组件库。首先,使用npm或yarn安装组件库。然后,在Vue应用的入口文件中引入并使用它。

1.4.3 注意事项

  1. 组件命名

    • 组件的命名应该清晰、简洁,并遵循一定的命名规范。例如,使用大写字母开头的驼峰命名法(PascalCase)或短横线分隔的小写命名法(kebab-case)。
  2. 样式隔离

    • 为了避免样式冲突,可以使用CSS作用域(scoped)或CSS模块等技术来实现样式的隔离。
  3. 响应式设计

    • 自定义组件应该支持响应式设计,以适应不同设备和屏幕尺寸的需求。
  4. 文档和示例

    • 为了方便其他开发者使用和理解自定义组件库,应该提供详细的文档和示例代码。
  5. 持续维护和更新

    • 随着Vue版本的更新和项目需求的变化,自定义组件库也需要进行持续的维护和更新。

2 Vue 3 组件化开发实践

2.1 组件设计原则

2.1.1 单一职责原则(SRP)

  1. 定义

    • 一个类(或组件)应该只有一个引起它变化的原因,即一个类(或组件)只负责一个职责,并且该职责被完整地封装在一个类中(或组件内)。
  2. 在Vue 3中的应用

    • 在Vue 3中,组件应该被设计成只负责一个特定的功能或职责。例如,可以将一个复杂的表单拆分成多个小的表单组件,每个组件只负责处理一个字段或一个验证逻辑。
    • 这样做的好处是,当某个功能需要修改或扩展时,只需要关注相关的组件,而不需要考虑其他不相关的组件,从而降低了代码的复杂性和维护成本。

2.1.2 开闭原则(OCP)

  1. 定义

    • 软件实体(类、模块、函数等)应该对扩展开放,对修改封闭。即在不修改现有代码的基础上,通过添加新代码来扩展功能。
  2. 在Vue 3中的应用

    • 在Vue 3中,可以通过组合式API(Composition API)和插槽(slots)等机制来实现开闭原则。
    • 例如,可以创建一个基础组件,并通过插槽来允许其他组件扩展其功能。当需要添加新功能时,只需要创建新的组件并通过插槽将其插入到基础组件中,而不需要修改基础组件的代码。

2.1.3 里式替换原则(LSP)

  1. 定义

    • 子类必须能够替换其基类而不影响程序的行为。即在使用基类的地方,可以使用子类的对象来替换,而不会导致程序的错误。
  2. 在Vue 3中的应用

    • 在Vue 3中,可以通过组合式API和混入(mixins)等机制来实现里式替换原则。
    • 例如,可以创建一个基类组件,并在其中定义一些通用的逻辑和方法。然后,可以创建子类组件来继承基类组件,并在其中添加或覆盖特定的逻辑和方法。这样做可以确保子类组件能够替换基类组件而不影响程序的行为。

2.1.4 接口隔离原则(ISP)

  1. 定义

    • 客户端不应该依赖于它不使用的接口。即一个接口应该只包含客户端需要的方法,而不包含客户端不需要的方法。
  2. 在Vue 3中的应用

    • 在Vue 3中,可以通过定义明确的接口和类型定义来实现接口隔离原则。
    • 例如,可以定义一个接口来描述组件之间的通信方式,并确保每个组件只实现它需要的接口方法。这样做可以降低组件之间的耦合度,提高代码的可维护性和可扩展性。

2.1.5 依赖反转原则(DIP)

  1. 定义

    • 高层模块不应该依赖于低层模块,二者都应该依赖于抽象。即抽象不应该依赖于细节,细节应该依赖于抽象。
  2. 在Vue 3中的应用

    • 在Vue 3中,可以通过组合式API和Vuex等状态管理库来实现依赖反转原则。
    • 例如,可以创建一个抽象的服务层来定义业务逻辑和数据处理的方法,并在组件中通过依赖注入的方式使用这些服务。这样做可以降低组件之间的耦合度,提高代码的可测试性和可维护性。

2.2 组件性能优化

在Vue 3中,组件性能优化是提升应用响应速度和用户体验的重要手段。以下是针对懒加载组件、使用v-once指令和keep-alive组件的详细讲解:

2.2.1 懒加载组件

  1. 定义与原理

    • 懒加载是一种延迟加载技术,它允许应用在需要时才加载某些组件或资源,而不是在初始加载时全部加载。
    • 在Vue 3中,可以通过<Suspense>组件和异步组件(<AsyncComponent />)来实现懒加载。
  2. 实现方法

    • 使用<Suspense>组件包裹异步组件,并指定一个回退内容(fallback),以便在异步组件加载时显示。
    • 异步组件可以通过defineAsyncComponent函数来定义,该函数接受一个加载函数,该函数返回一个Promise,该Promise解析为要加载的组件。
  3. 优势

    • 减少初始加载时间,提升应用的加载性能。
    • 允许按需加载,减少不必要的资源消耗。

2.2.2 使用v-once指令

  1. 定义与原理

    • v-once指令是Vue中的一个指令,它用于将元素或组件标记为只渲染一次。
    • 当使用v-once时,Vue会在首次渲染后跳过该元素或组件的后续更新。
  2. 实现方法

    • 在需要只渲染一次的元素或组件上添加v-once指令。
  3. 优势

    • 对于不需要响应式更新的静态内容,使用v-once可以显著提高渲染性能。
    • 减少不必要的DOM更新和重新渲染。
  4. 注意事项

    • v-once只能用于具有确定性的模板中,并且不能用于包含循环或条件语句等动态模板的组件中。
    • 使用v-once后,该元素或组件内的数据将不再响应式更新,因此需要谨慎使用。

2.2.3 keep-alive组件

  1. 定义与原理

    • keep-alive是Vue中的一个内置组件,它用于缓存不活动的组件实例,而不是销毁它们。
    • 当包裹在keep-alive中的组件被切换出视图时,它的状态会被保留下来,包括组件内的数据和计算属性等。
  2. 实现方法

    • 使用<keep-alive>组件包裹需要缓存的组件。
    • 可以通过includeexclude属性来指定哪些组件应该被缓存,哪些应该被排除。
    • max属性可以用于限制缓存组件的数量。
  3. 优势

    • 减少组件的重复渲染,提高页面的响应速度。
    • 保留组件状态,避免不必要的重新初始化。
  4. 应用场景

    • 适用于需要频繁切换且状态需要保留的组件,如标签页、选项卡等。
    • 可以结合动态组件和路由配置来灵活使用。

2.3 组件命名规范

在Vue 3中,组件命名规范是确保代码一致性和可读性的重要基础。以下是一套详细的Vue 3组件命名规范:

2.3.1 组件文件命名

  1. 单文件组件:单文件组件(.vue文件)的文件名应该与组件名保持一致。例如,如果组件名为MyComponent,则文件名应为MyComponent.vue
  2. 帕斯卡命名法:组件文件的命名应使用帕斯卡命名法(PascalCase),即每个单词的首字母大写。例如,MyComponentTodoItem等。

2.3.2 组件名命名

  1. 全局注册:当全局注册组件时,应该使用帕斯卡命名法。例如,Vue.component('MyComponent', {...})
  2. 局部注册:在局部注册组件时,可以使用帕斯卡命名法(在模板中通过<MyComponent />引用)或短横线分隔式命名法(在模板中通过<my-component></my-component>引用)。但需要注意,在模板中使用时,通常推荐使用短横线分隔式命名法,以符合HTML的规范。
  3. 组件名意义:组件名应该是有意义的、简短的,并且具有可读性。避免使用无意义的缩写或数字。

2.3.3 Props命名

  1. 驼峰式命名法:在JavaScript中声明Props时,应使用驼峰式命名法(CamelCase)。例如,props: ['myProp']在JavaScript中应写为props: { myProp: { type: String } }
  2. 短横线分隔式命名法:当在模板或HTML中使用Props时,应使用短横线分隔式命名法(kebab-case)。例如,<my-component my-prop="value"></my-component>

2.3.4 事件命名

  1. 短横线分隔式命名法:事件名应使用短横线分隔式命名法,并且通常以描述动作的动词开始,然后是受影响的名词。例如,update-player-statsitem-selected等。

2.3.5 其他命名规范

  1. 变量命名:变量名应使用驼峰式命名法(CamelCase),并且默认使用const声明变量,只有当变量需要被重新赋值时,才使用let
  2. 方法命名:方法名也应使用驼峰式命名法,并且通常以描述动作的动词开始,确保方法名能够明确表示它执行的操作。例如,updatePlayerStatsselectItem等。
  3. CSS类名:CSS类名应使用短横线分隔式命名法,并且可以考虑使用BEM(块、元素、修饰符)命名法来命名复杂的组件样式。例如,.player-profile.todo-item__title.button--primary等。

2.3.6 注意事项

  1. 避免缩写:除非缩写是广泛认可的,否则应避免使用缩写,以确保代码的可读性。
  2. 一致性:在整个项目中,命名应保持一致性。例如,如果选择了使用驼峰式命名法来命名变量和方法,那么在整个项目中都应遵循这一规范。
  3. 简洁性:命名应简洁明了,避免使用冗长或含糊不清的命名。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2225007.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【K8S】快速入门Kubernetes

之前企业都是使用容器化和来构建自己的服务和应用程序&#xff0c;其中容器化优点有很多&#xff1a;提升了部署效率、稳定性、提高了资源的利用率降低了成本。 但是也带来了一些新的问题&#xff1a;容器的数量变得很多&#xff0c;管理就是一个新的问题。所以Kubernetes就出…

【K8S系列】Kubernetes 中 Service IP 地址和端口不匹配问题及解决方案【已解决】

在 Kubernetes 中&#xff0c;Service 是实现 Pod 之间和 Pod 与外部之间通信的关键组件。Service 的 IP 地址和端口配置不当可能导致应用无法正常访问。本文将详细分析 Service IP 地址和端口不匹配的问题&#xff0c;常见原因及其解决方案。 一、问题描述 Service IP 地址和…

草稿1111

服务端&#xff1a; 启动nfs服务器服务和rpcbind 服务&#xff1a; 写配置文件&#xff1a; 重新导出所有当前已导出的文件系统&#xff1a; 这个命令会立即停止 firewalld 服务&#xff0c;并将其设置为在系统启动时不自动启动&#xff1a; 客户端&#xff1a; 启动nfs服务器…

练习LabVIEW第十九题

学习目标&#xff1a; 刚学了LabVIEW&#xff0c;在网上找了些题&#xff0c;练习一下LabVIEW&#xff0c;有不对不好不足的地方欢迎指正&#xff01; 第十九题&#xff1a; 创建一个程序把另外一个VI的前面板显示在Picture控件中 开始编写&#xff1a; 在前面板放置一个二…

银河麒麟V10通过tigervnc实现远程桌面和windows系统连接

1、查看系统版本:uname -a Linux localhost.localdomain 4.19.90-89.16.v2401.ky10.x86_64 #1 SMP Sat Sep 14 13:09:47 CST 2024 x86_64 x86_64 x86_64 GNU/Linux 2、查看是否具有桌面环境:yum grouplist 安装VNC需要具有桌面环境 3.、安装tigervnc: yum install tigervnc…

C++——string的模拟实现(上)

目录 引言 成员变量 1.基本框架 成员函数 1.构造函数和析构函数 2.拷贝构造函数 3.容量操作函数 3.1 有效长度和容量大小 3.2 容量操作 3.3 访问操作 (1)operator[]函数 (2)iterator迭代器 3.4 修改操作 (1)push_back()和append() (2)operator函数 引言 在 C—…

GoFly快速开发框架已集成了RTSP流媒体服务器(直播、录播)代码插件-开发者集成流媒体服务器更加方便

温馨提示&#xff1a;我们分享的文章是给需要的人&#xff0c;不需要的人请绕过&#xff0c;文明浏览&#xff0c;误恶语伤人&#xff01; 说明 本代码包是音视频流媒体服务器&#xff0c;支持RTSP推流到服务器、服务端录像与回放。在视频直播、安防及车辆监控视频上云、无人…

解读AVL树:平衡二叉搜索树的奥秘

✨✨小新课堂开课了&#xff0c;欢迎欢迎~✨✨ &#x1f388;&#x1f388;养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; 所属专栏&#xff1a;C&#xff1a;由浅入深篇 小新的主页&#xff1a;编程版小新-CSDN博客 前言&#xff1a; 前面我们已经介绍了二叉搜…

编译却出现Error: C9555E: Failed to check out a license.问题解决

学stm32的时候&#xff0c;照着操作突然发现编译报错。 去网上搜索答案的时候发现了这篇文章&#xff1a;参考博客:KEI5许可证没到期&#xff0c;编译却出现Error: C9555E: Failed to check out a license.问题解决 根据网上找的资料发现应该是版本问题导致的。在上一篇博客…

Prompt提示词设计:如何让你的AI对话更智能?

Prompt设计&#xff1a;如何让你的AI对话更智能&#xff1f; 在人工智能的世界里&#xff0c;Prompt&#xff08;提示词&#xff09;就像是一把钥匙&#xff0c;能够解锁AI的潜力&#xff0c;让它更好地理解和响应你的需求。今天&#xff0c;我们就来聊聊如何通过精心设计的Pr…

【纯血鸿蒙】安装hdc工具

这里我先写Mac版的,Windows的在下面 首先要知道你的SDK安装在哪里了,不知道的话,可以打开DevEco Studio,打开设置页面里的HarmonyOS SDK,这个我们之前配置环境变量的时候用过。 其实主要是用到这里toolchains下的hdc命令。 所以我们需要配置环境变量。 1、打开Mac下的…

关于OpenFeign中@GetMapping不支持Java对象传递

原因&#xff1a;在使用openfeign远程调用的时候&#xff0c;使用get请求时候发现&#xff0c;如果feign里面传的是实体&#xff0c;当然接口里面也是需要传实体&#xff0c;但是发现出错了&#xff0c;后来去官网找了一下&#xff0c;发现get请求不支持传入Java实体对象&#…

网络原理之 TCP解释超详细!!!

TCP 有连接的 可靠传输 面向字节流 全双工 其中最核心的是可靠传输 那么 TCP 如何使用可靠传输的 ??? 我们尽可能传过去, 如果传不过去,发送方至少知道自己没传过去, 所以在于接收方, 收到或者没有收到, 都会有应答的操作 1. 确认应答 实现可靠性最核心的机制!!! 引出 …

一种解决Leaflet中Divicon城市气温标注空间重叠的办法

目录 前言 一、一些解决办法 1、marker的聚类 2、使用leaflet-canvas-label 3、使用Zoom和样式控制 二、基于rbush和Leaflet.LayerGroup.Collision的解决办法 1、关于rbush 2、Leaflet.LayerGroup.Collision.js 三、解决标签重叠的具体实现 1、添加元数据 2、添加到…

理解OAuth2与用户账户与授权UAA的关系

目录 关于OAuth2OAuth2的核心组件授权流程授权模式使用场景优点与缺点 关于UAA技术解释 UAA与OAuth2的关系 关于OAuth2 ‌‌OAuth2&#xff08;开放授权2.0&#xff09;是一个开放标准&#xff0c;用于授权第三方应用程序访问用户资源&#xff0c;而无需共享用户的用户名和密码…

c语言中值调用(call by value)方式和引用调用(call by reference)

在C语言中参数传递主要有两种方式&#xff1a;通过值调用&#xff08;call by value&#xff09;和通过引用调用&#xff08;call by reference&#xff09;。 通过值调用&#xff08;Call by Value&#xff09; 说明&#xff1a;当使用值调用时&#xff0c;函数接收到的是参数…

(三)第一个Qt程序“Qt版本的HelloWorld”

一、随记 我们在学习编程语言的时候&#xff0c;各种讲解编程语言的书籍中通常都会以一个非常经典的“HelloWorld”程序展开详细讲解。程序虽然简短&#xff0c;但是“麻雀虽小&#xff0c;五脏俱全”&#xff0c;但是却非常适合用来熟悉程序结构、规范&#xff0c;快速形成对编…

Linux--学习笔记

第一章、简单使用Linux 1. Linux系统基本概念 多用户的系统&#xff1a;允许同时有很多个用户登录系统&#xff0c;使用系统里的资源多任务的系统&#xff1a;允许同时执行多个任务严格区分大小写&#xff1a;命令&#xff0c;选项&#xff0c;参数&#xff0c;文件名&#x…

从零实现数据结构:一文搞定所有排序!(下集)

1.快速排序 思路框架&#xff1a; 在有了前面冒泡选择插入希尔排序之后&#xff0c;人们就在想能不能再快一点&#xff0c;我们知道排序算法说人话就是把大的往后放小的往前放&#xff0c;问题就在于如何更快的把大的挪到数组队尾小的挪到数组前面。这里我们先总结一下上集前…

jenkins 自动化部署Springboot 项目

一、安装docker 1.更新yum命令 yum -y update2.查看机器有残留的docker服务&#xff0c;有就卸载干净 查看docker 服务 rpm -qa |grep docker卸载docker sudo yum remove docker-ce docker-ce-cli containerd.io sudo rm -rf /var/lib/docker sudo rm -rf /var/lib/contai…