React JSX 转换DOM详解:过程与分类

需积分: 0 0 下载量 57 浏览量 更新于2024-08-04 收藏 129KB DOCX 举报
在前端开发面试中,面试官可能会提问关于React JSX与DOM之间的转换过程。React是一个流行的JavaScript库,特别适用于构建用户界面。JSX是React的扩展语法,它使得HTML标记看起来像JavaScript表达式,从而提高了代码的可读性和组件化开发的便利性。 首先,理解JSX到DOM的转换过程非常重要。当我们在React中编写JSX代码时,例如: ```jsx <div> <img src="avatar.png" className="profile" /> <Hello /> </div> ``` Babel这个工具在编译时会发挥作用,它会将这些JSX代码转化为React.createElement函数调用的形式,如: ```javascript React.createElement( "div", null, React.createElement("img", { src: "avatar.png", className: "profile" }), React.createElement(Hello, null) ); ``` 在这个过程中,Babel会识别首字母来区分不同的节点类型。如果首字母是小写,它会被识别为原生DOM元素,而首字母大写的则视为自定义组件。React.createElement的第一个参数如果是字符串,会被当作元素标签名;如果是对象,则是组件实例或工厂函数。 在React中,节点主要分为四类: 1. 原生标签节点(Native Tags):比如`<div>`、`<img>`等,它们直接对应DOM元素,由ReactDOM.render()渲染到页面上。 2. 文本节点(Text Nodes):纯文本内容,没有对应的HTML标签。 3. 函数组件(Functional Components):使用函数定义的组件,它们通常接收props并返回React元素。如`FunctionComponent`例子所示: ```jsx function FunctionComponent(props) { return ( <div className="border"> FunctionComponent <p>{props.name}</p> </div> ); } ``` 4. 类组件(Class Components):使用ES6类定义的组件,包含状态(state)和生命周期方法。如`ClassComponent`示例: ```jsx class ClassComponent extends Component { static defaultProps = { color: "pink" }; render() { return ( <div className="border"> <h3>ClassComponent</h3> <p className={this.props.color}>{this.props.name}</p> </div> ); } } ``` 当组件的状态改变或组件本身发生变化时,React会根据虚拟DOM(Virtual DOM)算法计算出最小的DOM差异,并仅更新这些部分,这就是React的核心性能优化机制——“Diffing”。 最后,整个组件树会通过ReactDOM.render()方法挂载到指定的DOM容器,如`document.getElementById("root")`,从而实现组件与真实DOM的映射和更新。面试时,熟悉这个过程以及如何处理不同类型的节点和组件是必不可少的,因为它直接影响到代码的性能和可维护性。

{ type: "searchSelect", placeholder: "签约机构", valueName: 'signOrganId', optionName: "label", searchItemName: "label", optionId: "key", searchApi:commonService.orgPageList({}).then(res=>{ const {retData}=res retData.map(item=>{ return {key: item.id, label: item.organName, value: item.id,} }) }) }, 分析一下此段代码的报错 汉语解释index.jsx:55 Uncaught TypeError: item.searchApi is not a function at searchQuery (index.jsx:55:1) at onFocus (index.jsx:129:1) at onContainerFocus (BaseSelect.js:326:1) at HTMLUnknownElement.callCallback (react-dom.development.js:188:1) at Object.invokeGuardedCallbackDev (react-dom.development.js:237:1) at invokeGuardedCallback (react-dom.development.js:292:1) at invokeGuardedCallbackAndCatchFirstError (react-dom.development.js:306:1) at executeDispatch (react-dom.development.js:389:1) at executeDispatchesInOrder (react-dom.development.js:414:1) at executeDispatchesAndRelease (react-dom.development.js:3278:1) at executeDispatchesAndReleaseTopLevel (react-dom.development.js:3287:1) at forEachAccumulated (react-dom.development.js:3259:1) at runEventsInBatch (react-dom.development.js:3304:1) at runExtractedPluginEventsInBatch (react-dom.development.js:3514:1) at handleTopLevel (react-dom.development.js:3558:1) at batchedEventUpdates$1 (react-dom.development.js:21871:1) at batchedEventUpdates (react-dom.development.js:795:1) at dispatchEventForLegacyPluginEventSystem (react-dom.development.js:3568:1) at attemptToDispatchEvent (react-dom.development.js:4267:1) at dispatchEvent (react-dom.development.js:4189:1) at unstable_runWithPriority (scheduler.development.js:653:1) at runWithPriority$1 (react-dom.development.js:11039:1) at discreteUpdates$1 (react-dom.development.js:21887:1) at discreteUpdates (react-dom.development.js:806:1) at dispatchDiscreteEvent (react-dom.development.js:4168:1)

2023-07-13 上传

{ type: "searchSelect", placeholder: "签约机构", valueName: 'signOrganId', optionName: "label", searchItemName: "label", optionId: "key", searchApi:commonService.orgPageList({}).then(res=>{ const {retData}=res retData.map(item=>{ return {key: item.id, label: item.organName, value: item.id,} }) }) }, 分析一下此段代码的报错 汉语解释 ,并修改searchApi中的代码,index.jsx:55 Uncaught TypeError: item.searchApi is not a function at searchQuery (index.jsx:55:1) at onFocus (index.jsx:129:1) at onContainerFocus (BaseSelect.js:326:1) at HTMLUnknownElement.callCallback (react-dom.development.js:188:1) at Object.invokeGuardedCallbackDev (react-dom.development.js:237:1) at invokeGuardedCallback (react-dom.development.js:292:1) at invokeGuardedCallbackAndCatchFirstError (react-dom.development.js:306:1) at executeDispatch (react-dom.development.js:389:1) at executeDispatchesInOrder (react-dom.development.js:414:1) at executeDispatchesAndRelease (react-dom.development.js:3278:1) at executeDispatchesAndReleaseTopLevel (react-dom.development.js:3287:1) at forEachAccumulated (react-dom.development.js:3259:1) at runEventsInBatch (react-dom.development.js:3304:1) at runExtractedPluginEventsInBatch (react-dom.development.js:3514:1) at handleTopLevel (react-dom.development.js:3558:1) at batchedEventUpdates$1 (react-dom.development.js:21871:1) at batchedEventUpdates (react-dom.development.js:795:1) at dispatchEventForLegacyPluginEventSystem (react-dom.development.js:3568:1) at attemptToDispatchEvent (react-dom.development.js:4267:1) at dispatchEvent (react-dom.development.js:4189:1) at unstable_runWithPriority (scheduler.development.js:653:1) at runWithPriority$1 (react-dom.development.js:11039:1) at discreteUpdates$1 (react-dom.development.js:21887:1) at discreteUpdates (react-dom.development.js:806:1) at dispatchDiscreteEvent (react-dom.development.js:4168:1)

2023-07-14 上传
2023-06-05 上传