Vue知识系列(1)每天10个小知识点
目录
- 系列文章目录
- 知识点
- **1. Vue修饰符**的概念、作用、原理、特性、优点、缺点、区别、使用场景
- **2. 双向数据绑定**的概念、作用、原理、特性、优点、缺点、区别、使用场景
- **3. MVVM、MVC、MVP** 的概念、作用、原理、特性、优点、缺点、区别、使用场景
- **4. slot** 的概念、作用、原理、特性、优点、缺点、区别、使用场景
- **5. $nextTick**的概念、作用、原理、特性、优点、缺点、区别、使用场景
- **6. Vue 单页应用与多页应用**的概念、作用、原理、特性、优点、缺点、区别、使用场景
- **7. Vue 中封装的数组方法有哪些,其如何实现页面更新**
- **8. Vue data 中某一个属性的值发生改变后,视图会立即同步执行重新渲染吗?**
- **9. 简述 mixin、extends 的覆盖逻辑**
- **10. 子组件可以直接改变父组件的数据吗?**
👍 点赞,你的认可是我创作的动力!
⭐️ 收藏,你的青睐是我努力的方向!
✏️ 评论,你的意见是我进步的财富!
系列文章目录
知识点
1. Vue修饰符的概念、作用、原理、特性、优点、缺点、区别、使用场景
Vue.js 中的修饰符是一种用于改变指令行为的特殊标记,它们可以用于指令的事件监听和双向数据绑定。修饰符以点号的形式添加到指令之后。以下是有关Vue修饰符的详细信息:
概念:
修饰符是Vue.js的一种特性,用于修改指令的行为。它们允许你以某种方式自定义指令的工作方式。
作用:
- 改变指令的行为,使其适应不同的需求和场景。
- 提供更多的选项和控制,以满足用户界面的特定需求。
原理:
修饰符的原理取决于它们所用于的指令。不同的修饰符会在事件监听、数据绑定等方面产生不同的效果。
特性:
- 可链式:你可以同时使用多个修饰符,它们可以按链式方式连接。
- 通常是可选的:修饰符通常是可选的,你可以根据需要选择是否使用它们。
优点:
- 灵活性:修饰符提供了灵活性,使开发人员能够根据不同的需求自定义指令的行为。
- 语义化:修饰符可以使代码更具语义,清晰地传达出你的意图。
缺点:
- 复杂性:过多的修饰符可能会增加代码的复杂性,不当使用可能导致不易维护的代码。
- 学习曲线:对于新手来说,学习如何正确使用修饰符可能需要一些时间。
区别:
- 指令修饰符 vs. 表达式修饰符: 指令修饰符用于指令(例如
v-on
和v-bind
),而表达式修饰符用于模板中的表达式(例如{{ message | capitalize }}
)。
使用场景:
-
v-on 指令修饰符: 在事件监听中使用修饰符,例如
.stop
阻止事件冒泡、.prevent
阻止默认行为、.once
触发一次等。适用于需要控制事件行为的场景。<button @click.stop.prevent="doSomething">Click me</button>
-
v-model 表达式修饰符: 在双向数据绑定中使用修饰符,例如
.number
将输入值转为数字、.trim
去除首尾空格。适用于处理用户输入的表单字段。<input v-model.number="age" type="text">
-
自定义指令的修饰符: 如果你编写自定义指令,可以为其添加自定义修饰符以改变其行为。
<div v-my-directive.some-modifier></div>
修饰符是Vue.js中强大而灵活的功能,可以根据需要自定义和扩展指令的行为。不同的修饰符用于不同的场景,使开发更加便捷。
2. 双向数据绑定的概念、作用、原理、特性、优点、缺点、区别、使用场景
双向数据绑定是一种前端开发中常用的概念,它允许视图(通常是用户界面)和数据模型之间的自动同步。这意味着当视图中的数据发生更改时,数据模型会相应更新,反之亦然。以下是关于双向数据绑定的详细信息:
概念:
双向数据绑定是一种机制,允许用户界面(视图)和数据模型之间的数据变化相互影响。当视图中的数据发生更改时,数据模型也会更新,反之亦然。这种机制通常通过框架或库来实现,如Vue.js、Angular和React。
作用:
- 提供了一种简化和自动化用户界面与数据模型之间数据同步的方式。
- 改进了用户体验,因为用户可以立即看到数据的变化,而无需手动刷新页面或执行其他操作。
原理:
双向数据绑定的原理取决于所使用的框架或库。通常,它包括以下几个步骤:
- 初始化:将数据模型中的数据与视图中的表单元素或其他可编辑元素关联起来。
- 监听:在视图中的元素上添加事件监听器,以侦听用户的输入或交互。
- 更新:当用户更改了视图中的数据时,触发事件处理程序,将更改的数据同步到数据模型中。
- 反向同步:如果数据模型中的数据发生更改,将新数据反映在视图中,确保两者保持同步。
特性:
- 自动:双向数据绑定是自动的,无需手动编写大量的更新代码。
- 即时:数据的变化会立即在界面上反映出来,提供了实时性。
- 方便:简化了数据的维护和更新,减少了出错的可能性。
优点:
- 提高开发效率:减少了手动数据同步的工作,减轻了开发人员的负担。
- 提高用户体验:用户能够看到实时的数据变化,提高了用户界面的响应性。
- 减少错误:自动同步数据降低了数据同步错误的风险。
缺点:
- 复杂性:实现双向数据绑定需要一定的框架或库支持,可能会增加项目的复杂性。
- 性能问题:对于大规模应用,双向数据绑定可能会引发性能问题,需要谨慎使用。
区别:
- 单向数据流:数据从父组件流向子组件,子组件无法直接更改父组件的数据,只能通过触发事件向上传递数据。
- 双向数据绑定:数据在视图和数据模型之间自动同步,可以在视图中直接修改数据,同时也会更新数据模型。
使用场景:
- 表单处理:双向数据绑定在表单处理中非常有用,因为用户可以实时看到他们的输入。
- 实时更新:当需要实时更新数据(例如,即时聊天应用程序中的消息)时,双向数据绑定可以提供更好的用户体验。
- 数据驱动的应用程序:对于需要将数据与界面保持同步的数据驱动型应用程序,双向数据绑定是一个理想的选择。
需要注意的是,双向数据绑定并不适用于所有场景,特别是对于性能要求较高的应用程序,可能需要考虑使用单向数据流或其他数据管理模式。
3. MVVM、MVC、MVP 的概念、作用、原理、特性、优点、缺点、区别、使用场景
MVVM、MVC 和 MVP 是三种常见的前端架构模式,它们有不同的概念、作用、原理、特性、优点、缺点、区别和适用场景。
MVVM (Model-View-ViewModel):
概念: MVVM 是一种前端架构模式,将应用程序划分为三个主要组件:Model(模型),View(视图),ViewModel(视图模型)。
作用: MVVM 的主要目标是实现数据绑定,将视图和数据模型分离,并通过 ViewModel 进行交互,以实现自动同步和响应式的用户界面。
原理: ViewModel 将视图和数据模型连接起来,通过数据绑定机制,任何一方的变化都会自动反映在另一方上。这通常依赖于框架(如Vue.js或Knockout.js)提供的双向绑定机制。
特性:
- 双向数据绑定:视图和模型之间的数据自动同步。
- 分离关注点:模型和视图之间有明确的分离,减少了耦合性。
- 响应式:视图会自动更新以响应数据模型的变化。
优点:
- 简化开发:减少了手动DOM操作,提高了开发效率。
- 提高可维护性:分离关注点和清晰地组织代码。
- 更好的用户体验:实时更新视图,提供更好的交互体验。
缺点:
- 学习曲线:框架的学习可能需要时间。
- 性能开销:双向数据绑定可能导致性能开销。
MVC (Model-View-Controller):
概念: MVC 是一种前端架构模式,将应用程序划分为三个主要组件:Model(模型),View(视图),Controller(控制器)。
作用: MVC 的主要目标是分离应用程序的不同关注点,将业务逻辑、用户界面和数据分开。
原理: 控制器接收用户输入并根据输入调用相应的模型和视图,模型负责处理数据,视图负责呈现数据。
特性:
- 分离关注点:各组件有明确的职责,便于管理和维护。
- 可扩展性:可以独立扩展和修改不同的组件。
优点:
- 清晰的组织:明确的分离关注点。
- 灵活性:可以更容易地修改或扩展不同部分。
- 可测试性:单元测试和集成测试更容易进行。
缺点:
- 复杂性:较复杂的架构,可能在小型项目中显得过于繁重。
- 不适合实时应用:不适合需要实时数据更新的应用程序。
MVP (Model-View-Presenter):
概念: MVP 是一种前端架构模式,将应用程序划分为三个主要组件:Model(模型),View(视图),Presenter(主持人)。
作用: MVP 的主要目标是实现视图和模型之间的松耦合,并将所有用户界面的逻辑移到 Presenter 中,使视图成为 passively 透明的。
原理: Presenter 作为中间人协调视图和模型之间的通信,负责处理用户输入、业务逻辑和更新视图。
特性:
- 松耦合:视图和模型之间的关联通过Presenter进行。
- 容易测试:业务逻辑在Presenter中,更容易进行单元测试。
优点:
- 清晰的分离关注点:分离了视图、模型和业务逻辑。
- 可测试性:业务逻辑独立于视图,易于进行单元测试。
缺点:
- 复杂性:需要引入Presenter层,增加了一定的复杂性。
- 学习曲线:可能需要一些时间来适应这种模式。
区别:
- MVVM 强调数据绑定和自动更新视图,通常用于构建响应式的用户界面。
- MVC 强调分离关注点,将应用程序划分为模型、视图和控制器,适用于传统的 Web 应用程序。
- MVP 强调视图和模型之间的松耦合,通过Presenter进行协调,适用于需要更好测试性的应用程序。
4. slot 的概念、作用、原理、特性、优点、缺点、区别、使用场景
Slot 是 Vue.js 中的一个重要概念,用于组件化开发。以下是关于 slot 的详细信息:
概念:
Slot(插槽)是一种在 Vue 组件中用来分发内容的机制。它允许你在组件模板中定义一些可以插入任意内容的位置,这些位置可以由父组件传递内容进来。
作用:
- 允许组件的使用者自定义组件的部分内容,而不是完全替换整个组件。
- 提供了一种可插入式的模板方式,增加了组件的灵活性和复用性。
原理:
Slot 的原理是在组件内部定义了一些插槽位置,这些位置由组件的使用者填充内容。当组件渲染时,填充的内容会被插入到对应的插槽位置。
特性:
- 匿名插槽:可以定义没有名字的插槽,用于填充组件中的默认内容。
- 具名插槽:可以定义带有名字的插槽,用于插入不同内容到不同位置。
- 作用域插槽:可以将父组件的数据传递给插槽内部,以便插槽内容使用这些数据。
优点:
- 提高组件的复用性:使用者可以根据需要自定义组件的一部分内容。
- 分离关注点:组件内部和外部的内容分离,使组件更容易理解和维护。
缺点:
- 有一定的学习曲线:对于新手来说,理解 slot 可能需要一些时间。
- 可能导致组件复杂化:滥用 slot 可能导致组件变得复杂和难以维护。
区别:
- Slot vs. Props: Props 用于将数据从父组件传递给子组件,而 Slot 用于允许子组件接收父组件传递的内容。
- Slot vs. 组件替换: Slot 允许自定义组件的一部分内容,而组件替换通常是将整个组件替换为另一个组件。
使用场景:
- 当你需要在组件内部插入自定义内容时,例如自定义按钮、表格行等。
- 当你想要将组件的样式和行为与内容分离,使组件更加通用。
- 当你需要创建可配置的组件,允许使用者自定义某些部分的内容。
5. $nextTick的概念、作用、原理、特性、优点、缺点、区别、使用场景
$nextTick
是 Vue.js 提供的一个异步操作工具,用于在 DOM 更新之后执行回调函数。以下是关于 $nextTick
的详细信息:
概念:
$nextTick
是 Vue.js 中的一个方法,用于在下次 DOM 更新循环结束之后执行指定的回调函数。它允许你在修改数据后等待 Vue 更新 DOM,然后执行一些操作。
作用:
- 等待 Vue 完成对 DOM 的更新,确保在操作 DOM 元素之前执行某些操作。
- 在 Vue 异步更新 DOM 后执行回调,以确保操作的正确性。
原理:
Vue.js 使用虚拟 DOM 来追踪 DOM 更新。当你修改了数据时,Vue 首先会异步更新虚拟 DOM,然后通过比较虚拟 DOM 和旧的虚拟 DOM 树来确定要进行的 DOM 更新,然后才进行实际的 DOM 操作。$nextTick
利用这个机制,等待 Vue 更新完成后执行回调。
特性:
- 异步执行:
$nextTick
中的回调函数是异步执行的,即使你在同一个代码块中调用多次$nextTick
,也会在下一个事件循环周期中执行。
优点:
- 确保操作在 DOM 更新后执行,避免出现 DOM 操作不一致的问题。
- 可以在组件渲染后对 DOM 进行操作,确保 DOM 已经完全渲染。
缺点:
- 需要额外的异步操作,可能会引入一些复杂性。
区别:
$nextTick
vs.mounted
钩子:mounted
钩子是在组件被挂载到 DOM 后调用,而$nextTick
用于等待 DOM 更新后执行回调。如果需要在组件挂载后立即执行一些操作,可以使用mounted
钩子。如果需要确保在组件渲染后执行操作,可以使用$nextTick
。$nextTick
vs.this.$refs
:$nextTick
可以用于等待 Vue 更新完成后再操作 DOM,而this.$refs
可以用于访问组件内部的 DOM 元素。
使用场景:
- 当需要在 Vue 更新 DOM 后执行一些操作,例如操作渲染后的 DOM 元素或获取元素的尺寸、位置等信息。
- 在修改数据后,确保在 DOM 更新之后执行一些逻辑,以避免操作过早或不准确。
- 在组件中使用
$nextTick
来确保在组件渲染后执行某些操作,而不是在mounted
钩子中执行。
6. Vue 单页应用与多页应用的概念、作用、原理、特性、优点、缺点、区别、使用场景
Vue 单页应用(Single Page Application,SPA)与多页应用(Multi-Page Application)是两种不同的前端应用架构方式,它们具有不同的概念、作用、原理、特性、优点、缺点、区别和适用场景。
单页应用(SPA):
- 概念: 单页应用是指整个网站或应用在加载后只有一个 HTML 页面,并通过 AJAX、路由等技术实现在单个页面上切换不同的内容,而不是通过多个页面跳转。
- 作用: 提供更流畅的用户体验,避免了页面刷新,能够快速响应用户操作。
- 原理: 使用前端路由来控制页面的切换,通过异步加载数据,更新页面内容,避免整页刷新。
- 特性:
- 单页面加载速度快。
- 前后端分离,可使用不同的后端技术。
- 适合构建富交互应用,如社交网络、在线工具等。
- 优点:
- 更好的用户体验,快速响应用户操作。
- 减少服务器负担,降低带宽成本。
- 缺点:
- 首屏加载时间可能较长。
- SEO 难度较高,需要使用预渲染或服务器端渲染等技术来解决。
- 区别: 单页应用只有一个 HTML 页面,通过前端路由控制页面内容的切换,通常使用 Vue Router 或 React Router 等库来实现。
多页应用(MPA):
- 概念: 多页应用是指每个页面都对应一个独立的 HTML 文件,用户通过链接跳转不同的页面。
- 作用: 适合传统的网站架构,每个页面都是独立的,适合静态内容展示。
- 原理: 用户点击链接时浏览器加载新的 HTML 页面。
- 特性:
- 每个页面都是独立的,有自己的 URL。
- 传统的 SEO 更加友好。
- 优点:
- 首屏加载速度快。
- SEO 更容易优化。
- 缺点:
- 用户体验可能相对差,因为页面切换需要整页刷新。
- 对服务器压力较大,需要频繁加载不同的 HTML 页面。
- 区别: 多页应用包含多个独立的 HTML 页面,每个页面对应一个 URL,通过链接跳转实现页面切换。
使用场景:
- SPA 适用场景:
- 需要提供快速响应和流畅用户体验的应用,如单页应用程序。
- 需要构建富交互的应用,如社交网络、在线工具、单页应用等。
- 前后端分离,前端和后端使用不同技术栈的应用。
- MPA 适用场景:
- 静态内容展示型网站,如博客、企业官网等。
- 需要更好的 SEO 优化的应用,如电商网站。
- 对于传统的多页应用程序。
选择使用 SPA 还是 MPA 取决于你的应用需求和项目的性质。SPA 适合构建富交互应用,但需要解决首屏加载性能和 SEO 问题。MPA 更适合传统的静态内容展示和 SEO 优化需求。在某些情况下,也可以使用混合架构,即同时使用 SPA 和 MPA 的方式。
7. Vue 中封装的数组方法有哪些,其如何实现页面更新
在 Vue.js 中,封装了一些数组方法,这些方法会被改写以实现页面更新。这些方法包括:
- push(): 将一个或多个元素添加到数组的末尾。
- pop(): 移除并返回数组的最后一个元素。
- shift(): 移除并返回数组的第一个元素。
- unshift(): 在数组的开头添加一个或多个元素。
- splice(): 通过删除或替换现有元素或添加新元素来修改数组。
- sort(): 对数组元素进行排序。
- reverse(): 颠倒数组中元素的顺序。
这些方法都会被 Vue.js 改写以实现响应式数据更新。具体的实现原理是,在执行这些方法时,Vue.js 会捕获这些操作,并自动触发视图的更新。这样,当数组发生变化时,页面会自动更新以反映这些变化。
例如,当你使用 push()
方法向数组中添加元素时,Vue.js 会捕获这个操作,并触发视图的更新,以显示新的数组内容。
示例:
new Vue({data: {items: [1, 2, 3],},methods: {addItem() {this.items.push(4); // 这里会触发视图更新,显示新的数组内容},},
});
需要注意的是,这些方法只有在 Vue 实例的数据属性上才会生效,如果直接在数组上使用这些方法,Vue 无法捕获到操作,因此不会触发视图更新。
此外,如果需要在使用这些方法时保留原始数组,并且不触发视图更新,你可以使用 slice()
方法创建一个副本,然后对副本进行操作。例如:
new Vue({data: {items: [1, 2, 3],},methods: {addItem() {const newItems = this.items.slice(); // 创建副本newItems.push(4); // 对副本进行操作this.items = newItems; // 将副本赋值给原始数组,触发视图更新},},
});
这样做可以保留原始数组,同时在必要时触发视图更新。
8. Vue data 中某一个属性的值发生改变后,视图会立即同步执行重新渲染吗?
不会立即同步执行重新渲染。在 Vue.js 中,当 data
中某个属性的值发生改变时,Vue 会使用一种异步更新机制来进行视图的重新渲染,以提高性能和效率。
具体来说,当你修改 data
中的属性时,Vue 会将这次修改放入一个更新队列中,而不是立即执行重新渲染。然后,在同一个事件循环中的下一个"tick"时,Vue 会批量处理队列中的所有更新,包括对数据的修改和重新渲染视图。这种机制可以有效减少不必要的渲染次数,提高性能。
这也意味着,如果在同一个事件循环中多次修改了同一个属性的值,Vue 只会渲染一次,以最终的值为准。
如果你需要在数据修改后立即执行一些操作,你可以使用 Vue 提供的 $nextTick
方法,或者在数据修改后手动触发重新渲染。
例如,你可以这样使用 $nextTick
:
// 修改数据
this.myData = newValue;// 在下一个 tick 时执行操作
this.$nextTick(() => {// 在这里进行操作
});
或者你可以使用 this.$forceUpdate()
来手动触发重新渲染。
总之,Vue 的响应式系统会自动处理数据变化并异步更新视图,但你可以通过 $nextTick
或 this.$forceUpdate()
来控制渲染的时机。
9. 简述 mixin、extends 的覆盖逻辑
在 Vue.js 中,mixin
和 extends
是用于扩展组件功能的两种不同方式,它们具有不同的覆盖逻辑。
Mixin(混入)的覆盖逻辑:
- 当一个组件使用
mixin
时,mixin
中的属性和方法会被合并到组件中。 - 如果组件和
mixin
具有相同名称的属性或方法,组件中的属性和方法将覆盖mixin
中的同名属性和方法。 - 如果多个
mixin
中具有相同名称的属性或方法,后面引入的mixin
将覆盖之前的。
示例:
const myMixin = {data() {return {message: "Mixin Message",};},methods: {foo() {console.log("Mixin foo");},},
};const vm = new Vue({mixins: [myMixin],data() {return {message: "Component Message",};},methods: {bar() {console.log("Component bar");},},
});console.log(vm.message); // 输出 "Component Message"
vm.foo(); // 输出 "Mixin foo"
vm.bar(); // 输出 "Component bar"
在上述示例中,mixin
中的 data
和 methods
被合并到组件中,但由于组件和 mixin
中都定义了相同名称的属性和方法,组件的属性和方法覆盖了 mixin
中的。
Extends(继承)的覆盖逻辑:
- 当一个组件使用
extends
时,它会继承一个基础组件的所有属性和方法。 - 如果组件和基础组件具有相同名称的属性或方法,组件中的属性和方法将覆盖基础组件中的同名属性和方法。
示例:
const MyBaseComponent = {data() {return {message: "Base Component Message",};},methods: {foo() {console.log("Base Component foo");},},
};const MyComponent = Vue.extend({extends: MyBaseComponent,data() {return {message: "Component Message",};},methods: {bar() {console.log("Component bar");},},
});const vm = new MyComponent();console.log(vm.message); // 输出 "Component Message"
vm.foo(); // 输出 "Base Component foo"
vm.bar(); // 输出 "Component bar"
在上述示例中,MyComponent
继承了 MyBaseComponent
的属性和方法,但由于组件和基础组件中都定义了相同名称的属性和方法,组件的属性和方法覆盖了基础组件中的。
需要注意的是,mixin
和 extends
都是用于代码复用和组件扩展的有用工具,但在使用时要小心命名冲突,确保你了解它们的覆盖逻辑。
10. 子组件可以直接改变父组件的数据吗?
在 Vue.js 中,子组件通常不应该直接改变父组件的数据。这是因为 Vue 推崇的数据流是单向的,父组件通过 props 将数据传递给子组件,子组件可以通过触发事件来通知父组件做出数据修改,从而保持了数据的可追溯性和可维护性。
如果子组件直接修改了父组件传递的 prop 数据,会破坏了单向数据流的原则,使得应用的状态变得不可预测和难以调试。因此,为了避免这种情况,Vue 鼓励使用以下方式来实现子组件与父组件之间的通信:
-
通过事件触发数据修改: 子组件可以触发一个自定义事件,父组件监听该事件并在事件处理程序中修改数据。这种方式通过
$emit
和v-on
实现。父组件:
<template><child-component :propData="parentData" @updateData="updateData"></child-component> </template> <script> export default {data() {return {parentData: 'Hello from parent',};},methods: {updateData(newData) {this.parentData = newData;},}, }; </script>
子组件:
<template><button @click="changeData">Change Data</button> </template> <script> export default {props: ['propData'],methods: {changeData() {this.$emit('updateData', 'Updated data from child');},}, }; </script>
-
使用父组件传递的 prop 数据来派生新的数据: 子组件可以将父组件传递的 prop 数据用作计算属性或者在子组件内部创建副本,然后在子组件内部修改这些派生数据。
子组件:
<template><div><p>{{ derivedData }}</p><button @click="changeData">Change Data</button></div> </template> <script> export default {props: ['propData'],computed: {derivedData() {// 在子组件内部使用 prop 数据并派生新数据return this.propData;},},methods: {changeData() {// 修改派生数据而不是直接修改 prop 数据this.propData = 'Updated data from child'; // 不推荐这样做},}, }; </script>
在大多数情况下,推荐使用事件触发方式来实现子组件向父组件通信,以保持单向数据流的一致性。如果确实需要在子组件中修改父组件的数据,应该通过事件来进行,并且在事件中经过父组件的处理来修改数据,以确保数据的可控性和可维护性。
相关文章:
Vue知识系列(1)每天10个小知识点
目录 系列文章目录知识点**1. Vue修饰符**的概念、作用、原理、特性、优点、缺点、区别、使用场景**2. 双向数据绑定**的概念、作用、原理、特性、优点、缺点、区别、使用场景**3. MVVM、MVC、MVP** 的概念、作用、原理、特性、优点、缺点、区别、使用场景**4. slot** 的概念、…...
Elasticsearch(三)聚合基本使用
基础概念 bucket 数据分组,一些数据按照某个字段进行bucket划分,这个字段值相同的数据放到一个bucket中。可以理解成Java中的Map<String, List>结构,类似于Mysql中的group by后的查询结果。 metric: 对一个数据分组执行…...
单片机C语言实例:14、音频输出
一、喇叭发声原理 程序实例1: #include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义sbit SPK P1^2; //定义喇叭端口 /*------------------------------------------------函数声明 --------------…...
docker 和 podman的区别
Podman 和 Docker 都是用于容器化应用程序的工具,它们在很多方面非常相似,但也有一些关键区别: 1. 架构和权限: - Docker:Docker 使用守护进程(dockerd)来管理容器,它需要在操作…...
苹果手机远程控制安卓手机,为什么不能发起控制?
这位用户想要用iOS设备远程控制安卓设备,在被控端安装好AirDroid之后,就在控制端的苹果手机上也安装了AirDroid,然而打开控制端的软件,却没有在手机界面上看到【远程控制】按钮,于是提出了以上疑问。 解答 想要让iOS设…...
Gradle 配置国内镜像
我们在使用gradle构建项目的时候,每当需要build或者刷新依赖的时候,由于gradle需要从服务器下载各种依赖包,速度非常慢,根本原因是由于gradle服务器在国外,而国内有些一些大厂和高校(比如阿里,华为…...
Spring AOP使用指南: 强大的面向切面编程技术
🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🦄 博客首页——🐅🐾猫头虎的博客🎐 🐳 《面试题大全专栏》 🦕 文章图文…...
Spring Boot集成Elasticsearch实战
文章目录 一、简介二、安装与配置Elasticsearch三、集成Spring Boot与Elasticsearch1. 添加依赖与配置文件2. 创建Elasticsearch数据模型3. 定义Elasticsearch仓库接口4. 实现Elasticsearch数据操作 四、基本查询与索引操作1. 插入与更新数据2. 删除数据与索引3. 条件查询与分页…...
【python零基础入门学习】python基础篇之文件对象open、模块以及函数的使用(三)
本站以分享各种运维经验和运维所需要的技能为主 《python》:python零基础入门学习 《shell》:shell学习 《terraform》持续更新中:terraform_Aws学习零基础入门到最佳实战 《k8》暂未更新 《docker学习》暂未更新 《ceph学习》ceph日常问题解…...
【JavaEE】_CSS常用属性值
目录 1. 字体属性 1.1 设置字体家族 font-family 1.2 设置字体大小 font-size 1.3 设置字体粗细 font-weight 1.4 设置字体倾斜 font-style 2. 文本属性 2.1 设置文本颜色 color 2.2 文本对齐 text-align 2.3 文本装饰 text-decoration 2.4 文本缩进 text-indent 2.…...
vue组件库开发,webpack打包,发布npm
做一个像elment-ui一样的vue组件库 那多好啊!这是我前几年就想做的 但webpack真的太难用,也许是我功力不够 今天看到一个视频,早上6-13点,终于实现了,呜呜 感谢视频的分享-来龙去脉-大家可以看这个视频:htt…...
Java中快速排序的优化技巧:随机取样、三数取中和插入排序
目录 快速排序基础 优化1:随机取样 优化2:三数取中 优化3:插入排序 总结: 快速排序(Quick Sort)是一种高效的排序算法,它的平均时间复杂度为O(n log n)。然而,在某些情况下&…...
【leetcode 力扣刷题】删除字符串中的子串or字符以满足要求
删除字符串中的子串或者字符以满足题意要求 1234. 替换子串得到平衡字符串680. 验证回文串917. 仅仅反转字母 1234. 替换子串得到平衡字符串 题目链接:1234. 替换子串得到平衡字符串 题目内容: 题目中给出了平衡字符串的定义——只有’Q’,…...
【Unity基础】3.脚本控制物体运动天空盒
【Unity基础】3.脚本控制物体运动&天空盒 大家好,我是Lampard~~ 欢迎来到Unity基础系列博客,所学知识来自B站阿发老师~感谢 (一)搭建开发环境 (1)下载visual studio 在我们下载unity编译器的时候&…...
Spring MVC拦截器
拦截器(Interceptor)是 Spring MVC 提供的一种强大的功能组件。它可以对用户请求进行拦截,并在请求进入控制器(Controller)之前、控制器处理完请求后、甚至是渲染视图后,执行一些指定的操作。 在 Spring MV…...
ClickHouse的Join算法
ClickHouse的Join算法 ClickHouse是一款开源的列式分析型数据库(OLAP),专为需要超低延迟分析查询大量数据的场景而生。为了实现分析应用可能达到的最佳性能,分析型数据库(OLAP)通常将表组合在一起形成一个…...
java面试题-RabbitMQ面试题
RabbitMQ面试题 面试官:RabbitMQ-如何保证消息不丢失 候选人: 嗯!我们当时MYSQL和Redis的数据双写一致性就是采用RabbitMQ实现同步的,这里面就要求了消息的高可用性,我们要保证消息的不丢失。主要从三个层面考虑 第一…...
数据仓库-核心概念
数据仓库 数据仓库,英文名称为Data Warehouse,可简写为DW或DWH。数据仓库,是为企业所有级别的决策制定过程,提供所有类型数据支持的战略集合。它是单个数据存储,出于分析性报告和决策支持目的而创建。为需要业务智能的…...
java中的实体类
在Java与数据库交互时,设计实体类有以下几个原因: 1、对象关系映射(ORM):实体类提供了一种将数据库中的表映射为Java对象的方式。这样,开发人员可以使用面向对象的方式操作数据库,而无需编写大…...
使用Puppeteer爬取地图上的用户评价和评论
导语 在互联网时代,获取用户的反馈和意见是非常重要的,它可以帮助我们了解用户的需求和喜好,提高我们的产品和服务质量。有时候,我们需要从地图上爬取用户对某些地点或商家的评价和评论,这样我们就可以分析用户对不同…...
GLSL ES着色器语言 使用矢量和矩阵的相关规范
目录 矢量和矩阵类型 下面是声明矢量和矩阵的例子: 赋值和构造 矢量构造函数 矩阵构造函数 构造矩阵的几种方式 访问元素 . 运算符 矢量的分量名 [ ]运算符 运算符 矢量和矩阵可用的运算符 矢量和矩阵相关运算 矢量和浮点数的…...
Himall商城- web私有方法
目录 1 Himall商城- web私有方法 1.1 /// 获取售价 1.1.1 //商品批量销售价 1.1.2 //获取组合购的价格 Himall商城- web私有方法 #region web私有方法 /// <summary> /// 获取售价 /// <para>己计算会员折</para> /// </summary> /// <para…...
Spring Boot 整合 Redis,使用 RedisTemplate 客户端
文章目录 一、SpringBoot 整合 Redis1.1 整合 Redis 步骤1.1.1 添加依赖1.1.2 yml 配置文件1.1.3 Config 配置文件1.1.4 使用示例 1.2 RedisTemplate 概述1.2.1 RedisTemplate 简介1.2.2 RedisTemplate 功能 二、RedisTemplate API2.1 RedisTemplate 公共 API2.2 String 类型 A…...
Tomcat 接收请求并传递给工作线程池流程
文章目录 Tomcat 接收请求并传递给工作线程池流程接收 socket 连接 org.apache.tomcat.util.net.SocketProcessorBase#reset结论 Tomcat 接收请求并传递给工作线程池流程 接收 socket 连接 有两个线程 http-nio-8080-ClientPoller-0/1 (下文称为 clientPoller&…...
在Linux系统上用C++将主机名称转换为IPv4、IPv6地址
在Linux系统上用C将主机名称转换为IPv4、IPv6地址 功能 指定一个std::string类型的主机名称,函数解析主机名称为IP地址,含IPv4和IPv6,解析结果以std::vector<std::string>类型返回。解析出错或者解析失败抛出std::string类型的异常消…...
【硬件设计】硬件学习笔记二--电源电路设计
硬件学习笔记二--电源电路设计 一、LDO设计1.1 LDO原理1.2 LDO参数1.3 应用 二、DC-DC设计2.1 DC-DC原理2.2 DC-DC参数介绍2.4 DC-DC设计要点2.5 DC-DC设计注意事项 写在前面:本篇笔记来自王工的硬件工程师培训课程,想要学硬件的同学可以去腾讯课堂直接搜…...
day34 集合总结
集合总结 一、概述 作用:存储对象的容器,代替数组的,使用更加的便捷 所处的位置:java.util 体系结构 二、Collection 内部的每一个元素都得是引用数据类型 常用方法 add(Object o) 添加元素 addAll(Collection c) 将指定集…...
【JAVA】 图书管理系统(javaSE简易版 内含画图分析) | 期末大作业课程设计
作者主页:paper jie 的博客 本文作者:大家好,我是paper jie,感谢你阅读本文,欢迎一建三连哦。 本文录入于《JAVA》专栏,本专栏是针对于大学生,编程小白精心打造的。笔者用重金(时间和精力)打造&…...
区块链技术与应用 - 学习笔记3【比特币数据结构】
大家好,我是比特桃。本系列笔记只专注于探讨研究区块链技术原理,不做其他违反相关规定的讨论。 区块链技术已被纳入国家十四五规划,在“加快数字发展 建设数字中国”篇章中,区块链被列为“十四五”七大数字经济重点产业之一&#…...
Ubuntu下高效Vim的搭建(离线版)
软件界面 可以看到界面下方有一些常用提示信息:文件路径、format、文件类型、光标所在的坐标(x,y)、进度条(百分比)、日期时间 会提示已定义的变量名词(快速补全) 搭建方法 下载资源文件 把Vim 和 .vimrc 拷贝到家目录下,并执行tar -xvf Vim 即可。 …...
拼多多推广引流软件免费/云南seo简单整站优化
专注于Java领域优质技术号,欢迎关注作者:程序员小灰如何用程序实现大整数相乘呢?在上一篇文章 算法:如何实现大整数相乘?(上) 当中,我们介绍了两种思路:1.像列竖式一样&…...
专门做定制的网站/网络营销策划书论文
Python爬虫入门教程目录 写在前面编码部分,looter走起shell 步骤生成一个爬虫写在后面梦想橡皮擦,继续给自己加油打气 爬虫百例教程导航链接 : https://blog.csdn.net/hihell/article/details/86106916 写在前面 爬虫教程,爬虫框架其实已经非常多了,国内国外很多人都在不…...
网站开发工作安排/公司网站建设流程
题目:有n 个人围城一圈每次从1数起数到3就把那个人提出圈子,最后只保留一个人。输入: 输入人数字符串输出:把最后一个人所保留位置返回出来。比如你输入11 的话即有11个人 [1,2,3,4,5,6,7,8,9,10,11] 。返回的是7.如果输入”123a”…...
网站建设课程职业教育机构/自媒体平台收益排行榜
一、初识Python 1、Python 安装 1 1、下载安装包 2 https://www.python.org/downloads/ 3 2、安装 4 默认安装路径:C:\python27 5 3、配置环境变量 6 【右键计算机】--》【属性】--》【高级系…...
中装建设网站/清远网站seo
1. 新手常犯的错误 可能很多新手(包括当年的我,哈哈)第一时间想到的写法是下面这样的: public static void main(String[] args) {List<String> platformList new ArrayList<>();platformList.add("博客园&qu…...
网站风险怎么解决方案/手机百度快照
案例一:去除集合里面的重复元素 package cn.itcast_04;import java.util.ArrayList;/** ArrayList去除集合中字符串的重复值(字符串的内容相同)* * 分析:* A:创建集合对象* B:添加多个字符串元素(包含内容相同的)* C:创建新集合* D:遍历旧集合,获…...