一、组件之间如何通讯?
标准回答:
在 React 中,组件之间的通讯方式主要有以下几种。父组件向子组件通讯可以通过 props 传递数据;子组件向父组件通讯可以通过回调函数的方式,由父组件传递给子组件一个函数,子组件调用这个函数来传递数据。兄弟组件之间通讯通常需要通过共同的父组件进行中转,或者使用状态管理工具如 Redux 来实现全局状态的共享。
白话回答:
组件之间通信呢,要是父组件想给子组件传点啥,就用 props 就行啦,就像给子组件送个包裹。子组件要给父组件传话呢,父组件就给子组件一个函数,子组件要用的时候就调用这个函数。兄弟组件通信一般得靠他们的老爸来帮忙中转一下,或者用 Redux 这种工具,让大家都能拿到一样的数据。
二、JSX 本质是什么?
标准回答:
JSX 本质上是一种 JavaScript 的语法扩展,它允许在 JavaScript 代码中直接编写类似 HTML 的标签结构来描述 React 组件的 UI 界面。JSX 最终会被编译成普通的 JavaScript 对象,然后由 React 进行解析和渲染。
白话回答:
JSX 啊,其实就是让咱在写 JavaScript 的时候能像写 HTML 那样去画界面,不过最后它会被变成普通的 JavaScript 对象,让 React 能认识,然后把界面给画出来。
三、Context 是什么,如何使用?
标准回答:
Context 是 React 中的一种高级特性,用于在组件树中传递数据,避免了通过层层的 props 传递数据的繁琐。可以通过 React.createContext 创建一个 Context 对象,然后在父组件中使用 Provider 组件来提供数据,在子组件中通过 Consumer 组件或者使用 useContext 钩子来获取数据。
白话回答:
Context 就是个能让你在一大串组件里面传数据的东西,不用一层一层地用 props 传那么麻烦。先弄个 Context 对象,然后在老爸组件那用 Provider 把数据放进去,子组件就能用 Consumer 或者 useContext 钩子把数据拿出来用。
四、ShouldComponentUpdate 用途?
标准回答:
ShouldComponentUpdate 是 React 类组件中的一个生命周期方法,用于控制组件是否需要重新渲染。通过比较新旧 props 和 state,可以决定组件是否应该更新其 UI。如果返回 false,则组件不会进行重新渲染,从而提高性能。
白话回答:
ShouldComponentUpdate 就是用来看看组件需不需要重新画界面的。对比一下新的和旧的那些数据,如果没啥变化,就不用重新画了,这样能让性能好点。
五、ajax 应该放在哪个生命周期?
标准回答:
在 React 类组件中,ajax 请求通常放在 componentDidMount 生命周期方法中。因为这个时候组件已经挂载到 DOM 上,可以进行数据的获取操作,并且不会引起额外的渲染。
白话回答:
ajax 请求啊,一般放在 componentDidMount 这个时候。为啥呢?因为这时候组件都弄好放到网页上了,这时候去拿数据正好,也不会乱画画。
六、组件公共逻辑如何抽离?
标准回答:
可以通过高阶组件(HOC)或者自定义 Hook 的方式来抽离组件的公共逻辑。高阶组件是一个函数,它接受一个组件作为参数并返回一个新的增强组件,将公共逻辑封装在高阶组件中,被增强的组件可以直接使用这些逻辑。自定义 Hook 则是将可复用的逻辑封装成函数,在需要的组件中调用。
白话回答:
要把组件的公共逻辑抽出来呢,可以用高阶组件或者自定义 Hook。高阶组件就是个函数,拿个组件进去加工一下再给你个新组件,新组件就有那些公共逻辑了。自定义 Hook 就是把逻辑写成个函数,要用的组件直接调用这个函数就行。
七、函数组件和 Class 组件区别?
标准回答:
函数组件是使用函数定义的组件,更加简洁,没有生命周期方法,通过 React Hooks 来实现状态管理和副作用处理等功能。Class 组件是使用类定义的组件,有生命周期方法,可以直接在类中管理状态和处理副作用。函数组件在性能上可能更优,并且代码更易维护和理解。
白话回答:
函数组件就是用个函数写的组件,简单明了,没有那些乱七八糟的生命周期方法,用 Hooks 来管状态啥的。Class 组件是用类写的,有生命周期方法。函数组件性能可能好点,代码也好懂好维护。
八、什么是受控组件?
标准回答:
在 React 中,受控组件是指其值由 React 控制的表单元素。表单元素的值通过 state 进行管理,表单元素的 onChange 事件会触发更新 state 的操作,从而使表单元素的值始终与 state 中的值保持同步。
白话回答:
受控组件就是那种 React 管着它的值的表单元素。比如说输入框啥的,它的值是由 React 的 state 管着的,一有变化就更新 state,让它的值一直和 state 里的一样。
九、何时使用异步组件?
标准回答:
当组件的加载需要花费较长时间,或者组件的代码体积较大可能影响页面加载性能时,可以使用异步组件。异步组件可以在需要的时候才进行加载,提高页面的初始加载速度。
白话回答:
啥时候用异步组件呢?就是那种组件加载起来老慢了,或者组件可大可占地方了,怕影响网页一开始加载的速度,这时候就用异步组件,等要用的时候再加载。
十、Redux 如何进行异步请求?
标准回答:
在 Redux 中,可以使用中间件如 redux-thunk 或 redux-saga 来处理异步请求。通过定义 action creator 函数,在函数中进行异步操作,如发送 ajax 请求,然后根据请求的结果派发相应的同步 action 来更新 Redux store 中的状态。
白话回答:
在 Redux 里要弄异步请求呢,可以用 redux-thunk 或者 redux-saga 这些中间件。定义个 action creator 函数,在里面搞异步操作,比如发个 ajax 请求,完了根据结果弄个同步的 action 去更新 Redux 里面的状态。
十一、React-Router 如何配置懒加载?
标准回答:
在 React-Router 中,可以使用动态导入(dynamic import)的方式来实现路由的懒加载。通过在路由配置中使用 import () 函数来异步加载组件,当路由被访问时才会加载对应的组件,提高应用的初始加载速度。
白话回答:
React-Router 要配置懒加载呢,就用动态导入那个办法。在路由配置那用 import () 函数,这样只有当那个路由被访问的时候才会去加载那个组件,一开始不用都加载,能让网页加载快点。
十二、PureComponent 有何不同?
标准回答:
React.PureComponent 与普通的 React 类组件相比,会在 shouldComponentUpdate 中进行浅层的 props 和 state 的比较,如果 props 和 state 没有变化,则不会触发重新渲染。这可以提高组件的性能,但对于复杂的对象或数组的比较可能不准确,需要手动实现 shouldComponentUpdate 方法进行深度比较。
白话回答:
PureComponent 和普通的组件比呢,它会在 shouldComponentUpdate 的时候浅浅地比一下 props 和 state 变没变,如果没变就不重新画界面了,能让性能好点。不过要是有复杂的对象或者数组,它比得可能不准,就得自己去写 shouldComponentUpdate 方法好好比一下。
十三、React 事件和 DOM 事件有何不同?
标准回答:
React 事件是对 DOM 事件的封装,具有以下不同点。React 事件采用驼峰命名法,而 DOM 事件是小写命名。React 事件在事件处理函数中阻止默认行为使用 event.preventDefault (),而在 DOM 事件中是 return false 或使用 preventDefault 方法。React 事件是合成事件,会进行事件池化以提高性能,并且在所有浏览器中表现一致。
白话回答:
React 的事件和 DOM 的事件不太一样。React 的事件名字是驼峰命名的,DOM 的是小写。React 里阻止默认行为用 event.preventDefault (),DOM 里有时候是 return false 或者用 preventDefault 方法。React 的事件是合成的,还会弄个事件池提高性能,在各种浏览器里表现都一样。
十四、React 性能优化?
标准回答:
React 性能优化可以从多个方面进行。使用 React.PureComponent 或手动实现 shouldComponentUpdate 进行浅比较或深度比较来避免不必要的渲染;使用 memoization 技术对函数进行缓存;合理使用 React 的 key 属性来帮助 React 识别列表中的元素,避免不必要的重新渲染;使用懒加载技术加载大型组件或数据;优化 setState 的使用,避免频繁的状态更新导致不必要的渲染。
白话回答:
React 性能咋优化呢?可以用 PureComponent 或者自己写 shouldComponentUpdate 去比一比,看看用不用重新画界面。用 memoization 技术把函数缓存一下。列表里加上 key 属性让 React 认识元素,别乱画画。大组件或者数据用懒加载。还有 setState 的时候别瞎用,别老让它乱画界面。
十五、React 和 Vue 的区别?
标准回答:
React 和 Vue 都是流行的前端框架,有以下一些主要区别。在语法上,React 使用 JSX 和函数式编程风格,Vue 使用模板语法和更接近传统 HTML 的方式。在状态管理方面,React 通常配合 Redux 等库进行状态管理,Vue 有自己的状态管理工具 Vuex。在组件化方面,两者都支持组件化开发,但在实现方式上略有不同。在学习曲线方面,Vue 相对较容易上手,React 可能需要一定的学习成本。
白话回答:
React 和 Vue 都是很火的前端框架。语法上呢,React 用 JSX,有点像函数式编程的风格,Vue 用模板语法,更像普通的 HTML。状态管理上,React 一般用 Redux 啥的,Vue 有自己的 Vuex。组件化方面都能组件化开发,不过做法有点不一样。学习起来呢,Vue 可能容易点,React 得花点功夫。