什么是 React?React 是什么样的框架?

React 是一个用于构建用户界面的 JavaScript 库。它由 Facebook 开发,被认为是 MV* 模式中 V(视图)层的一部分。React 的核心思想是组件化编程,通过将应用切分成多个组件,开发者可以更 小而简单地管理代码,并且复用性更高。

React有什么优缺点?

优点:

  • 高效:React使用虚拟DOM技术,可以最小化DOM操作,提高性能。
  • 可重用性:React组件可以被设计为可重用的,使代码更加整洁。
  • 易于学习:React的API相对简单,使其易于学习和使用。
  • 生态系统:因为React是一个颇受欢迎的库,所以有很多第三方工具和库可以与之配合。

缺点:

  • 复杂性:虽然React本身很简单,但是当应用程序变得复杂时,需要使用其他工具和库来管理状态和数据流。
  • 初始学习曲线:对于没有经验的开发人员来说,可能需要花费一些时间来理解React的基本概念和工作原理。
  • 灵活性:由于React遵循一些特定的模式和最佳实践,因此在某些情况下可能会限制您的代码结构和逻辑。 

什么是 JSX?

JSX(JavaScript XML) 是一种 JavaScript 的语法扩展,是 React 创建虚拟 DOM 的一种方式。它允许我们在 JavaScript 代码中嵌入 HTML 标记,简化了视图层的编写。

为什么使用类组件?

在 React 16.8 以前,类组件是唯一支持状态(state)和生命周期方法的组件类型。如果需要在组件中处理复杂的业务逻辑,并且需要访问和修改组件的状态,建议使用类组件。

什么是函数组件?

函数组件是 React 16.8 后添加的新特性,它可以像类组件一样实现 UI 功能,但没有 state 和生命周期方法。函数组件通常比类组件更简洁,性能也更好。在无需在组件中处理复杂业务逻辑或访问组件状态时,建议使用函数组件。

React中的状态是什么?

状态是维护React组件内部的数据的一种方法。它由组件自己管理,并可以随时间进行更改。它是一个对象,包含组件数据的任何属性。

React 中的组件和 props 是如何工作的?

React 组件是独立、可复用且功能完整的代码单元,负责渲染 UI 界面并处理用户事件。组件通常包括两种类型:函数组件(Functional Components)和类组件(Class Components)。Props 是父组件传递给子组件的数据,可以是任何类型的数据,包括字符串、数字、对象甚至组件等。当父组件的状态或属性变化时,在渲染子组件时会自动传递最新的数据。 

setState 方法如何工作?

调用 setState 方法会触发 React 的更新机制。React 会将新的状态添加到一个队列中,并通过一些优化策略批量处理多个 setState 的请求,然后开始执行更新阶段。在更新阶段,React 会重新渲染组件,并根据新的状态计算出新的虚拟 DOM 和 UI 输出。

什么是 props?

props 是从父组件传递给子组件的数据,它是只读的、不可变的。通过 props 访问和修改数据可以有效避免意料不到的副作用和数据冲突。

什么是组件生命周期?

组件生命周期指的是组件在实例化过程中所经历的一系列活动或事件,包括挂载、更新和卸载三个阶段。每个阶段都有一些钩子函数,可以在特定的时期做一些对应的操作,例如初始化 state、发送网络请求、释放资源等。

React 生命周期大致分为三个阶段:挂载(Mounting)、更新(Updating)和卸载(Unmounting)。

  • Mounting(装载):当组件被插入到 DOM 中时触发。

    • constructor
    • getDerivedStateFromProps
    • render
    • componentDidMount
  • Updating(更新):当组件重新渲染时触发。

    • getDerivedStateFromProps
    • shouldComponentUpdate
    • render
    • getSnapshotBeforeUpdate
    • componentDidUpdate
  • Unmounting(卸载):当组件从 DOM 中删除时触发。

    • componentWillUnmount
  • Error Handling(错误处理): 当组件内部发生未捕获异常时触发

    • static getDerivedStateFromError()
    • componentDidCatch()

React 中的受控组件和非受控组件有什么区别?

受控组件指的是输入表单元素的值(如文本框、下拉列表、单选按钮等)被 React 组件的状态(state)所控制,适用于需要对用户输入进行校验或处理的场景。非受控组件则是相反的,其值是由 DOM 元素本身维护,组件只需通过 ref 属性来访问该元素的值即可,适用于简单的表单处理。

如何处理 React 组件之间的通信?

通过 props 和状态(state)来进行组件之间的通信。父组件可以将数据或函数作为 props 传递给子组件,子组件也可以通过回调函数将数据向上传递给父组件。如果两个兄弟组件需要通信,则可以通过共同的父组件来实现它们之间的通信,即将数据或回调函数从父组件一次性传递给兄弟组件。

什么是虚拟 DOM?与实际 DOM 有什么区别?

虚拟 DOM(Virtual DOM)是 React 中一个重要的概念,它本质上是一个轻量级的 JavaScript 对象,代表着真正的 DOM 树,并且可以通过比较两个虚拟 DOM 的差异来进行高效地更新 DOM。相比真实的 DOM,虚拟 DOM 更加高效、轻量并且不会直接操作真实的 DOM,从而减少了浏览器的性能消耗及页面重新渲染的时间。

如何渲染服务器端的 React 应用?什么是服务器端渲染?

服务器端渲染 (Server-Side Rendering,简称 SSR) 是指将 React 应用程序的 HTML 渲染过程从浏览器移动到服务器上。在传统的浏览器端渲染中,React 代码是在客户端的 JavaScript 引擎中执行并生成 HTML 结构。而在服务器端渲染中,React 组件被渲染成标记字符串,然后直接发送给浏览器。

实现服务器端渲染有很多不同的方式,其中一个常见的方法是使用 Node.js 的 Express 框架来创建服务器。在这种情况下,服务器会拦截来自浏览器的请求,并在触发 React 代码之前先渲染出需要返回给浏览器的初始 HTML。

在 React 中,可以使用 ReactDOM 服务器渲染 API 来执行渲染过程。这个 API 同样也可以在 Node.js 等环境中工作,它可以为任何需要处理 React 组件的服务器提供支持。

在使用服务器端渲染时,开发人员必须注意性能和安全。由于渲染过程发生在服务器上,因此在每次渲染时都需要处理 React 组件的内容。这可能会对服务器造成压力,并导致潜在的性能问题。而关于安全方面则需要使用适当的措施来防止潜在的 XSS 攻击。

何时使用 Class Components 和 Function Components?

在 React v16.8 之前,Class Components 是唯一能够支持状态管理和生命周期方法的类型。然而,自 React 16.8 版本发布以来,Hooks 技术已成为函数组件和 Class Components 共存的方法。现在,Function Components 中可以利用 Hooks 来进行更好的状态管理和更灵活的代码组织。因此,现在建议使用纯 Function Components。

什么是 Virtual DOM?

Virtual DOM(虚拟 DOM)是一种轻量级的 JavaScript 数据结构,用于表示真实 DOM 的备份。React 使用 Virtual DOM 提高性能,其核心思想是通过高效地比较 Virtual DOM 的更新来实现真正 DOM 的最小化操作。

当 React 组件数据发生变化时,React 会首先生成新的 Virtual DOM。React 然后根据新旧 Virtual DOM 的差异,计算出需要更新的部分,并仅更新那些发生了变化的部分,以达到提高渲染性能的目的。

什么是事件合成(SyntheticEvent)?

React 为跨浏览器兼容性和性能考虑提供了一种称为“合成事件”的机制。如果你熟悉原始DOM事件模型,如 onClick、onFocus 等,则可以将 SyntheticEvent 视为简化版的事件对象。SyntheticEvent 具有类似于 native browser event 的数据结构,但同时使您可以保证可移植性和性能。

如何使用 React 表单?

表单是 Web 应用程序的常见组件之一,React 也对其进行了显式支持。要在 React 中创建一个表单,您需要使用以下组件:

  • form:该组件在 React 中是非必需的,因为它仅处理一些原生事件并将其委托给适当的子组件。

  • input:用于用户输入数据。常见的 input 属性包括 type、name、value 等。

  • textarea:用于多行文本输入。

  • select:用于创建下拉框和单选按钮。它通过将 selected 属性设置为与 option 元素的 value 属性相匹配的值来确定哪个选项被选中。  

如何利用React组件之间传递数据 

        React 将传递数据到某一组件的技术称为“props”,这是一个特殊的对象,通常由父组件向子组件传递。在父组件中,可以通过 component props 来实例化子组件并将属性传递给 child,其中属性名就是要传递的数据的名称。如下所示: 

class ParentComponent extends Component {
  render() {
    return (
      <ChildComponent propName={"example value"} />
    )
  }
}
class ChildComponent extends Component {
  render() {
    return (
      <p>{this.props.propName}</p>
    )
  }
}

React 中的 key 属性有什么作用? 

key 是一个唯一标识符,在列表渲染中使用。它允许 React 跟踪每个子元素的状态更改并减少 DOM 更新的数量。在列表中添加、删除或重新排序时,使用 key 可以帮助 React 更方便地确定哪些元素需要进行添加、删除或更新。

Redux是什么?

Redux是一个用于管理React应用程序状态的JavaScript库。它通过提供一个单一的全局状态管理存储库,使得在应用程序中跨组件共享数据和状态变得更加容易。

什么是HOC?

HOC(高阶组件)是React的一种模式,用于包装现有组件并添加新的功能。它是一个函数,接受一个组件作为输入,并返回一个新的经过修改的组件。HOC允许您通过添加新功能来扩展现有组件,例如登录验证或API调用。

什么是 React Router?

React Router 是 React 应用程序的一种常用路由解决方案。它是一个基于 React.js 的第三方库,用来管理应用程序的不同 URL 地址和响应用户在浏览器地址栏中输入或点击链接时的变化。

使用 React Router,您可以实现单页应用程序(SPA)的路由功能,使用户不必每次加载页面都完全重新加载整个应用程序。相反,不同的页面及其组件可以通过向用户提供动态 URL 以及在浏览器地址栏中添加哈希或历史记录等方式而实现无需超过问题,保持了良好的用户体验。

React Router 提供了多种路由规则,并与 React 组件的概念紧密集成在一起,使得页面之间的切换和数据共享更加直观。React Router 还支持嵌套路由,其中嵌套的组件可以在自己的上下文中处理参数和状态的变化。

总而言之,React Router 已经成为了 React 生态系统中的重要成分,对于利用 React 构建具有多页和单页混合的应用有着非常大的价值。

在 React 中如何处理事件?如何绑定事件处理函数并传递参数?

在 React 中处理事件和在普通的 HTML 中处理事件有些不同,但是基本思路相似。React 的事件处理方式的主要不同之处是,它使用了自己的事件系统,而不是 DOM 原生的事件处理方式。

要处理事件,需要在组件中定义一个事件处理函数,并将其绑定到相应的元素上。事件处理函数以 event 作为参数,并且最好使用箭头函数或者 bind() 方法来确保 this 的正确性。

React 中如何进行条件渲染和列表渲染?

条件渲染可以使用三目运算符或者if语句来进行实现。

列表渲染可以使用map方法来进行实现。我们使用map方法将items数组中的每个元素都转成了一个li标签,然后将这些标签都添加到了一个数组中。最后渲染这个数组即可。需要注意的是,需要给每一个li标签设置一个key属性来帮助React进行优化。

React 性能优化有哪些技巧?如何提高React应用程序的性能?

React 性能优化是一个复杂和综合的主题,以下是一些常用的技巧和方法,来提高 React 应用程序的性能:

  1. 减少不必要的重新渲染:使用 shouldComponentUpdate() 生命周期函数来避免组件不必要的重渲染。在该函数中可以进行状态比较,当新旧状态不同才会执行重新渲染,否则跳过。

  2. 将长列表分割为更小的子列表: 将长列表分割成更小的子列表,并仅对可见区域进行渲染,以避免不必要的大规模渲染。

  3. 避免在 render() 函数中创建新的对象: 每次调用 render() 函数都会创建新的对象和引用,这亦影响到后面的垃圾回收。应将组件复杂或者需要在 render() 函数中不断创建的依赖项移到 state 属性外部或其他类级别上。

  4. 使用合适的事件处理机制: 当使用高频事件如输入框时,可以考虑使用函数节流、防抖等方式来控制触发的次数或者在 componentWillUnmount 生命周期中清理 event Handler 以防止内存泄漏。

  5. 在客户端缓存一些数据: 将通用的数据提供给客户端,使其可以访问它而不必从服务器获取数据,来提高应用的响应速度。

  6. 使用 Webpack 或者其他打包器: 可以使用 webpack 或类似的工具来减小 JavaScript 的体积和数量,从而加快应用的加载速度。

  7. 按需加载组件:只在需要时才加载组件可以有效减少加载时间。React.lazy 和 Suspense 可以达到这一目的。

上述是 React 性能优化的一些主要技巧和方法,这样我们就可以优化我们 React 应用程序的性能,并且让它更具有响应式和互动性!

 

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。