【三十天精通Vue 3】第七天 Vue 3 响应式系统详解

news2025/4/4 5:53:04

请添加图片描述

✅创作者:陈书予
🎉个人主页:陈书予的个人主页
🍁陈书予的个人社区,欢迎你的加入: 陈书予的社区
🌟专栏地址: 三十天精通 Vue 3

文章目录

  • 引言
    • 一、Vue 3 响应式系统概述
      • 1.1 响应式系统的简介
      • 1.2 响应式系统的原理
      • 1.3 响应式系统的应用场景
    • 二、Vue 3 响应式系统的数据绑定
      • 2.1 基本数据绑定
      • 2.2 动态数据绑定
      • 2.3 组件更新的机制
    • 三、Vue 3 响应式系统的响应式数据
      • 3.1 响应式数据的简介
      • 3.2 响应式数据的语法
    • 四、Vue 3 响应式系统的虚拟 DOM
      • 4.1 虚拟 DOM 的简介
      • 4.2 虚拟 DOM 的工作原理
      • 4.3 虚拟 DOM 的优化
    • 五、Vue 3 响应式系统的事件处理
      • 5.1 事件处理的简介
      • 5.2 事件处理的语法
      • 5.3 事件处理的应用场景
        • 5.3.1 监听和处理点击事件
    • 六、Vue 3 响应式系统的插件系统
      • 6.1 插件系统的简介
      • 6.2 插件系统的语法
      • 6.3 插件系统的应用场景
    • 七、Vue 3 响应式系统的常见问题及解决方案
      • 7.1 响应式系统的数据冲突
      • 7.2 响应式系统的缓存问题
      • 7.3 响应式系统的编译问题

引言

Vue 3 响应式系统是 Vue 3 新引入的一个概念,它仍然是基于 Vue 2 中的响应式系统,但与 Vue 2 的响应式系统相比,Vue 3 的响应式系统更加强大和灵活。今天,我们将详细介绍 Vue 3 响应式系统的各个方面,包括数据绑定、响应式数据、虚拟 DOM、事件处理、插件系统和常见问题及解决方案。

一、Vue 3 响应式系统概述

1.1 响应式系统的简介

响应式系统是指当数据发生改变时,页面上的内容自动更新的一种技术。在 Vue 3 中,响应式系统可以通过数据劫持和发布 - 订阅模式来实现。数据劫持是指通过监听数据的变化,在数据变化时触发响应式系统的更新。发布 - 订阅模式是指将数据的变化发布给订阅者,订阅者再根据该变化更新自身的状态。

1.2 响应式系统的原理

在 Vue 3 中,响应式系统的核心原理是基于 Object.defineProperty() 方法。当我们在对象上设置属性时,实际上是在对象上定义了一个 defineProperty() 方法。该方法会使得该属性在对象被访问时进行自动更新。

当我们在模板中使用 {{ }} 标签时,Vue 3 会将该标签中的值通过 Object.defineProperty() 方法设置为模板中的值。当该值发生改变时,Vue 3 会触发更新操作,使得模板中的内容进行更新。

1.3 响应式系统的应用场景

Vue 3 响应式系统可以用于以下几个方面:

  • 单页应用 (SPA):在单页应用中,数据通常会在页面加载时一次性加载。当用户进行操作时,数据会发生改变。使用 Vue 3 响应式系统可以使得应用程序更加高效和灵活。
  • 数据可视化:数据可视化通常需要大量的数据计算和渲染。使用 Vue 3 响应式系统可以使得渲染更加高效。
  • 大型应用程序:在大型应用程序中,数据通常会非常复杂,并且会有大量的数据需要更新。使用 Vue 3 响应式系统可以使得应用程序更加高效和灵活。

下面是一个使用 Vue 3 响应式系统的示例:

import Vue from 'vue'

const exampleData = {  
  name: 'John',  
  age: 30,  
  address: {  
    city: 'New York',  
    state: 'NY',  
    zip: '10001'  
  }  
}

Vue.set(exampleData, 'address.city', 'Tokyo')  
Vue.set(exampleData, 'address.state', 'JP')  
Vue.set(exampleData, 'address.zip', '11001')

console.log(exampleData) // 输出 { name: 'John', age: 30, address: { city: 'Tokyo', state: 'JP', zip: '11001' } }  

在上面的示例中,我们通过使用 Vue.set() 方法对 exampleData 对象的属性进行操作。当这些属性发生改变时,Vue 3 会触发更新操作,使得页面中的内容进行更新。

二、Vue 3 响应式系统的数据绑定

2.1 基本数据绑定

在 Vue 3 中,可以使用 v-bind 指令将组件的值与父组件或数据源进行绑定。v-bind 指令的语法如下:

<template>  
  <div v-bind:style="{ backgroundColor: color }">  
    <!-- ... -->  
  </div>  
</template>  

在上面的示例中,我们通过使用 v-bind 指令将组件的 style 属性与一个变量进行绑定。当该变量的值发生改变时,style 属性的值也会进行自动更新。

除了 style 属性外,还可以使用其他属性进行数据绑定,如 data、computed、watch 等。

2.2 动态数据绑定

在 Vue 3 中,可以使用 v-model 指令实现动态数据绑定。v-model 指令的语法如下:

<template>  
  <input type="text" v-model="inputValue">  
  <!-- ... -->  
</template>  

在上面的示例中,我们通过使用 v-model 指令将一个 input 元素的值与一个变量进行绑定。当该变量的值发生改变时,input 元素的值也会进行自动更新。

除了 input 元素外,还可以使用其他组件进行动态数据绑定,如 button、textarea 等。

2.3 组件更新的机制

在 Vue 3 中,组件更新的机制是基于响应式系统的。当组件的值发生改变时,Vue 3 会触发更新操作,使得组件的值进行更新。

在 Vue 3 中,有两种触发更新操作的方式:

  • 数据劫持:通过使用 Vue.set 方法对组件的值进行操作。当该值发生改变时,Vue 3 会触发更新操作。
  • 发布 - 订阅模式:通过使用 Vue.js 的发布 - 订阅模式来实现组件的更新。父组件可以订阅子组件的值,当子组件的值发生改变时,父组件可以触发更新操作。

无论使用哪种方式,当组件的值发生改变时,Vue 3 都会触发更新操作,使得组件的值进行更新。

三、Vue 3 响应式系统的响应式数据

3.1 响应式数据的简介

响应式数据是 Vue 3 中的一个重要概念,它指的是与用户交互相关的数据,这些数据会随着时间的推移而自动更新。例如,当我们在页面上输入文本时,页面上的文本框长度会发生变化,这就是响应式数据的表现。

在 Vue 3 中,响应式数据可以使用 computed 属性进行计算,也可以使用 watch 属性进行监听。

3.2 响应式数据的语法

在 Vue 3 中,响应式数据的语法与普通数据类似,可以使用数据劫持或发布 - 订阅模式进行更新。例如:

import Vue from 'vue'

const exampleData = {  
  name: 'John',  
  age: 30,  
  address: {  
    city: 'New York',  
    state: 'NY',  
    zip: '10001'  
  }  
}

Vue.set(exampleData, 'address.city', 'Tokyo')  
Vue.set(exampleData, 'address.state', 'JP')  
Vue.set(exampleData, 'address.zip', '11001')

console.log(exampleData) // 输出 { name: 'John', age: 30, address: { city: 'Tokyo', state: 'JP', zip: '11001' } }  

在上面的示例中,我们通过使用 Vue.set 方法对 exampleData 对象的属性进行操作。当这些属性发生改变时,Vue 3 会触发更新操作,使得页面中的内容进行更新。

四、Vue 3 响应式系统的虚拟 DOM

4.1 虚拟 DOM 的简介

虚拟 DOM 是 Vue 3 响应式系统的核心技术之一。它由 Vue 3 的编译器将其转换为真实的 DOM 树,并且在组件更新时进行递归比较,从而快速地更新组件。虚拟 DOM 是 Vue 3 中用于处理组件渲染和响应式更新的部分,它模拟了 HTML DOM 树的结构,并且在组件更新时进行递归比较,从而快速地更新组件。

4.2 虚拟 DOM 的工作原理

在 Vue 3 中,虚拟 DOM 由 Vue 3 的编译器将其转换为真实的 DOM 树。虚拟 DOM 树由一系列的 Vue 实例组成,每个实例都包含一个或多个模板节点和指令节点。虚拟 DOM 树还包含一个数据模型,该模型包含了组件实例的状态和依赖关系。

当组件更新时,Vue 3 会遍历组件实例中的每一个组件,并将其转换为虚拟 DOM 树。然后,Vue 3 会计算出新的虚拟 DOM 树与原始虚拟 DOM 树之间的差异,并将其更新到真实的 DOM 树上。这个过程非常快,因为它只是将必要的部分更新到真实 DOM 树上。

4.3 虚拟 DOM 的优化

为了提高组件更新的性能,Vue 3 提供了一些优化措施。

  • 缓存虚拟 DOM 树:Vue 3 可以使用缓存来减少重复的虚拟 DOM 树构建过程,从而提高组件更新的性能。
  • 响应式系统优化:Vue 3 的响应式系统是基于虚拟 DOM 的,为了提高响应式系统的性能和可维护性,Vue 3 提供了一些优化措施,如数据劫持和响应式系统的缓存等。
  • 编译器优化:Vue 3 的编译器可以进行一些优化,如减少模板编译的次数、优化指令的执行顺序等,从而提高组件更新的性能。

五、Vue 3 响应式系统的事件处理

5.1 事件处理的简介

在 Vue 3 中,当我们需要监听和处理 DOM 事件时,可以使用事件处理程序。事件处理程序是 Vue 3 中的响应式系统的一部分,它们允许我们监听和处理 DOM 事件,例如点击、滚动、拖拽等等。

事件处理程序接收两个参数:事件对象和目标对象。事件对象包含了有关事件的信息,例如事件类型、事件源、事件监听器等等。目标对象则是被事件触发的元素或元素集合。

在 Vue 3 中,我们可以使用 v-on 指令来绑定事件处理程序到 DOM 元素上。v-on 指令的语法如下:

<template>  
  <div v-on:click="handleClick">  
    <!-- 点击事件处理程序的绑定 -->  
  </div>  
</template>  

在上面的代码中,我们使用 v-on 指令将事件处理程序 handleClick 绑定到了 div 元素上的 click 事件上。当我们点击元素时,handleClick 处理程序将会被执行。

5.2 事件处理的语法

Vue 3 响应式系统的事件处理程序可以使用 v-on 指令进行绑定,该指令具有以下语法:

<template>  
  <div v-on:event-name="handler">  
    <!-- 事件处理程序的绑定 -->  
  </div>  
</template>  

其中,event-name 是事件名,handler 是事件处理程序。事件名和事件处理程序之间使用冒号分隔,例如 :clickhandleClick

我们还可以使用多个事件名来绑定同一个事件处理程序,例如:

<template>  
  <div v-on:mouseenter="handleMouseEnter" v-on:mouseleave="handleMouseLeave">  
    <!-- 鼠标进入和离开事件处理程序的绑定 -->  
  </div>  
</template>  

在上面的代码中,我们使用了两个事件名 mouseentermouseleave 来绑定同一个事件处理程序 handleMouseEnterhandleMouseLeave。当鼠标进入元素时,handleMouseEnter 处理程序将会被执行,当鼠标离开元素时,handleMouseLeave 处理程序将会被执行。

5.3 事件处理的应用场景

Vue 3 响应式系统的事件处理非常灵活,我们可以使用它们来监听和处理各种 DOM 事件。以下是一些常见的应用场景:

5.3.1 监听和处理点击事件

我们可以使用 Vue 3 响应式系统的事件处理程序来监听和处理点击事件。例如,我们可以在 <button> 元素上使用 v-on:click 指令来绑定一个处理程序,以便在点击按钮时执行某些操作。

<template>  
  <div>  
    <button @click="handleClick">点击我</button>  
  </div>  
</template>

<script>  
export default {  
  data() {  
    return {  
      isClicking: false // 是否正在点击  
    };  
  },  
  methods: {  
    handleClick() {  
      this.isClicking = true;  
      setTimeout(() => {  
        this.isClicking = false;  
      }, 500);  
    }  
  }  
};  
</script>  

在上面的代码中,我们在 <button> 元素上使用 v-on:click 指令来绑定一个处理程序,当按钮被点击时,handleClick 处理程序将会被执行。

六、Vue 3 响应式系统的插件系统

6.1 插件系统的简介

在 Vue 3 中,我们可以使用插件系统来扩展和定制 Vue 3 的响应式系统。插件系统是 Vue 3 中的一个重要概念,它允许我们在 Vue 3 中创建和使用子插件和父插件。子插件可以包含多个组件、过滤器、计算属性等,而父插件则可以包含多个子插件。这些插件可以相互依赖,也可以嵌套使用。

在 Vue 3 的响应式系统中,我们可以使用插件系统来创建和管理响应式数据。我们可以使用插件来注册和订阅响应式数据,以及使用插件来创建和管理响应式组件。这些插件可以让我们更加方便地实现 Vue 3 的响应式系统,并且可以优化页面的性能和渲染速度。

6.2 插件系统的语法

在 Vue 3 中,我们可以使用 vue-loader 插件来创建和管理插件。使用 vue-loader 插件,我们可以将插件打包成一个单独的模块,并且可以在 Vue 3 的组件中使用。

下面是一个使用 vue-loader 插件创建和管理插件的示例:

import Vue from 'vue'  
import VueLoader from 'vue-loader'  
import MyPlugin from './my-plugin.js'

Vue.use(VueLoader)

export default {  
  plugins: [MyPlugin]  
}

在这个示例中,我们使用 vue-loader 插件来创建和管理 my-plugin 插件。我们在 my-plugin.js 文件中定义了该插件的组件、过滤器、计算属性等。然后,我们将这个插件注册到 Vue 3 的组件中,以便在组件中使用该插件。

6.3 插件系统的应用场景

在 Vue 3 的响应式系统中,插件系统有很多应用场景。下面列举了一些常见的应用场景:

  • 创建和管理响应式数据:我们可以使用插件来注册和订阅响应式数据,例如 Vue 3 中的 vue-response-proxy 插件和 vue-server-renderer 插件。
  • 创建和管理响应式组件:我们可以使用插件来创建和管理响应式组件,例如 Vue 3 中的 vue-loading 插件和 vue-form-input 插件。
  • 优化页面性能和渲染速度:我们可以使用插件来优化页面的性能和渲染速度,例如 Vue 3 中的 vue-loader 插件和 vue-template-compiler 插件。
  • 实现响应式应用程序:我们可以使用插件来实现响应式应用程序,例如 Vue 3 中的 vuex 插件和 vue-router 插件。

七、Vue 3 响应式系统的常见问题及解决方案

7.1 响应式系统的数据冲突

在 Vue 3 中,响应式系统采用了一种称为“数据劫持”的技术来跟踪组件实例的状态。这意味着,当组件实例的状态发生改变时,所有的子组件都会重新渲染。这可能会导致一些数据冲突的问题,例如当两个组件共享相同的数据时,它们可能会相互干扰,导致数据不正确。

解决方案:

  1. 使用 Vue 3 的data选项来定义组件实例的状态。
  2. 尽量避免在父组件中定义与子组件共享的数据,而是使用computed属性或watch选项来跟踪子组件的状态。
  3. 在子组件中使用computed属性或watch选项来跟踪状态,而不是直接修改状态。

示例代码:

// 父组件  
export default {  
  data() {  
    return {  
      sharedState: '',  
    };  
  },  
  components: {  
    MyChildComponent: {  
      template: `  
        <div>{{ sharedState }}</div>  
      `,  
      props: ['sharedState'],  
    },  
  },  
};

// 子组件  
export default {  
  props: ['sharedState'],  
  template: `  
    <div>{{ computedSharedState }}</div>  
  `,  
  methods: {  
    updateSharedState() {  
      this.computedSharedState = this.sharedState + ' updated';  
    },  
  },  
};  

在上面的代码中,父组件定义了一个与子组件共享的状态sharedState,并通过data选项将其传递给子组件。子组件使用computed属性来跟踪状态,而不是直接修改状态。当子组件更新状态时,父组件可以监听这个更新,并在子组件重新渲染时更新状态。

7.2 响应式系统的缓存问题

Vue 3 中的响应式系统采用了一种称为“响应式缓存”的技术来加速组件的渲染。当组件的状态发生改变时,Vue 3 不会重新渲染整个组件,而是仅重新渲染与状态更改相关的部分。这可以显著提高组件的渲染性能。

然而,如果组件的状态更改过于频繁,响应式缓存可能会失效。这可能会导致组件重新渲染整个页面,从而产生性能问题。

解决方案:

  1. 尽量避免在父组件中定义与子组件共享的状态,而是使用“computed”属性或“watch”选项来跟踪子组件的状态。
  2. 在子组件中使用“watch”选项来监听状态的变化,而不是频繁地更新状态。
  3. 如果必须在父组件和子组件之间共享状态,可以考虑使用 Vue 3 的“proxy”选项来创建一个代理对象,并将状态存储在代理对象中。

示例代码:

// 父组件  
export default {  
  data() {  
    return {  
      sharedState: '',  
    };  
  },  
  components: {  
    MyChildComponent: {  
      template: `  
        <div>{{ sharedState }}</div>  
      `,  
      props: ['sharedState'],  
    },  
  },  
};

// 子组件  
export default {  
  props: ['sharedState'],  
  template: `  
    <div>{{ proxySharedState }}</div>  
  `,  
  methods: {  
    updateSharedState() {  
      this.proxySharedState = this.sharedState + ' updated';  
    },  
  },  
};  

在上面的代码中,父组件定义了一个与子组件共享的状态“sharedState”,并将其存储在一个代理对象中。子组件使用“watch”选项来监听代理对象中的状态变化,而不是频繁地更新状态。当代理对象中的状态更新时,子组件可以重新渲染,但父组件的渲染性能得到了提高。

7.3 响应式系统的编译问题

7.3 响应式系统的编译问题

在 Vue 3 中,使用<template>标签和<script>标签混合编写组件时,Vue 3 会无法自动检测到组件的生命周期方法,因此需要进行手动导入和注册。这可能会导致编译错误。

解决方案:

  1. 使用@vue/script-loader插件来自动导入和注册组件的生命周期方法。
  2. <template><script>标签分开编写,以避免 Vue 3 无法自动检测到生命周期方法的问题。

示例代码:

import { defineComponent } from 'vue';

const MyComponent = defineComponent({  
  name: 'MyComponent',  
  components: {  
    default: {},  
  },  
  data() {  
    return {  
      message: 'Hello Vue!',  
    };  
  },  
  生命周期钩子:function() {  
    console.log('This is a lifecycle hook');  
  },  
});

export default MyComponent;  

在上面的代码中,我们使用@vue/script-loader插件来自动导入和注册组件的生命周期方法。同时,我们将<template><script>标签分开编写,以避免 Vue 3 无法自动检测到生命周期方法的问题。

在运行时,Vue 3 会自动检测组件的生命周期方法,并在组件重新渲染时执行它们。这使得编写响应式系统的组件变得更加容易。

在这里插入图片描述

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

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

相关文章

【软件设计师14】UML建模

UML建模 稳定出一个&#xff0c;但是由于UML的图比较多&#xff0c;所以这种题比数据流图和数据库难度高 一般都会考用例图和类图&#xff0c;再附加其他的图 1. 用例图 包含关系include&#xff1a;比如登记外借信息必须先有用户登录 扩展关系extend&#xff1a;修改书籍…

C语言--文件操作--一起深入了解文件相关函数的知识

目录前言1.什么是文件1.1程序文件1.2数据文件1.3文件名2.文件的打开与关闭2.1文件指针2.2文件的打开与关闭fopen函数fclose函数3.文件的顺序读写3.1对比一组函数fputc函数fgetc函数fputs函数fgets函数fprintf函数fscanf函数fwrite函数fread函数4.1对比一组函数sprintfsscanf5.文…

ClickUp的最佳替代品,可更好地管理项目

ClickUp 是项目管理类的常见工具&#xff0c;它因团队协作、沟通、免费试用和强大功能等因素受到用户的喜爱。 该工具支持你清晰组织多个项目、进行团队协作并跟踪项目目标的实时进度。不同的视图选项使您能够为所有活动构建完美的工作流程。 尽管它很受欢迎&#xff0c;但用户…

ics-05(命令执行漏洞及伪协议读取)

打开链接&#xff0c;似曾相识的感觉&#xff08;前面做过一道题叫ics-06&#xff0c;那道题是对id的一个爆破&#xff09; 尝试后发现只有设备维护中心可以跳转 这和我们使用御剑扫描出来的结果是一样的 使用PHP伪协议读取 index.php 页面 构造payload&#xff08;在愚人杯ht…

小黑跟尚香一起疯狂星期四,然后慢慢跑回家,生活逐渐明朗,完赛了副中心全程马拉松的leetcode之旅:752. 打开转盘锁

宽度优先搜索法 class Solution:def openLock(self, deadends: List[str], target: str) -> int:# 目的地在死亡数组里if target in deadends:return -1# 起点在死亡数字里if 0000 in deadends:return -1# 起点就是目标字符串if 0000 target:return 0# 定义前向函数def pr…

Python与c语言的区别与联系

Python与c语言都是一种机器学习语言&#xff0c;进过长时间的学习和总结&#xff0c;我将Python与c语言的一些特点总结成以下几点&#xff0c;不全面还望多多指正。 1、因为C语言是编译型语言&#xff0c;python是解释型语言&#xff0c;所以python的执行速度没有C语言那么快。…

回归预测 | MATLAB实现GA-GRU遗传算法优化门控循环单元的数据多输入单输出回归预测

回归预测 | MATLAB实现GA-GRU遗传算法优化门控循环单元的数据多输入单输出回归预测 目录回归预测 | MATLAB实现GA-GRU遗传算法优化门控循环单元的数据多输入单输出回归预测效果一览基本介绍程序设计参考资料效果一览 基本介绍 MATLAB实现GA-GRU遗传算法优化门控循环单元的数据多…

详解Nginx代理WordPress搭建个人网站系统

1、搭建环境说明 服务器&#xff1a;Red Hat Enterprise Linux Server release 7.9 (Maipo) PHP&#xff1a;php-8.2.4 PHP: Downloads Nginx: 1.24.0 http://nginx.org/en/download.html WordPress:6.2 Download – WordPress.org Mysql&#xff1a;5.7.22 MySQL Communit…

【Java EE】-网络编程(一) 网络初识

作者&#xff1a;学Java的冬瓜 博客主页&#xff1a;☀冬瓜的主页&#x1f319; 专栏&#xff1a;【JavaEE】 主要内容&#xff1a;单机、局域网、广域网、交换机、路由器。IP地址&#xff0c;端口号&#xff0c;协议&#xff0c;五元组。 协议分层&#xff0c;OSI七层网络模型…

【开源项目】SpringBoot实现接口加密解密

需求背景 在我们日常的Java开发中&#xff0c;免不了和其他系统的业务交互&#xff0c;或者微服务之间的接口调用 如果我们想保证数据传输的安全&#xff0c;对接口出参加密&#xff0c;入参解密。 但是不想写重复代码&#xff0c;我们可以提供一个通用starter&#xff0c;提…

数据结构系列17——lambda表达式

目录 1. 基本概念 2. 基本语法 3. 函数式接口 4. Lambda表达式的基本使用 4.1 语法精简 5. 变量捕获 6. Lambda在集合当中的使用 1. 基本概念 Lambda表达式是Java SE 8中一个重要的新特性。lambda表达式允许你通过表达式来代替功能接口。 lambda表达式就和方法一样,它提供了一…

再聊ChatGPT(关于安全,隐私和法律方面的风险)

我在上一篇博文中有谈到ChatGPT 发展可能会经历的一些阶段。ChatGPT的必经阶段&#xff1a;野蛮生长时代-管理层监管与风险提示-号召国产化-规范化常态化。 昨天刚好看到监管部门发文 说明监管部门已经意识到到ChatGPT野蛮生长阶段&#xff0c;其实是存在很多漏洞和问题的。 …

2022年 全国职业院校技能大赛(中职组)网络安全赛项 正式赛卷 A模块 做题记录

评分标准文件及环境 评分标准&#xff1a;ZZ-2022029 网络安全赛项正式赛卷.zip 自己做的Linux靶机&#xff1a; 自己做的Windows靶机&#xff1a; 文章目录评分标准文件及环境A-1 任务一 登录安全加固1. 密码策略&#xff08;Windows&#xff0c;Linux&#xff09;a. 最小密码…

年少不知回损好,却把插损当作宝

一博高速先生成员&#xff1a;黄刚 因为本期要讲的是插损和回损的关系&#xff0c;因此本文的开头&#xff0c;我们还是首先回顾下S参数的概念。首先我们需要知道S参数其实是个黑匣子&#xff0c;什么是黑匣子呢&#xff0c;那就是我们其实不需要知道它包含了哪些链路结构&…

steam游戏搬砖项目怎么做?月入过万的steam搬砖项目教程拆解

steam游戏搬砖项目怎么做?月入过万的steam搬砖项目教程拆解 大家好&#xff0c;我是童话姐姐&#xff0c;今天继续来聊Steam搬砖项目。 Steam搬砖项目也叫CSGO搬砖项目&#xff0c;它并不是什么刚面世的新项目&#xff0c;是已经存在至少七八年的一个资深老牌项目。这个项目…

QT4与QT5兼容问题

QT4 与QT5 兼容&#xff0c;源码差异部分通过QT_VERSION 宏来区分 常见区别 widgets prinsupport charts 等模块一如方式&#xff0c;Qt5 将QtWidgets QtPrintsupport 模块从QtGui 中分离出来&#xff0c;QT4 中没有qjson4 和 charts 模块&#xff0c;需要特殊处理 在pro文件…

SpringSecurity之基础认知

前言 之前一直说开一个SpringSecurity的专栏&#xff0c;今天抽空整理一下&#xff0c;准备开始更新。 也欢迎大家订阅此专栏&#xff01; 什么是SpringSecurity&#xff1f; Spring是非常成功的Java应用框架&#xff0c;目前是非常主流的开发框架。Spring Securtiy正是我们…

RPC 漫谈: 限流问题

RPC 漫谈&#xff1a; 限流问题 微服务之间的 RPC 调用往往会使用到限流功能&#xff0c;但是很多时候我们都是用很简单的限流策略&#xff0c;亦或是工程师拍脑袋定一个限流值。 这篇文章主要讨论在 RPC 限流中&#xff0c;当前存在的问题和可能的解决思路。 为什么需要限流…

Tailwind CSS 小案例,创建漂亮的收藏卡片列表

作为人类&#xff0c;我们有一种天生的倾向&#xff0c;喜欢收集不同的物品&#xff0c;并根据兴趣将它们分组。从邮票到书籍&#xff0c;人们收集和分组的物品种类繁多。定义上&#xff0c;收藏是一组事物&#xff0c;通常是由某个人创建的。例如&#xff0c;很多孩子会收集漫…

Docker In Docker

Docker in Docker 适用场景 ​ 在 CI 中&#xff0c;通常会有一个 CI Engine 负责解析流程&#xff0c;控制整个构建过程&#xff0c;而将真正的构建交给 Agent 去完成。例如&#xff0c;Jenkins 、GitLab 均是如此 同时 Agent 是动态的&#xff0c;构建时才需要&#xff0c;…