Vue 3 的组件式开发(3)

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-itemv-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.rhkb.cn/news/457963.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux - 文件描述符 | 文件系统 | 软硬链接

文章目录 一、文件描述符1、补充知识2、文件描述符是什么&#xff1f;3、处理文件的系统调用接口4、文件描述符的分配规则5、简单理解Linux下一切皆文件6、FILE7、重定向 二、文件系统三、软硬链接1、软连接2、硬链接3、软硬链接对比 一、文件描述符 1、补充知识 &#xff08;…

5G NR:BWP入门

简介 5G NR 系统带宽比4G LTE 大了很多&#xff0c;4G LTE 最大支持带宽为20MHz&#xff0c; 而5G NR 的FR1 最大支持带宽为100MHz&#xff0c; FR2 最大支持带宽为 400MHz。 带宽越大&#xff0c;意味了终端功耗越多。为了减少终端的功耗&#xff0c;5G NR 引入了BWP(Band Wid…

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

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

NVR录像机汇聚管理EasyNVR多品牌NVR管理工具/设备视频报警功能详解

在科技日新月异的今天&#xff0c;视频监控系统作为现代社会的“第三只眼”&#xff0c;正以前所未有的方式深刻影响着我们的生活与社会结构。从公共场所的安全监控到个人生活的记录分享&#xff0c;视频监控系统以其独特的视角和功能&#xff0c;为社会带来了诸多好处&#xf…

【Linux】————磁盘与文件系统

作者主页&#xff1a; 作者主页 本篇博客专栏&#xff1a;Linux 创作时间 &#xff1a;2024年10月17日 一、磁盘的物理结构 磁盘的物理结构如图所示&#xff1a; 其中具体的物理存储结构如下&#xff1a; 磁盘中存储的基本单位为扇区&#xff0c;一个扇区的大小一般为512字…

Python 自动化运维:Python基础知识

Python 自动化运维&#xff1a;Python基础知识 目录 &#x1f4ca; Python 基础复习 数据类型、控制结构与常用函数面向对象编程&#xff08;OOP&#xff09;与类的使用函数式编程概念与 lambda 表达式异常处理与日志记录的基本实践 1. &#x1f4ca; Python 基础复习 数据…

二十二、Python基础语法(模块)

模块(module)&#xff1a;在python中&#xff0c;每个代码文件就是一个模块&#xff0c;在模块中定义的变量、函数、类别人都可以直接使用&#xff0c;如果想要使用别人写好的模块&#xff0c;就必须先导入别人的模块&#xff0c;模块名须满足标识符规则&#xff08;由字母、数…

SwiftUI(三)- 渐变、实心形状和视图背景

引言 在现代的应用的UI设计中&#xff0c;渐变和形状背景为界面带来了丰富的层次与视觉效果&#xff0c;而SwiftUI提供了一系列简单且强大的API&#xff0c;可以轻松实现这些效果。在这篇文章中&#xff0c;我们将介绍SwiftUI中的渐变、实心形状和视图背景的基础用法&#xff…

【论文阅读】Learning persistent homology of3D point clouds

摘要 motivation&#xff1a;PD计算过程非常耗时&#xff0c;严重限制了TDA的应用 本文提出了一种端到端的神经网络模型TopologyNet&#xff0c;用于直接从3D点云数据中拟合拓扑表示。TopologyNet显著减少了生成拓扑表示的计算时间&#xff0c;并在实际实例中保持了较小的近似…

Python4

4. 更多控制流工具 除了刚介绍的 while 语句&#xff0c;Python 还用了一些别的。我们将在本章中遇到它们。 4.1. if 语句 if elif else if x<0: x 0 print(Negative changed to zero) elif x0: print( zero) else: print(More) 4.2. for 语句 Pyth…

2024.7最新子比主题zibll7.9.2开心版源码+授权教程

授权教程&#xff1a; 1.进入宝塔搭建一个站点 绑定 api.zibll.com 域名 并上传 index.php 文件 2.设置伪静态 3.开启SSL证书&#xff0c;找一个能用的域名证书&#xff0c;将密钥(KEY)和证书(PEM格式)复制进去即可 4.在宝塔文件地址栏中输入 /etc 找到 hosts文件并打开&a…

【Docker】docker | 部署nginx

一、概述 记录下nginx的部署流程&#xff1b;将conf配置文件映射到宿主机 前提依赖&#xff1a;自行准备nginx的镜像包 二、步骤 1、运行、无映射 docker run --name nginx -p 80:80 -d nginx:1.18.0-alpine 80&#xff1a;80&#xff0c;前面是宿主机端口&#xff1b;如果冲…

uniapp:上拉加载更多、下拉刷新、页面滚动到指定位置

提醒 本文实例是使用uniapp进行开发演示的。 一、需求场景 在开发商品&#xff08;SKU&#xff09;列表页面时&#xff0c;通常有三个需求&#xff1a; 页面下拉刷新&#xff0c;第一页展示最新数据&#xff1b;上拉加载更多数据&#xff1b;列表页面可以滚动到指定位置&#x…

Liunx权限概念及权限管理

目录 一&#xff1a;shell命令以及运行原理 二&#xff1a;Linux权限的概念 三&#xff1a;Linux的权限管理 3.1文件访问者的分类 3.2文件类型和访问权限&#xff08;事物属性&#xff09; 3.3文件权限的表达方式&#xff1a; 3.4文件访问权限的相关设置方法 四&…

前沿技术与未来发展第一节:C++与机器学习

第六章&#xff1a;前沿技术与未来发展 第一节&#xff1a;C与机器学习 1. C在机器学习中的应用场景 C在机器学习中的应用优势主要体现在高效的内存管理、强大的计算能力和接近底层硬件的灵活性等方面。以下是 C 在机器学习领域的几个主要应用场景&#xff1a; 1.1 深度学习…

Vue3 学习笔记(七)Vue3 语法-计算属性 computed详解

#1024程序员节|征文# 1、计算属性 computed 在 Vue.js 中&#xff0c;计算属性&#xff08;computed properties&#xff09;是一种特殊的响应式属性&#xff0c;它们根据依赖的响应式数据自动更新。计算属性非常适合用于当你需要根据现有数据派生出一些状态时。 (1)、基本用法…

IntelliJ IDEA 查看类class的结构Structure轮廓outline窗口, 快捷键是Alt+7

IntelliJ IDEA 查看类class的结构Structure轮廓outline窗口, 快捷键是Alt7 idea的结构Structure窗口相当于Eclipse的outline 快捷键是: Alt7 或者点击左上角主菜单面包屑,打开主菜单 然后菜单找到-视图&#xff08;View&#xff09;→ 工具窗口&#xff08;Tool Windows&…

基于大数据 Python+Vue 酒店爬取可视化系统(源码+LW+部署讲解+数据库+ppt)

&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 会持续一直更新下去 有问必答 一键收藏关注不迷路 源码获取&#xff1a;https://pan.baidu.com/s/1aRpOv3f2sdtVYOogQjb8jg?pwdjf1d 提取码: jf1d &#…

FineReport 分栏报表

将报表中的数据根据所需要的展示的样式将数据进行分栏展示列分栏 报表中数据是横向扩展的,超过一页的数据会显示在下一页,而每页下面会有很大的一片空白区域,不美观且浪费纸张。希望在一页中第一行扩展满后自动到下一行继续扩展 1、新建数据集 SELECT * FROM 公司股票2、内…

前端代码分享--爱心

给对象写的&#xff0c;顺便源码给大家分享一下 就是简单的htmlcssjs&#xff0c;不复杂 xin1.html <!DOCTYPE html> <html lang"zh-CN"> <head> <meta charset"UTF-8"> <title>写你自己的</title> <lin…