• React高频面试题(附答案)


    React面试题视频讲解:点击学习

    key改了,会发生什么,会执行哪些周期函数?

    在开发过程中,我们需要保证某个元素的 key 在其同级元素中具有唯一性。在 React Diff 算法中 React 会借助元素的 Key 值来判断该元素是新近创建的还是被移动而来的元素,从而减少不必要的元素重渲染。此外,React 还需要借助 Key 值来判断元素与本地状态的关联关系,因此我们绝不可忽视转换函数中 Key 的重要性。

    答:componentWillMount componentDidMount render

    你对【单一数据源】有什么理解

    redux使用 store将程序的整个状态存储在同一个地方,因此所有组件的状态都存储在 Store 中,并且它们从 Store 本身接收更新。单一状态树可以更容易地跟踪随时间的变化,并调试或检查程序

    refs 是什么

    • refs是react中引用的简写,有主语存储特定 React 元素或组件的引用的属性,它将由组件渲染配置函数返回

    • 当我们需要输入框的内容,触发动画等时候可以使用refs

    如何在 ReactJS 的 Props上应用验证?

    当应用程序在开发模式下运行时,React 将自动检查咱们在组件上设置的所有 props,以确保它们具有正确的数据类型。对于不正确的类型,开发模式下会在控制台中生成警告消息,而在生产模式中由于性能影响而禁用它。强制的 propsisRequired定义的。
    下面是一组预定义的 prop 类型:

    • React.PropTypes.string

    • React.PropTypes.number

    • React.PropTypes.func

    • React.PropTypes.node

    • React.PropTypes.bool
      例如,咱们为用户组件定义了如下的propTypes

      import PropTypes from "prop-types";
      class User extends React.Component {
        render() {
          return (
            <>
              <h1>Welcome, {this.props.name}</h1>
              <h2>Age, {this.props.age}</h2>
            </>
          );
        }
      }
      
      User.propTypes = {
        name: PropTypes.string.isRequired,
        age: PropTypes.number.isRequired,
      };
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16

    使用状态要注意哪些事情?
    要注意以下几点。

    • 不要直接更新状态

    • 状态更新可能是异步的

    • 状态更新要合并。

    • 数据从上向下流动

    组件通信的方式有哪些

    • ⽗组件向⼦组件通讯: ⽗组件可以向⼦组件通过传 props 的⽅式,向⼦组件进⾏通讯
    • ⼦组件向⽗组件通讯: props+回调的⽅式,⽗组件向⼦组件传递props进⾏通讯,此props为作⽤域为⽗组件⾃身的函 数,⼦组件调⽤该函数,将⼦组件想要传递的信息,作为参数,传递到⽗组件的作⽤域中
    • 兄弟组件通信: 找到这两个兄弟节点共同的⽗节点,结合上⾯两种⽅式由⽗节点转发信息进⾏通信
    • 跨层级通信: Context 设计⽬的是为了共享那些对于⼀个组件树⽽⾔是“全局”的数据,例如当前认证的⽤户、主题或⾸选语⾔,对于跨越多层的全局数据通过 Context 通信再适合不过
    • 发布订阅模式: 发布者发布事件,订阅者监听事件并做出反应,我们可以通过引⼊event模块进⾏通信
    • 全局状态管理⼯具: 借助Redux或者Mobx等全局状态管理⼯具进⾏通信,这种⼯具会维护⼀个全局状态中⼼Store,并根据不同的事件产⽣新的状态

    state 和 props 触发更新的生命周期分别有什么区别?

    state 更新流程: 这个过程当中涉及的函数:

    1. shouldComponentUpdate: 当组件的 state 或 props 发生改变时,都会首先触发这个生命周期函数。它会接收两个参数:nextProps, nextState——它们分别代表传入的新 props 和新的 state 值。拿到这两个值之后,我们就可以通过一些对比逻辑来决定是否有 re-render(重渲染)的必要了。如果该函数的返回值为 false,则生命周期终止,反之继续;

    注意:此方法仅作为性能优化的方式而存在。不要企图依靠此方法来“阻止”渲染,因为这可能会产生 bug。应该考虑使用内置的 PureComponent 组件,而不是手动编写 shouldComponentUpdate()

    1. componentWillUpdate:当组件的 state 或 props 发生改变时,会在渲染之前调用 componentWillUpdate。componentWillUpdate 是 React16 废弃的三个生命周期之一。过去,我们可能希望能在这个阶段去收集一些必要的信息(比如更新前的 DOM 信息等等),现在我们完全可以在 React16 的 getSnapshotBeforeUpdate 中去做这些事;
    2. componentDidUpdate:componentDidUpdate() 会在UI更新后会被立即调用。它接收 prevProps(上一次的 props 值)作为入参,也就是说在此处我们仍然可以进行 props 值对比(再次说明 componentWillUpdate 确实鸡肋哈)。

    props 更新流程: 相对于 state 更新,props 更新后唯一的区别是增加了对 componentWillReceiveProps 的调用。关于 componentWillReceiveProps,需要知道这些事情:

    • componentWillReceiveProps:它在Component接受到新的 props 时被触发。componentWillReceiveProps 会接收一个名为 nextProps 的参数(对应新的 props 值)。该生命周期是 React16 废弃掉的三个生命周期之一。在它被废弃前,可以用它来比较 this.props 和 nextProps 来重新setState。在 React16 中,用一个类似的新生命周期 getDerivedStateFromProps 来代替它。

    React中可以在render访问refs吗?为什么?

    <>
      <span id="name" ref={this.spanRef}>{this.state.title}</span>
      <span>{     this.spanRef.current ? '有值' : '无值'  }</span>
    </>
    复制代码
    
    • 1
    • 2
    • 3
    • 4
    • 5

    不可以,render 阶段 DOM 还没有生成,无法获取 DOM。DOM 的获取需要在 pre-commit 阶段和 commit 阶段: imagepng

    对 React-Intl 的理解,它的工作原理?

    React-intl是雅虎的语言国际化开源项目FormatJS的一部分,通过其提供的组件和API可以与ReactJS绑定。

    React-intl提供了两种使用方法,一种是引用React组件,另一种是直接调取API,官方更加推荐在React项目中使用前者,只有在无法使用React组件的地方,才应该调用框架提供的API。它提供了一系列的React组件,包括数字格式化、字符串格式化、日期格式化等。

    在React-intl中,可以配置不同的语言包,他的工作原理就是根据需要,在语言包之间进行切换。

    对有状态组件和无状态组件的理解及使用场景

    (1)有状态组件

    特点:

    • 是类组件
    • 有继承
    • 可以使用this
    • 可以使用react的生命周期
    • 使用较多,容易频繁触发生命周期钩子函数,影响性能
    • 内部使用 state,维护自身状态的变化,有状态组件根据外部组件传入的 props 和自身的 state进行渲染。

    使用场景:

    • 需要使用到状态的。
    • 需要使用状态操作组件的(无状态组件的也可以实现新版本react hooks也可实现)

    总结: 类组件可以维护自身的状态变量,即组件的 state ,类组件还有不同的生命周期方法,可以让开发者能够在组件的不同阶段(挂载、更新、卸载),对组件做更多的控制。类组件则既可以充当无状态组件,也可以充当有状态组件。当一个类组件不需要管理自身状态时,也可称为无状态组件。

    (2)无状态组件 特点:

    • 不依赖自身的状态state
    • 可以是类组件或者函数组件。
    • 可以完全避免使用 this 关键字。(由于使用的是箭头函数事件无需绑定)
    • 有更高的性能。当不需要使用生命周期钩子时,应该首先使用无状态函数组件
    • 组件内部不维护 state ,只根据外部组件传入的 props 进行渲染的组件,当 props 改变时,组件重新渲染。

    使用场景:

    • 组件不需要管理 state,纯展示

    优点:

    • 简化代码、专注于 render
    • 组件不需要被实例化,无生命周期,提升性能。 输出(渲染)只取决于输入(属性),无副作用
    • 视图和数据的解耦分离

    缺点:

    • 无法使用 ref
    • 无生命周期方法
    • 无法控制组件的重渲染,因为无法使用shouldComponentUpdate 方法,当组件接受到新的属性时则会重渲染

    总结: 组件内部状态且与外部无关的组件,可以考虑用状态组件,这样状态树就不会过于复杂,易于理解和管理。当一个组件不需要管理自身状态时,也就是无状态组件,应该优先设计为函数组件。比如自定义的

  • 相关阅读:
    【Golang】golang使用三方SDK操作容器指南
    C#小白(基础篇)1 (变量、赋值运算符、常量、+号的作用、占位符的使用)
    线性表的应用 —— 单链表
    【Java-LangChain:使用 ChatGPT API 搭建系统-6】处理输入-链式 Prompt Chaining Prompts
    【CORS 报错】跨域请求问题:CORS 多种环境下的解决方案
    编写TypeScript的库
    hive数据倾斜(超详细)
    List与数组之间的相互转换
    链表中环的入口结点
    Java(十八)---单链表
  • 原文地址:https://blog.csdn.net/weixin_59558923/article/details/126006758