神奇的Vue3 - 组件探索

神奇的Vue3

第一章 神奇的Vue3—基础篇
第二章 神奇的Vue3—Pinia


文章目录

  • 神奇的Vue3
  • 了解组件
  • 一、注册组件
    • 1. 全局注册​
    • 2. 局部注册
    • 3. 组件命名
  • 二、属性详解
    • 1. Props
      • (1)基础使用方法
      • (2)数据流向:单项绑定原则
      • (3)Boolean类型使用
    • 2. 事件
      • (1)触发(发射)与监听事件
      • (2)声明事件
      • (3)事件校验
    • 3. 组件上的双向绑定(v-model,defineModel())
      • (1)使用方法
      • (2)v-model 的参数,多个 v-model 绑定
        • ① 组件上的 v-model 也可以接受一个参数:
        • ② 多个 v-model 绑定
      • (3)底层机制​
    • 4. 透传 Attributes
      • (1)实现举例
      • (2)透传进来的 attribute 用 $attrs 访问
      • (3)禁用 Attributes 继承
    • 5. 插槽 slot
      • (1)含义
      • (2)插槽的渲染作用域,只能访问到父组件的数据作用域
      • (3)默认插槽和具名插槽,一个组件中包含多个插槽出口时
      • (4)$slots 属性
        • (5)动态插槽
    • 6. 父子组件数据传递之依赖注入
      • (1)prop逐级传递
      • (2)Provide和Inject在组件树中的任何地方共享数据
    • 7.异步组件
  • 总结


了解组件

Vue3中的组件是构建应用程序时非常重要的概念。组件允许你将UI拆分为独立且可重用的部分,使得代码更易于维护和管理。在Vue3中,您可以使用单文件组件(Single-File Component)纯JavaScript对象来定义组件。

使用单文件组件(Single-File Component)定义组件(推荐使用)
单文件组件通常使用.vue扩展名,其中包含了组件的模板、脚本和样式。一个简单的Vue3单文件组件示例:

<template><div><h1>{{ message }}</h1></div>
</template><script setup>
const message = 'Hello, Vue3!'
</script><style>
/* 样式代码 */
</style>

使用纯JavaScript对象定义组件
如果不使用构建工具,您可以将Vue组件定义为一个纯JavaScript对象,包含组件的数据、方法和模板。一个纯JavaScript对象定义的Vue3组件示例:

const MyComponent = {data() {return {message: 'Hello, Vue3!'};},template: `<div><h1>{{ message }}</h1></div>`
};

一、注册组件

一个 Vue 组件在使用前需要先被“注册”,这样 Vue 才能在渲染模板时找到其对应的实现。组件注册有两种方式:全局注册和局部注册。

1. 全局注册​

方式:使用 Vue 应用实例的 .component() 方法,让组件在当前 Vue 应用中全局可用。
问题:

  • 未使用的组件无法在打包时被自动移除(tree-shaking)
  • 相当于使用过多的全局变量,影响项目的可维护性
import { createApp } from 'vue'
import MyComponent from './App.vue'
import MyComponentA from './MyComponentA.vue'const app = createApp({})
// 参数:组件名称,组件
// 支持链式调用
app.component('MyComponent', MyComponent).component('MyComponentA', MyComponentA);// 也可以用遍历的方式实现多个组件注册
import componentA from "./components/componentA/index.vue";
import componentB from "./components/componentB/index.vue";
import componentC from "./components/componentC/index.vue";const commonComponent = {componentA,componentB,componentC
};
Object.values(commonComponent).forEach(component => {app.component(component.name, component);
})

2. 局部注册

<推荐使用,本文后续都将使用此种方式,其他形式请查询Vue官方文档>在使用 <script setup>单文件组件中,导入的组件可以直接在模板中使用,无需注册:

<script setup>
import ComponentA from './ComponentA.vue'
</script><template><ComponentA />
</template>

如果没有使用 <script setup>则需要使用 components 选项来显式注册:

import ComponentA from './ComponentA.js'export default {// 对于每个 components 对象里的属性,它们的 key 名就是注册的组件名,而值就是相应组件的实现components: {ComponentA},setup() {// ...}
}

3. 组件命名

使用 PascalCase (首字母大写的驼峰)作为组件名的注册格式。Vue 支持将模板中使用 kebab-case(短横线分隔命名) 的标签解析为使用 PascalCase 注册的组件。这意味着一个以 MyComponent 为名注册的组件,在模板中可以通过 <MyComponent><my-component> 引用

二、属性详解

1. Props

用法:Props(属性)是用于接收父组件向子组件传递的数据,使得子组件可以接收并使用这些数据

(1)基础使用方法

  • 命名:camelCase(驼峰)命名方式,父组件传入时可使用kebab-case(短横线分隔命名)的方式传入
  • 所有 prop 默认都是可选的,除非声明了 required: true
  • Boolean 外的未传递的可选 prop 将会有一个默认值 undefinedBoolean 类型的未传递 prop 将被转换为 false
  • 如果声明了 default 值,那么在 prop 的值被解析为 undefined 时,都会改为 default 值。
const props = defineProps({// 基础类型检查// (给出 `null` 和 `undefined` 值则会跳过任何类型检查)propA: Number,// 多种可能的类型propB: [String, Number],// 必传,且为 String 类型propC: {type: String,required: true},// Number 类型的默认值propD: {type: Number,default: 100},// 对象类型的默认值propE: {type: Object,// 对象或数组的默认值// 必须从一个工厂函数返回。// 该函数接收组件所接收到的原始 prop 作为参数。default(rawProps) {return { message: 'hello' }}},// 自定义类型校验函数// 可将完整的 props 作为第二个参数传入propF: {validator(value, props) {// The value must match one of these stringsreturn ['success', 'warning', 'danger'].includes(value)}},// 函数类型的默认值propG: {type: Function,// 不像对象或数组的默认,这不是一个// 工厂函数。这会是一个用来作为默认值的函数default() {return 'Default function'}}
})

(2)数据流向:单项绑定原则

定义:所有的 props 都遵循着单向绑定原则props父组件的更新而变化,但不会向上修改父组件的数据。


const props = defineProps(['propA'])
// 警告!prop 是只读的
// props.propA = 1;// 讲prop重新赋值,使 prop 和后续更新无关了
const counter = ref(props.propA)

(3)Boolean类型使用

// 子组件
const props = defineProps({// 可用于模态框的开关disabled: Boolean
});// 父组件中
<!-- 等同于传入 :disabled="true" -->
<MyComponent disabled /><!-- 等同于传入 :disabled="false" -->
<MyComponent />

2. 事件

(1)触发(发射)与监听事件

  • 触发(发射)事件(Emitting Events):组件可以使用$emit方法来发射(触发)自定义事件。例如,在子组件中可以使用$emit方法触发一个自定义事件:
<template>// 第二个参数,事件的参数<button @click="$emit('custom-event', eventData)">Click Me</button>
</template>
  • 监听事件(Listening to Events):父组件可以使用v-on指令或@符号来监听子组件发射的事件。例如,在父组件中可以监听子组件发射的custom-event事件:
<template><ChildComponent @custom-event="handleCustomEvent" />
</template><script>
export default {methods: {handleCustomEvent(eventData) {// 处理接收到的事件数据}}
};
</script>

(2)声明事件

在Js中

<script setup>
const emit = defineEmits(['change', 'submit'])function buttonClick() {emit('change', 123, false)
}
</script>

在Ts中:声明方法和入参

<script setup lang="ts">
const emit = defineEmits<{(e: 'change', id: number, isChange: boolean): void(e: 'update', value: string): void
}>();emit("change", 123, true);emit("update", "123");
</script>

(3)事件校验

为事件添加校验函数,参数为触发(发射)事件时传入 emit 的内容,返回一个布尔值来表明事件是否合法。

<script setup>
const emit = defineEmits({// 没有校验click: null,// 校验 submit 事件submit: ({ email, password }) => {if (email && password) {return true} else {console.warn('Invalid submit event payload!')return false}}
})function submitForm(email, password) {emit('submit', { email, password })
}
</script>

3. 组件上的双向绑定(v-model,defineModel())

v-modev-model指令可以在表单元素(如inputtextareaselect等)上创建双向数据绑定,使数据在组件和模板之间进行双向同步
defineModel() :返回的值是一个 ref。它可以像其他 ref 一样被访问以及修改,起到在父组件和当前变量之间的双向绑定的作用:

  • 它的 .value 和父组件的 v-model 的值同步;
  • 当它被子组件变更了,会触发父组件绑定的值一起更新。

(1)使用方法

在子组件中使用defineModel:在子组件中使用defineModel来声明一个双向绑定的模型。

<!-- ChildComponent.vue -->
<script setup>
const model = defineModel();
</script><template><input v-model="model" />
</template>

在父组件中使用子组件并绑定v-model:在父组件中使用子组件时,可以通过v-model指令将父组件的数据与子组件的双向绑定模型关联起来。

<!-- ParentComponent.vue -->
<template><ChildComponent v-model="countModel" />
</template><script setup>
const countModel = ref(0);
</script>

(2)v-model 的参数,多个 v-model 绑定

① 组件上的 v-model 也可以接受一个参数:
// 通过v-model:title,可以将一个名为title的属性与父组件中的数据进行双向绑定。
<MyComponent v-model:title="bookTitle" /><!-- MyComponent.vue -->
<script setup>
const title = defineModel('title')
</script><template><input type="text" v-model="title" />
</template>
② 多个 v-model 绑定
<!-- ChildComponent.vue -->
<script setup>
import { defineModel } from 'vue';const emailModel = defineModel('email');
const passwordModel = defineModel('password');
</script><!-- ParentComponent.vue -->
<template><ChildComponent v-model:email="emailData" v-model:password="passwordData" />
</template><script setup>
import { ref } from 'vue';const emailData = ref('');
const passwordData = ref('');
</script>

(3)底层机制​

defineModel 是一个便利。编译器将其展开为以下内容:

  • 一个名为 modelValueprop,本地 ref 的值与其同步;
  • 一个名为 update:modelValue 的事件,当本地 ref 的值发生变更时触发。子组件中接收父组件传递的数据,并使用$emit('update:modelValue', newValue)来更新父组件的数据。
<script setup>
const props = defineProps(['modelValue'])
const emit = defineEmits(['update:modelValue'])
</script><template><input:value="props.modelValue"@input="emit('update:modelValue', $event.target.value)"/>
</template>

4. 透传 Attributes

定义:父组件向子组件传递,却没有被该组件声明为 propsemitsattribute 或者 v-on 事件监听器其他所有。最常见的例子就是 classstyleid。这使得父组件可以向子组件传递任意的 HTML 属性,而无需在子组件中显式声明这些属性。

(1)实现举例

一个组件以单个元素为根作渲染时,透传的 attribute 会自动被添加到根元素上, 同样的规则也适用于 v-on 事件监听器

① 创建一个单个元素为根的子组件

<!-- ChildComponent.vue -->
<button>click me</button>

② 一个父组件使用了这个组件,并且传入了 class:

<!-- ParentComponent.vue -->
<MyButton class="large" @click="onClick" />

③ 最后渲染出的 DOM 结果是:

<button class="large" @click="onClick">click me</button>

(2)透传进来的 attribute 用 $attrs 访问

$attrs 对象包含了除组件所声明的 propsemits 之外的所有其他 attribute。在script中使用useAttrs() API 来访问一个组件的所有透传 attribute

  • props 有所不同,透传 attributes 在 JavaScript 中保留了它们原始的大小写,所以像 foo-bar 这样的一个 attribute 需要通过 $attrs['foo-bar'] 来访问。
  • @click 这样的一个 v-on 事件监听器将在此对象下被暴露为一个函数 $attrs.onClick
<!-- ChildComponent.vue -->
<template><div>// 子组件可以通过$attrs属性来访问父组件传递的所有非prop属性<p>Parent Component Message: {{ $attrs.message }}</p></div>
</template>
<script setup>
import { useAttrs } from 'vue'
// 在script中访问$attrs
const attrs = useAttrs();
console.log(attrs.message);</script><!-- ParentComponent.vue -->
<template><ChildComponent message="Hello from Parent Component" />
</template>

(3)禁用 Attributes 继承

在组件选项中设置 inheritAttrs: false

defineOptions({inheritAttrs: false
})

5. 插槽 slot

作用:用于在子组件中渲染父组件向子组件传递的内容。Vue 3中的插槽分为默认插槽具名插槽

(1)含义

在这里插入图片描述
<FancyButton> 组件

<!-- FancyButton.vue -->
<button class="fancy-btn"><slot></slot> <!-- 插槽出口 -->
</button>

② 在父组件中使用<FancyButton>

<!-- ParentComponent.vue -->
<FancyButton>Click me! <!-- 插槽内容 -->
</FancyButton>

③ 渲染结果:

<button class="fancy-btn">Click me!</button>

④ 是js来解释就是类似于

// 父元素传入插槽内容
FancyButton('Click me!')// FancyButton 在自己的模板中渲染插槽内容
function FancyButton(slotContent) {return `<button class="fancy-btn">${slotContent}</button>`
}

(2)插槽的渲染作用域,只能访问到父组件的数据作用域

插槽内容本身是在父组件模板中定义的,所以插槽内容只可以访问到父组件的数据作用域,插槽内容无法访问子组件的数据。

使用子组件域内的数据:像对组件传递 props 那样,向一个插槽的出口上传递 attributes:

<!-- MyComponent.vue -->
<div><slot :text="greetingMessage" :count="1"></slot>
</div><!-- ParentComponent.vue -->
// 在父组件中使用,可使用解构  v-slot="{ text, count }"
<MyComponent v-slot="slotProps">{{ slotProps.text }} {{ slotProps.count }}
</MyComponent>

(3)默认插槽和具名插槽,一个组件中包含多个插槽出口时

带 name 的插槽被称为具名插槽 (named slots)。没有提供 name<slot> 出口会隐式地命名为default

<!-- ChildComponent.vue -->
<div class="container"><header><!-- 标题内容放这里 --></header><main><!-- 主要内容放这里 --></main><footer><!-- 底部内容放这里 --></footer>
</div>
<!-- ParentComponent.vue -->
<div class="container"><header><slot name="header"></slot></header><main><slot></slot></main><footer><slot name="footer"></slot></footer>
</div>

(4)$slots 属性

$slots 是一个特殊的属性,用于访问子组件中的插槽内容。通过 $slots,您可以在父组件中访问和操作子组件中插槽的内容。

  • $slots.default 访问默认插槽内容
  • $slots.header 访问具名heard插槽内容
// template
<div v-if="$slots.header" class="card-header"><slot name="header" />
</div>// script 
import { useSlots } from 'vue'
const slots = useSlots();
// 访问默认插槽内容
const defaultSlotContent = slots.default;
// 访问具名插槽内容
const headerSlotContent = slots.header;
(5)动态插槽
<template><div><slot :name="slotName"></slot> <!-- 动态设置插槽名 --></div>
</template><script setup>
import { ref } from 'vue';const slotName = ref("header");
</script>

6. 父子组件数据传递之依赖注入

(1)prop逐级传递

在这里插入图片描述

(2)Provide和Inject在组件树中的任何地方共享数据

provideinject是一种高级的组件通信方式,用于在祖先组件后代组件之间传递数据,而不需要通过props逐层传递。这种方式可以方便地在组件树中的任何地方共享数据。

provide: provide是在祖先组件中使用的选项,用于提供数据给其所有后代组件。通过在provide中定义数据,可以将这些数据传递给所有后代组件。

inject: inject是在后代组件中使用的选项,用于接收祖先组件通过provide提供的数据。通过在inject中指定要接收的数据属性,可以在后代组件中访问这些数据。

<!-- Root.vue -->
<script setup>
import { provide } from 'vue';provide(/* 注入名 */ 'message', /* 值 */ 'hello!')
const location = ref('North Pole')
function updateLocation() {location.value = 'South Pole'
}
// 响应式数据注入,可以双向修改
provide('location', {location,updateLocation
});const count = ref(0)
// 使属性只是可读
provide('read-only-count', readonly(count))
</script>
<!-- DeepChild.vue -->
<script setup>
import { inject } from 'vue'const { location, updateLocation } = inject('location')
</script>

在这里插入图片描述

7.异步组件

defineAsyncComponent是一个用于创建异步组件的函数。defineAsyncComponent函数允许您延迟加载组件,以提高应用程序的性能和加载速度。

import { defineAsyncComponent } from 'vue';const AsyncComp = defineAsyncComponent(() => {return new Promise<AsyncComponent>((resolve, reject) => {// 加载组件import("./modals/createProjectModal.vue").then((module) => {// 返回包含组件定义的对象resolve(module.default);}).catch((error) => {reject(error); // 加载失败时的处理});});
});
// 简写
const AsyncComp = defineAsyncComponent(() => import('./components/AsyncComponent.vue'));
// 高级选项
const AsyncComp = defineAsyncComponent({// 加载函数loader: () => import('./Foo.vue'),// 加载异步组件时使用的组件loadingComponent: LoadingComponent,// 展示加载组件前的延迟时间,默认为 200msdelay: 200,// 加载失败后展示的组件errorComponent: ErrorComponent,// 如果提供了一个 timeout 时间限制,并超时了// 也会显示这里配置的报错组件,默认值是:Infinitytimeout: 3000
})

总结

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

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

相关文章

5-在Linux上部署各类软件

1. MySQL 数据库安装部署 1.1 MySQL 5.7 版本在 CentOS 系统安装 注意&#xff1a;安装操作需要 root 权限 MySQL 的安装我们可以通过前面学习的 yum 命令进行。 1.1.1 安装 配置 yum 仓库 # 更新密钥 rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022# 安装Mysql…

GraphGPT——图结构数据的新语言模型

在人工智能的浪潮中&#xff0c;图神经网络&#xff08;GNNs&#xff09;已经成为理解和分析图结构数据的强大工具。然而&#xff0c;GNNs在面对未标记数据时&#xff0c;其泛化能力往往受限。为了突破这一局限&#xff0c;研究者们提出了GraphGPT&#xff0c;这是一种为大语言…

重学java 29.经典接口

光阴似箭&#xff0c;我好像跟不上 —— 24.5.6 一、java.lang.Comparable 我们知道基本数据类型的数据(除boolean类型外)需要比较大小的话&#xff0c;直接使用比较运算符即可&#xff0c;但是引用数据类型是不能直接使用比较运算符来比较大小的。那么&#xff0c;如何解决这个…

(读书笔记-大模型) LLM Powered Autonomous Agents

目录 智能体系统的概念 规划组件 记忆组件 工具组件 案例研究 智能体系统的概念 在大语言模型&#xff08;LLM&#xff09;赋能的自主智能体系统中&#xff0c;LLM 充当了智能体的大脑&#xff0c;其三个关键组件分别如下&#xff1a; 首先是规划&#xff0c;它又分为以下…

代码随想录第51天 | 309.最佳买卖股票时机含冷冻期

309.最佳买卖股票时机含冷冻期 309. 买卖股票的最佳时机含冷冻期 - 力扣&#xff08;LeetCode&#xff09; 代码随想录 (programmercarl.com) 动态规划来决定最佳时机&#xff0c;这次有冷冻期&#xff01;| LeetCode&#xff1a;309.买卖股票的最佳时机含冷冻期_哔哩哔哩_bi…

状压dp 理论例题 详解

状压dp 四川2005年省选题&#xff1a;互不侵犯 首先我们可以分析一下&#xff0c;按照我们普通的思路&#xff0c;就是用搜索&#xff0c;枚举每一行的每一列&#xff0c;尝试放下一个国王&#xff0c;然后标记&#xff0c;继续枚举下一行 那么&#xff0c;我们的时间复杂度…

曼奇立德10节春季插画研修课

课程介绍 课程探讨了存在主义心理学的基本原理和方法。通过学习该课程&#xff0c;您将了解到存在主义的核心概念&#xff0c;如自由意志、责任感和意义寻求。您将学会运用存在主义理论和技巧来帮助个人面对挑战、追求自我实现&#xff0c;并寻找生活的意义。这门课程将启发您的…

从固定到可变:利用Deformable Attention提升模型能力

1. 引言 本文将深入探讨注意力机制的内部细节&#xff0c;这是了解机器如何选择和处理信息的基础。但这还不是全部&#xff0c;我们还将探讨可变形注意力的创新理念&#xff0c;这是一种将适应性放在首位的动态方法。 闲话少说&#xff0c;我们直接开始吧&#xff01; 2. 注…

pytest教程-36-钩子函数-pytest_collection_start

领取资料&#xff0c;咨询答疑&#xff0c;请➕wei: June__Go 上一小节我们学习了pytest_unconfigure钩子函数的使用方法&#xff0c;本小节我们讲解一下pytest_collection_start钩子函数的使用方法。 pytest_collection_start(session) 是一个 pytest 钩子函数&#xff0c;…

Python_4-对象序列化操作

文章目录 Python中对象数据持久化操作模块学习笔记marshal模块优点缺点使用示例保存数据到文件从文件读取数据 shelve模块优点缺点使用示例保存数据到文件从文件读取数据 总结 Python中对象数据持久化操作模块学习笔记 在Python中&#xff0c;数据持久化指的是将程序中的数据结…

PHP基于B/S版 医院不良事件管理系统源码vscode+laravel8医院如何加强不良事件上报系统的管理 AEMS系统源码

PHP基于B/S版 医院不良事件管理系统源码vscodelaravel8医院如何加强不良事件上报系统的管理 AEMS系统源码 医院安全&#xff08;不良&#xff09;事件管理AEMS系统AEMS采用无责的、自愿的填报不良事件方式&#xff0c;有效地减轻医护人员的思想压力&#xff0c;实现以事件为主要…

快速编写测试用例(超详细~)

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 关注公众号【互联网杂货铺】&#xff0c;回复 1 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 当你学会了如何设计测试用例之后&#xff0c;接下来便是开始用例…

ERP系统电子文件归档和电子档案管理规范

ERP系统电子文件归档和电子档案管理规范 1 范围 本文件描述了企业资源计划&#xff08;ERP&#xff09;系统形成电子文件归档和电子档案管理的方法。 本文件适用于企业资源计划&#xff08;ERP&#xff09;系统&#xff08;含采购、销售、物料、生产计划、质量、设备、项目…

使用C#和EF Core实现高效的SQL批量插入

在软件开发中&#xff0c;批量插入数据是一个常见的需求&#xff0c;特别是在数据迁移、初始化数据库或进行大量数据处理时。Entity Framework Core (EF Core) 是一个流行的.NET对象关系映射器&#xff08;ORM&#xff09;&#xff0c;它简化了数据库操作&#xff0c;但在进行大…

Linux CPU 飙升 排查五步法

排查思路-五步法 1. top命令定位应用进程pid 找到最耗时的CPU的进程pid top2. top-Hp[pid]定位应用进程对应的线程tid 找到最消耗CPU的线程ID // 执行 top -Hp [pid] 定位应用进程对应的线程 tid // 按shift p 组合键&#xff0c;按照CPU占用率排序 > top -Hp 111683.…

SparkSQL编程入口和模型与SparkSQL基本编程

SparkSQL编程入口和模型 SparkSQL编程模型 主要通过两种方式操作SparkSQL&#xff0c;一种就是SQL&#xff0c;另一种为DataFrame和Dataset。 1)SQL&#xff1a;SQL不用多说&#xff0c;就和Hive操作一样&#xff0c;但是需要清楚一点的是&#xff0c;SQL操作的是表&#xf…

为什么很多人不推荐你用JWT?

为什么很多人不推荐你用JWT? 如果你经常看一些网上的带你做项目的教程&#xff0c;你就会发现 有很多的项目都用到了JWT。那么他到底安全吗&#xff1f;为什么那么多人不推荐你去使用。这个文章将会从全方面的带你了解JWT 以及他的优缺点。 什么是JWT? 这个是他的官网JSON…

Linux学习(一)-- 简单的认识

目录 1. Linux的诞生 2.Linux发行版 拓展&#xff1a; &#xff08;1&#xff09;什么是Linux系统的内核&#xff1f; &#xff08;2&#xff09;什么是Linux系统发行版&#xff1f; 1. Linux的诞生 Linux创始人: 林纳斯 托瓦兹 Linux 诞生于1991年&#xff0c;作者上大学…

2×24.5W、内置 DSP、低失真、高信噪比、I2S 输入 D 类音频功率放大器,完美替换TPA5805,晶豪,致盛,

ANT3825 是一款高集成度、高效率的双通道数字 输入功放。供电电压范围在 5V&#xff5e;18V&#xff0c;数字接口 电源支持 3.3V 或 1.8V。双通道 BTL 模式下输出 功率可以到 224.5W(4Ω&#xff0c;16V&#xff0c;THDN1%)&#xff0c; 单通道 PBTL 模式下可以输出 37W&#x…

Spring IoCDI(2)—IoC详解

目录 一、IoC详解 1、Bean的存储 &#xff08;1&#xff09;Controller&#xff08;控制器存储&#xff09; 获取bean对象的其他方式 Bean 命名约定 &#xff08;2&#xff09;Service&#xff08;服务存储&#xff09; &#xff08;3&#xff09;Repository&#xff08…