1、React 有哪些核心特性?
答:React是一个用于构建用户界面的JS库,它的核心特性有以下几个方面:
- 组件化(Component-based)
React强调将 UI 拆分为独立、可复用的组件,每个组件拥有自己的状态和生命周期,便于维护和扩展。
- JSX(JavaScript XML)
React使用JSX语法,使开发者能在JavaScript中以声明的方式编写构清晰的UI代码,本质上是React.createElement()语法糖。
- 虚拟 DOM(Virtual DOM)
React使用虚拟DOM来提升性能,状态变更不会立即操作真实DOM,而是先在内存中构建新的虚拟DOM树,然后通过Diff算法找出差异,最后批量更新真实DOM。
- 单向数据流(Unidirectional Data Flow)
- 数据通过
props自上而下流动,子组件通过回调通知父组件,实现数据的单向管理。这种方式有利于组件间的数据跟踪和状态管理。
- 数据通过
- Hooks(函数组件状态管理)
React16.8引入 Hooks,使函数组件具备状态和副作用管理能力,常见的有useState、useEffect、useMemo等,大大简化了组件逻辑复用和代码结构。
- 声明式编程(Declarative UI)
- 开发者只需要描述”界面在某种状态下应该呈现的样子“,
React会负责根据状态自动更新视图,使UI与状态保持同步。
- 开发者只需要描述”界面在某种状态下应该呈现的样子“,
- Context API(全局状态共享)
- 用于在组件树中共享全局数据(如主题、用户信息),避免多层
props传递,是Redux等第三方状态库的轻量替代方案之一。
- 用于在组件树中共享全局数据(如主题、用户信息),避免多层
2、React 和 Vue 的区别?
- 语法风格不同
- React 使用 JSX,所有模版写在 JS 中,灵活但不直观
- Vue 使用 HTML 模板 + 指令(如 v-if, v-for),更接近原生的 HTML,入门更快。
- 响应式原理不同
- Vue3 使用 Proxy 自动追踪依赖变化(响应式系统天然具备细粒度更新)。
- React 中状态更新需显式调用
setState或useState,更新是全量触发 render,再通过虚拟 DOM diff 判断变更。
- 状态管理
- Vue 有官方的 Vuex / Pinia
- React 状态管理依赖第三方:Redux、Zustand、Recoil,但更灵活。
- Hooks vs Options API
- React 使用 Hook 编程(useState, useEffect 等),灵活但可能“Hook 地狱”。
- Vue 2 用 Options API(清晰分区),Vue 3 引入 Composition API(更像 React Hook,但可组合性更强)。
- 生态和工程化
- React 更偏向库(library):提供视图层 + hook,其它功能靠你搭建(例如:状态管理、请求库、路由)。
- Vue 是框架(framework):官方提供全套(Vue Router, Vuex, Vue CLI),上手快,适合中小团队。
3、React 生命周期有哪些?
答:React生命周期方法最初是为类组件(Class Component)设计的。主要分为三大阶段:挂载、更新、卸载。
- 挂载阶段(Mounting):组件被创建并插入 DOM 时调用
constructor():初始化 state 和绑定方法;static getDerivedStateFromProps(props,state):根据props派生state,极少用,不推荐滥用render():必须的函数,返回 JSXcomponentDidMount():DOM 渲染完毕后调用,适合发请求、设置订阅等副作用操作,之前是这个componentWillMount()已弃用
- 更新阶段(Updating):组件的 props 或 state 变化时触发
static getDerivedStateFromProps():同挂载阶段shouldComponentUpdate(nextProps,nextState):决定是否更新(优化性能),之前是这个componentWillReceiveProps(nextProps)已弃用render():再次调用以更新 DOMgetSnapshotBeforeUpdate(prevProps,prevState):记录更新前的信息(如滚动位置),之前是这个componentWillUpdate(nextProps, nextState)已弃用componentDidUpdate(prevProps,prevState,snapshot):组件更新后调用,适合 DOM 操作或再次请求
- 卸载阶段(Unmounting)
componentWillUnmount():清理副作用,如清除定时器、取消订阅等
- 错误处理(Error Handling):捕获子组件中的错误
static getDerivedStateFromError(error):渲染备用 UIcomponentDidCatch(error, info):用于错误日志收集等