1. 什么是React?它的特点是什么?
React是一个用于构建用户界面的JavaScript库。其特点包括:
- 使用虚拟DOM实现高效更新
- 组件化开发,提高代码重用性和可维护性
- 单向数据流,简化状态管理
- JSX语法,将组件结构和逻辑放在一起
- 生态系统丰富,支持各种工具和库
2. 什么是JSX?
JSX是一种JavaScript的语法扩展,用于在React中编写UI组件。它看起来类似于HTML,但实际上是JavaScript。JSX使得在JavaScript代码中直接编写UI组件更加直观和简洁。
3. 什么是组件?类组件和函数组件有什么区别?
组件是React应用的构建块,用于封装UI元素及其功能。类组件是通过ES6中的class语法定义的组件,拥有状态和生命周期方法。函数组件是无状态的组件,通过函数声明定义,通常用于简单的UI呈现。
4. 什么是状态(state)和属性(props)在React中的作用?
- 状态(state): 是组件内部的数据,可以随着时间的变化而变化。通过调用
setState
方法来更新状态,触发UI的重新渲染。 - 属性(props):从父组件传递给子组件的数据,props是只读的,子组件不能直接修改props。组件接收props后可以根据props渲染不同的内容。
5. React组件之间如何通信?
1.父传子 :props; 2.子传父:props+回调的方式; 3.兄弟组件:父组件作为中间层拉实现数据互通;
4.跨层级:Context; 5.发布订阅模式:event; 6.全局状态管理:Redux
6. 何时用类组件( Class Component)?何时用功能组件(Functional Component)?
如果组件具有状态( state)或生命周期方法,请使用类组件;否则,使用功能组件。
其他:setState在react18之后都会表现为异步;创建一个异步函数(async...await 的方式)可支持 useEffect ;
memo 组件的 props 没有变化时,会直接复用组件的渲染结果,从而避免不必要的渲染。,为了避免不必要的计算,我们可以使用 useMemo 来缓存计算结果
7. React Router组件有哪些?
1.BrowserRouter、HashRouter : 路由模式history,hash
2.route: Route用于路径的匹配,然后进行组件的渲染
3.Link、NavLink:通常路径的跳转是使用Link组件 NavLink是在Link基础之上增加了一些样式属性,例如组件被选中时,发生样式变化 ( activeStyle , activeClassName )
4.redirect:路由重定向
5.switch:swich组件的作用适用于当匹配到第一个组件的时候,后面的组件就不应该继续匹配。
8. react有状态组件和无状态组件的区别与使用场景?
1.有状态组件(Stateful Component):
使用类组件定义,内部包含了状态(state),可以管理自身的状态。
使用this.state和this.setState管理状态。
适合需要管理或者响应状态变化的场景。
2.无状态组件(Stateless Component):
使用函数组件定义,不包含状态,仅根据传入的props渲染输出。
适合那些不需要管理状态、只根据外部数据渲染的场景。
9. 对Redux中间件的理解?原理?常用中间件有哪些?
Redux中,中间件就是放在就是在dispatch过程,在分发action进行拦截处理, 其本质上一个函数,对store.dispatch方法进行了改造,在发出 Action 和执行 Reducer 这两步之间,添加了其他功能。
实现原理:
applyMiddlewares的源码 中我们可以看到 ,所有中间件被放进了一个数组chain,然后嵌套执行,最后执行store.dispatch。可以看到,中间件内部(middlewareAPI)可以拿到getState和dispatch这两个方法
常用中间件:
redux-thunk:用于异步操作
redux-logger:用于日志记录
10. react生命周期?
a.组件挂载时
当组件实例被创建并插入DOM时,其生命周期调用顺序如下:
constructor()
static getDerivedStateFromProps()
render()
componentDidMount()
b.组件更新时
当组件的props或state发生变化时会触发更新。组件更新的生命周期调用顺序如下:
static getDerivedStateFromProps()
shouldComponentUpdate()
render()
getSnapshotBeforeUpdate()
componentDidUpdate()
c.组件卸载时
当组件从DOM中移除时会调用如下方法
componentWillUnmount()
11. React render方法的原理,在什么时候会触发?
原理:
在类组件中render函数指的就是render方法;而在函数组件中,指的就是整个函数组件
render函数中的jsx语句会被编译成我们熟悉的js代码,在render过程中,react将新调用的render函数返回的树与旧版本的树进行比较,这一步是决定如何更新 DOM 的必要步骤,然后进行 diff 比较,更新dom树
触发机:
类组件调用 setState 修改状态
函数组件通过useState hook修改状态
一旦执行了setState就会执行render方法,useState 会判断当前值有无发生改变确定是否执行render方法,一旦父组件发生渲染,子组件也会渲染。
12. React Hooks 在使用上有哪些限制?
- 不要在循环、条件或嵌套函数中调用 Hook;
- 在 React 的函数组件中调用 Hook。
13. 什么是React Hook?有哪些常用的Hook?
React Hook是React 16.8引入的功能,用于在无需编写类的情况下使用状态和其他React特性。常用的Hook包括:useState
、useEffect
、useContext
、useReducer
、useMemo
、useCallback
等。
useState
:用于管理功能组件中的状态。useEffect
:用于在功能组件中执行副作用,例如获取数据或订阅事件。useContext
:用于访问功能组件内的 React 上下文的值。useRef
:用于创建对跨渲染持续存在的元素或值的可变引用。useCallback
:用于记忆函数以防止不必要的重新渲染。useMemo
:用于记忆值,通过缓存昂贵的计算来提高性能。useReducer
:用于通过reducer函数管理状态,类似于Redux的工作原理。useLayoutEffect
:与useEffect类似,但效果在所有DOM突变后同步运行。
14. usecallback,usememo区别?
useCallback 用于缓存函数,以避免不必要的函数创建和渲染。当依赖项发生变化时,会返回一个新的函数引用,否则直接返回之前缓存的函数引用。
useMemo 用于缓存计算结果,以避免重复计算和渲染。当依赖项发生变化时,会重新计算并返回新的计算结果。
15. 什么是虚拟DOM?它的作用是什么?
虚拟DOM是React使用的一种技术,它是React元素的内存表示,与真实DOM对应。React通过比较虚拟DOM的变化来最小化DOM操作,从而提高性能。