React面试常见题目(基础-进阶)
React面试常见题目及详细回答讲解
基础题目(20个)
-
什么是React?
回答:React是一个用于构建用户界面的JavaScript库,它允许你将UI拆分成可复用的组件。React起源于Facebook的内部项目,用于构建高性能的Web应用界面。
-
React组件有哪些类型?
回答:React组件主要有函数组件和类组件两种类型。函数组件接收props作为参数并返回React元素;类组件使用ES6类语法,并扩展React.Component,可以使用this关键字访问组件的状态和生命周期方法。
-
什么是JSX?
回答:JSX是React的语法扩展,它允许你在JavaScript代码中写类似HTML的标签。JSX最终会被Babel转译成React.createElement调用。
-
如何创建React组件?
回答:可以通过函数或类来创建React组件。函数组件直接返回React元素,而类组件需要继承React.Component并在render方法中返回React元素。
-
什么是state?
回答:state是组件记忆信息的一种方式,它允许组件在数据变化时重新渲染。state是组件私有的,并且只能通过setState方法来更新。
-
什么是props?
回答:props是父组件传递给子组件的数据,它是不可变的。
-
受控组件与非受控组件的区别是什么?
回答:受控组件是状态由React控制的组件,其值由父组件通过props传递,并在改变时触发回调函数。非受控组件则使用refs或其他方法在内部管理自己的状态。
-
React组件的生命周期有哪些阶段?
回答:React组件的生命周期包括挂载(Mounting)、更新(Updating)、卸载(Unmounting)和错误处理(Error Handling)等阶段。常用的生命周期方法包括constructor、render、componentDidMount、componentDidUpdate、componentWillUnmount等。
-
React 16.3之后哪些生命周期方法被标记为UNSAFE?
回答:React 16.3之后,componentWillMount、componentWillReceiveProps和componentWillUpdate等生命周期方法被标记为UNSAFE,因为它们可能在未来的React版本中被废弃或更改。
-
什么是高阶组件(HOC)?
回答:高阶组件是一个函数,它接收一个组件并返回一个新的组件。HOC可以用于复用组件逻辑、修改组件props或state等。
-
React Hooks有哪些?
回答:React Hooks包括useState、useEffect、useContext、useRef、useCallback、useMemo、useReducer等。它们提供了在函数组件中使用state和其他React特性的能力。
-
什么是虚拟DOM?
回答:虚拟DOM是React的一个核心概念,它是一个轻量级的、表示真实DOM结构的对象树。当React组件的状态或props发生变化时,React会更新虚拟DOM,并将其与之前的虚拟DOM进行比较,以确定需要更新的真实DOM部分。
-
React中的性能优化方法有哪些?
回答:React中的性能优化方法包括使用PureComponent或React.memo来避免不必要的重新渲染、使用shouldComponentUpdate生命周期方法来控制组件的更新、使用React的懒加载和代码拆分等。
-
如何在React中避免内存泄漏?
回答:在React中,可以通过及时取消订阅事件、清理定时器、避免在组件内部创建不必要的闭包等方式来避免内存泄漏。
-
React的diff算法是如何工作的?
回答:React的diff算法是为了节省性能而设计的,它主要通过同层级进行比较,不跨层级,使得性能更加高效。diff算法主要分为tree层、component层和element层三个层次进行比较。
-
React如何实现懒加载和代码分割?
回答:React提供了React.lazy和Suspense组件来实现懒加载和代码分割。懒加载允许开发者在需要时才加载某些组件或模块,从而减少初始加载时间。代码分割则是将代码拆分成多个小块,按需加载,以提高性能。
-
什么是React中的副作用?
回答:React中的副作用通常指的是那些影响外部状态或执行非纯函数操作的行为。可以使用useEffect、useLayoutEffect等Hook来处理副作用。
-
如何在React组件中传递props?
回答:在React中,可以通过在父组件中定义props,并在子组件中使用this.props或props参数来接收传递的数据。
-
React中的setState是如何工作的?
回答:在React中,setState是一个异步操作。当调用setState时,React会将其放入一个队列中,并在下一个事件循环中更新组件的状态和重新渲染。如果需要在setState后立即获取更新后的状态,可以使用回调函数或React.useState的返回值中的第二个函数(用于获取最新的state)。
-
React中的Keys有什么作用?
回答:在React中,当渲染列表或集合时,给每个子元素指定一个唯一的key属性可以帮助React识别哪些项改变了、被添加了或者被移除了。这有助于React更高效地进行DOM的更新和重渲染。
进阶题目(10个)
-
如何设计可复用的React组件?
回答:设计可复用的React组件需要遵循高内聚低耦合的原则,将组件的职责明确划分,并尽量保持组件的独立性。同时,可以通过props和context等机制来实现组件间的通信和数据共享。
-
React中的shouldComponentUpdate方法有什么用?
回答:shouldComponentUpdate方法允许开发者在组件更新之前进行自定义判断,如果返回false则不重新渲染组件。这可以用于性能优化,避免不必要的重新渲染。
-
React Router是什么?它是如何工作的?
回答:React Router是一个用于React应用的路由库,它允许开发者在应用中定义不同的路由和页面组件,并根据用户的导航操作来渲染相应的页面组件。React Router通过context和history等机制来实现路由的管理和状态更新。
-
React与TypeScript的结合使用有哪些优势?
回答:React与TypeScript的结合使用可以提高代码的可读性、可维护性和安全性。TypeScript为JavaScript添加了静态类型检查,使得开发者在编写代码时能够及时发现潜在的错误。
-
Redux是什么?它是如何工作的?
回答:Redux是一个用于JavaScript应用的状态管理库,它遵循Flux架构的核心理念,即单向数据流。Redux通过action、reducer和store等核心概念来实现状态的管理和更新。action是一个描述要执行什么操作的普通JavaScript对象;reducer是一个纯函数,它接收当前的state和action作为参数,并返回一个新的state;store则是Redux的核心,它保存了应用的整个状态树,并提供了一系列方法来访问和更新状态。
-
Redux中间件是什么?有什么作用?
回答:Redux中间件是一个用于拦截和扩展action处理流程的函数。通过中间件,开发者可以在action被发送到reducer之前执行一些额外的操作,如处理异步请求、记录日志等。Redux-thunk是一个常用的中间件,它允许开发者在action中返回函数来处理异步操作。
-
React中的合成事件(SyntheticEvent)是什么?与原生事件有何不同?
回答:React合成事件(SyntheticEvent)是React模拟原生DOM事件所有能力的一个事件对象,即浏览器原生事件的跨浏览器包装器。它根据W3C规范来定义合成事件,兼容所有浏览器,拥有与浏览器原生事件相同的接口。React采用顶层事件代理机制,能够保证冒泡一致性,可以跨浏览器执行。React提供的合成事件用来抹平不同浏览器事件对象之间的差异,将不同平台事件模拟合成事件。
-
如何在React中使用React.memo进行性能优化?
回答:React.memo是一个高阶组件,它接收一个组件并返回一个新的组件。如果组件的props在相同的情况下渲染相同的结果,React.memo可以跳过不必要的渲染,从而提高性能。它类似于PureComponent,但它是用于函数组件的。
-
React中的useRef Hook有什么作用?
回答:useRef是一个可以在函数组件中使用的Hook,它返回一个可变的ref对象,其.current属性被初始化为传递给useRef的参数。useRef通常用于访问DOM节点或在渲染周期之间存储任何可变数据,而不会引起组件的重新渲染。
-
如何在React中实现表单验证?
回答:在React中实现表单验证通常涉及以下几个步骤:首先,在组件的状态中管理表单数据和验证规则;其次,在表单元素上添加事件监听器(如onChange或onSubmit),以在输入或提交时触发验证逻辑;最后,根据验证结果更新组件的状态,并相应地显示错误消息或禁用提交按钮。这可以通过受控组件和非受控组件的方式来实现,但受控组件通常更易于管理和验证。
由于面试答案通常需要结合具体情境、项目经验和深入理解来阐述,以下我将为上述题目提供概括性的答案框架和思路,而非详尽无遗的固定答案。这样可以帮助面试者在准备时形成自己的思考路径和表述方式。
一、React基本概念与特性
- React是什么及其主要特性
- React是一个用于构建用户界面的JavaScript库。
- 主要特性包括:组件化开发、虚拟DOM、单向数据流、声明式编程等。
- JSX
- JSX是React中用于描述UI结构的语法扩展,允许在JavaScript代码中写HTML标签。
- 转换过程涉及Babel编译器,将JSX转换为React.createElement调用。
- 虚拟DOM
- 虚拟DOM是React在内存中构建的一个树形结构,代表UI的抽象表示。
- 当数据变化时,React会比较新旧虚拟DOM的差异,并高效地更新真实DOM。
- 单向数据流与双向绑定
- 单向数据流意味着数据只能从一个源头流向另一个,通过props和state实现。
- 双向绑定通常通过受控组件和事件处理实现,虽然React本身不直接提供双向绑定机制。
二、React组件
- 组件创建方式
- 函数组件和类组件。
- 函数组件通常用于简单逻辑,类组件适用于复杂状态和生命周期管理。
- 受控组件与非受控组件
- 受控组件的表单值由React组件的state控制。
- 非受控组件的表单值由DOM元素自身维护,通过ref访问。
- props和state
- props用于从父组件传递数据到子组件。
- state用于组件内部存储和管理状态。
- 条件渲染和列表渲染
- 条件渲染使用JavaScript的条件语句(如if或三元运算符)。
- 列表渲染使用map函数遍历数组并返回React元素。
三、React生命周期
- 生命周期方法
- 挂载阶段:constructor, render, componentDidMount等。
- 更新阶段:shouldComponentUpdate, getDerivedStateFromProps, render, getSnapshotBeforeUpdate, componentDidUpdate等。
- 卸载阶段:componentWillUnmount。
- 废弃或替换的生命周期方法
- componentWillMount, componentWillReceiveProps, componentWillUpdate被废弃。
- 替代方案:static getDerivedStateFromProps, componentDidMount/Update, useEffect等。
四、React Hooks
- 常用Hooks
- useState:管理状态。
- useEffect:处理副作用(如数据获取、订阅等)。
- useContext:使用React的Context API。
- useRef:访问DOM节点或存储可变值。
- useState
- useState返回一个状态变量和一个更新该变量的函数。
- 状态变量可以是任何类型的值,包括对象、数组等。
- useEffect和useLayoutEffect
- useEffect在DOM更新后同步执行,用于处理数据获取、订阅等副作用。
- useLayoutEffect在DOM更新后立即同步执行,用于读取DOM布局并同步触发重渲染。
- useCallback和useMemo
- useCallback返回一个记忆化的回调函数,防止在每次渲染时都重新创建。
- useMemo返回一个记忆化的值,只在依赖项改变时重新计算。
五、React性能优化
- 性能优化策略
- 避免不必要的重新渲染(PureComponent, React.memo, shouldComponentUpdate)。
- 使用虚拟列表和窗口化技术处理大量数据。
- 代码拆分和懒加载。
- 利用React的Concurrent Mode(实验性)。
- 减少重新渲染
- React.memo用于函数组件,通过比较props来避免不必要的渲染。
- useMemo和useCallback用于记忆化计算值和回调函数。
- 代码拆分和懒加载
- 使用React.lazy和Suspense实现代码拆分和懒加载。
- 动态导入模块以按需加载代码。
- 虚拟化技术
- 使用第三方库(如react-virtualized, react-window)来优化长列表和表格的渲染性能。
六、React高级特性
- Concurrent Mode
- 允许React应用以非阻塞方式更新UI,提高用户交互的响应性。
- 使用React.Suspense和新的生命周期API(如startTransition)来实现。
- Server Components
- React 18引入的特性,允许将组件逻辑放在服务器上运行,只将渲染的HTML发送到客户端。
- 提高了首屏加载速度和SEO优化。
- Suspense和Error Boundaries
- Suspense用于处理异步加载的数据,与lazy一起使用实现代码拆分。
- Error Boundaries用于捕获和处理组件树中的JavaScript错误。
- TypeScript与React
- 使用TypeScript为React组件添加类型检查,提高代码质量和维护性。
- 定义Props和State的类型,利用TypeScript的高级类型特性(如泛型、交叉类型等)。
七、React实战问题
- 全局状态管理
- Context API适用于简单的全局状态管理。
- Redux、MobX等第三方库适用于复杂的状态管理需求。
- Recoil是React的新状态管理库,提供了更细粒度的状态管理。
- 代码拆分和模块化设计
- 按照功能划分组件和模块,使用文件夹和文件结构组织代码。
- 使用ES6模块导入导出机制。
- 跨组件通信和状态共享
- 使用props进行父子组件通信。
- 使用Context API或Redux等状态管理库进行跨组件状态共享。
- 性能瓶颈问题
- 识别性能瓶颈(如大量数据渲染、频繁的状态更新)。
- 使用虚拟化技术、代码拆分、懒加载等策略优化性能。
- 利用React的开发者工具进行性能分析和调试。
以上答案框架为面试者提供了思考和回答的方向,但具体答案应根据个人经验和项目实际情况进行调整和补充。
相关文章:
React面试常见题目(基础-进阶)
React面试常见题目及详细回答讲解 基础题目(20个) 什么是React? 回答:React是一个用于构建用户界面的JavaScript库,它允许你将UI拆分成可复用的组件。React起源于Facebook的内部项目,用于构建高性能的Web应…...
AI赋能:开启你的副业创业之路
随着人工智能(AI)技术的迅猛发展,越来越多的人开始探索与之相关的副业机会。AI不仅深刻改变了我们的工作和生活方式,还为愿意学习和运用这项技术的人们打开了丰富的创业和增收之门。今天,我们就来盘点几条与AI相关的副…...
前端文件上传组件流程的封装
1. 前端文件上传流程 选择文件: 用户点击上传按钮,选择要上传的文件。使用 <input type"file"> 或 FileReader API 读取文件。 文件校验: 校验文件的大小、格式等信息,提前过滤掉不符合要求的文件,避免…...
图像篡改研究
使用生成对抗网络 (GAN) 来篡改已有的图片涉及生成和修改图像的技术。以下是如何使用GAN对现有图像进行篡改的详细步骤: 1. 选择合适的GAN模型 不同类型的GAN模型适用于不同的图像处理任务。以下是几个常见的GAN模型及其应用: CycleGAN:用…...
wlan的8种组网方式的区别
1)方式一:直连模式 二层组网(直接转发/ 集中转发) (2)方式二:直连模式 三层组网(集中转发) (3)方式三:旁挂模式 二层组网(…...
取消element-ui中账号和密码登录功能浏览器默认的填充色,element-ui登录账号密码输入框禁用浏览器默认填充色问题
标题 问题展示 修改后 <div class="loginForm"><el-formref="formB":model="formDataB":rules="rulesB"class="login-form"label-position="left"><el-form-item prop="userNo" clas…...
Postman:高效的API测试工具
在现代软件开发中,前后端分离的架构越来越普遍。前端开发者与后端开发者之间的协作需要一种高效的方式来测试和验证API接口。在这个背景下,Postman作为一款强大的API测试工具,受到了广泛的关注和使用。 今天将介绍什么是Postman、为什么要使用…...
设计模式-观察者模式(代码实现、源码级别应用、使用场景)
提示:观察者模式的代码实现、观察者模式的使用场景、观察者模式源码级别的应用、观察者模式的优点、 文章目录 前言一、定义二、类图三、代码实现四、应用场景五、源码级别的应用总结 前言 随着时间的推移,我现在越来越感觉自己的代码不够优雅了&#x…...
9种 Vuejs 常用事件修饰符与使用指南
前言 事件修饰符是 Vue.js 中一种特殊的语法标记,通过在事件名称后加上 . 和修饰符名称,可以轻松地修改事件的默认行为。这些修饰符不仅能够提升代码的清晰度,还能够避免一些常见的编程陷阱。Vue.js 提供了一系列事件修饰符,帮助…...
第十四题刮开有奖
这道题还是将我们下载好的附件先查壳 发现无壳且为32位 所以我们用32位的IDA打开 打开后ShftF12发现一串可疑的字符串 我们跟进看看 发现了这个函数 看这里有string数组 首先给了一串七v7 v8v9的数据 下面还有一个函数 我们再跟进一下 发现这大概是前面v7那堆数据的加密方式 我…...
vue3+vite使用dataV后项目运行报错、页面空白问题
Vue 大屏数据展示组件库官网:http://datav.jiaminghi.com/guide/ 我的版本是:“jiaminghi/data-view”: “^2.10.0” 一、dataV引入,看官网也可 // 安装 ( 我的安装版本 "jiaminghi/data-view": "^2.10.0" …...
PDF 【人工智能白皮书 】【大模型安全实践白皮书】【大模型白皮书】【大模型/深度学习/人工智能原理/心智学习】
【2024 中国人工智能发展白皮书 】【2023 中国人工智能白皮书】【大模型/深度学习/人工智能原理/心智学习】 前言下面所有涉及到的白皮书文件的总下载链接(网盘): 2024 人工智能发展白皮书 深圳市易行网数字科技有限公司2024 大模型训练数据白…...
【vue】13.深入理解递归组件
在Vue.js的开发实践中,组件是构建界面的核心概念。而递归组件则是一种特殊的组件,它能够自己调用自己,从而创造出无限嵌套的界面结构。本文将带你了解递归组件的应用,以及如何在Vue中实现和使用它。 一.什么是递归组件?…...
【OFDM】OFDM Radar Algorithms in Mobile Communication Networks
[1] Maximum Likelihood Speed and Distance Estimation for OFDM Radar 1-CRB估计 1-初步形式 首先单频信号频率估计的CRB,也就是原文Eq.(3.53) v a r [ ω ^ ] ≥ 6 σ N 2 ( N 2 − 1 ) N \mathrm{var}[\hat{\omega}]\geq\frac{6\sigma_N^2}{(N^2-1)N} var[ω^]≥(N2−…...
如何检测java中的内存泄露及溢出,并预防?
引言 在Java开发中,内存管理是一个至关重要的方面。尽管Java有垃圾回收机制,但开发者仍然需要关注内存泄漏和溢出的问题。 内存泄漏会导致应用程序的性能下降,甚至崩溃,而内存溢出则会导致Java虚拟机(JVM)抛出OutOfMemoryError异常。 本文将探讨如何检测Java项目中的内…...
kafka 如何减少数据丢失?
大家好,我是锋哥。今天分享关于【kafka 如何减少数据丢失?】面试题?希望对大家有帮助; kafka 如何减少数据丢失? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 Apache Kafka 是一个高吞吐量的分布式消息队列,广泛用…...
CTF-PWN: 虚表(vtable)
vtable vtable(虚表,virtual table)是面向对象编程中的一个关键概念,主要用于实现多态性(polymorphism)。它是一种数据结构,通常是一个指针数组,包含了类的虚函数(virtu…...
Redis 集群 总结
前言 相关系列 《Redis & 目录》(持续更新)《Redis & 集群 & 源码》(学习过程/多有漏误/仅作参考/不再更新)《Redis & 集群 & 总结》(学习总结/最新最准/持续更新)《Redis & 集群…...
2024校园交友系统构建指南/保姆版教程与技巧uniapp+php支持二开
一、建构技巧 1.前后端分离:采用前后端分离的开发模式,有助于提升开发效率,降低维护成本。前端专注于用户界面和交互体验,后端专注于业务逻辑和数据处理。 2.数据安全与隐私保护:实现细粒度的用户权限控制,确保用户数…...
NVR设备ONVIF接入平台EasyCVR视频分析设备平台视频质量诊断技术与能力
视频诊断技术是一种智能化的视频故障分析与预警系统,NVR设备ONVIF接入平台EasyCVR通过对前端设备传回的码流进行解码以及图像质量评估,对视频图像中存在的质量问题进行智能分析、判断和预警。这项技术在安防监控领域尤为重要,因为它能够确保监…...
系统思考—啤酒游戏经营决策沙盘
《第五项修炼:学习型组织建立》——系统思考的深层实践 越来越多的客户发现,系统思考不仅仅是一门课程,而是一种长期的实践。感谢合作伙伴对《第五项修炼》的支持,将其作为一个整体项目推荐。广东嘉荣超市在8月结束两天系统思考的…...
组件封装思路
组件封装的核心思路是:把可复用的结构只写一次,把可能发生变化的部分抽象成组件参数(props/插槽)。 如果是像纯文本,像是一些主标题和副标题,可以抽象成prop传入 如果主体内容是复杂的模版,有图片有列表等,…...
akshare股票涨跌停获取统计分析
参看: https://akshare.akfamily.xyz/data/stock/stock.html#id375 数据源来自东方财富网:https://quote.eastmoney.com/ztb/detail#typeztgc 参数说明 涨停统计: n/m代表m天中有n次涨停板 安装: pip install akshare -i http…...
前端对一个增删改查的思考
1、来源:dify dify/web/app/components/workflow/nodes/question-classifier/components/class-list.tsx at main langgenius/dify GitHub 2、代码流程: 3、思索问题: 1、为啥要用return形式,而不是value直接当函数࿱…...
【Clickhouse】客户端连接工具配置
ClickHouse 是什么 ClickHouse 是一个分布式实时分析型列式存储数据库。具备高性能,支撑PB级数据,提供实时分析,稳定可扩展等特性。适用于数据仓库、BI报表、监控系统、互联网用户行为分析、广告投放业务以及工业、物联网等分析和时序应用场…...
【测试平台】打包 jenkins配置和jenkinsfile文件
背景: 当打包机环境配置完成后,需要挂到master的jenkins中,完成调度。 jenkins启动 命令行直接启动即可。 nohup java -jar /usr/local/opt/jenkins/libexec/jenkins.war --httpListenAddress0.0.0.0 --httpPort80 appending output to n…...
Leetcode224 -- 基本计算器及其拓展
题目分析: 其实这个计算器的实现并不难,因为除了括号就剩下加减法嘛,括号肯定比加减法先执行,但是加减法是同级的,只是会改变数字的正负号而已,所以实现的逻辑并不是很难,我们只需要一个栈&…...
python的lambda实用技巧
lambda表达式 lambda表达式是一种简化的函数表现形式,也叫匿名函数,可以存在函数名也可以不存在。 使用一行代码就可以表示一个函数: # 格式 lambda arg[参数] : exp[表现形式] # 无参写法 lambda : "hello" # 一般写法 lambda …...
VB中的资源文件(Resource File)及其用途
在Visual Basic(VB)中,资源文件(Resource File)是一种特殊的文件,用于存储应用程序中使用的非代码资源。这些资源可以是字符串、图像、图标、音频文件、视频文件等。资源文件的主要用途是使应用程序的管理和…...
【vue】11.Vue 3生命周期钩子在实践中的具体应用
Vue 3的生命周期钩子为开发者提供了在不同阶段操作组件的强大能力。本文将带您了解每个生命周期钩子的使用场景,并通过简单的案例来展示它们在实际开发中的应用。 1. 创建阶段(Creation Hooks) beforeCreate 进行一些初始化操作,…...
优化网站做什么的/今日小说搜索风云榜
2019独角兽企业重金招聘Python工程师标准>>> 新建hello目录,新建hello.cpp文件 Hello.cpp #include<QApplication> //包含类QApplication的定义 #include<QLabel> //包含类QLabel的定义 int main(int argc, char *argv[]) {//…...
加大网站建设力度/湖南百度推广代理商
1.客户端和服务器的区别(1)硬件和操作系统不同。(2)TCP/IP的功能相同,但是用法不同,客户端用来发起连接,而服务器端要等待连接。即应用程序调用Socket库的程序组件不同。(3)服务器程序可以同时和多台客户端计算机进行通信。(4)虽然有很多不同…...
网站建设 58同城/如何优化网站推广
1数据库的代码自动生成 2ArcGIS版本的实现原理 A表和D表存储 3断点续传,多线程下载。 4类似Evernote的同步机制。 5点弧拓扑数据编辑 6事务的机制 1.服务器编程——服务器队列和客户端 2.异步编程 3.池化 4.透视和正视 5.Boost库的使用 6.资源的统一管理 7.SharpDev…...
怎么自己做个网站做链接跳转/seo算法培训
---------------------- Windows Phone 7手机开发、.Net培训、期待与您交流! ---------------------- 一、javascript调用C#代码解决方案 // 第一种情况: 1.后台方法: protected string CsharpVoid(string strCC) { return strCC; …...
网架钢构公司/seo的作用有哪些
项目地址:RedPackage简介:发布应用市场的 android 平台抢红包工具《红包精灵》开源啦,实现自动抢,快人一步,抢到手软。关键 Service 代码: 注:此前在 15 年 12 月时,用的 Eclipse 开…...
电子商务网站基本功能/天津关键词优化专家
微信公众号:infoQc如有问题或建议,请公众号留言最近更新:2018-08-19 包装类型 在讲解正文之前,我很想问这么一个问题:"Java为我们提供了8种基本数据类型,为什么还需要提供各自的包装类型呢?…...