站长资讯网
最全最丰富的资讯网站

React必知必会的35个面试题

React必知必会的35个面试题

问题1:什么是虚拟DOM?

主题: React
难度: ⭐

虚拟 DOM (VDOM)是真实 DOM 在内存中的表示。UI 的表示形式保存在内存中,并与实际的 DOM 同步。这是一个发生在渲染函数被调用和元素在屏幕上显示之间的步骤,整个过程被称为调和

问题2:类组件和函数组件之间的区别是啥?

主题: React
难度: ⭐⭐

  • 类组件可以使用其他特性,如状态 state 和生命周期钩子。
  • 当组件只是接收 props 渲染到页面时,就是无状态组件,就属于函数组件,也被称为哑组件或展示组件。

函数组件和类组件当然是有区别的,而且函数组件的性能比类组件的性能要高,因为类组件使用的时候要实例化,而函数组件直接执行函数取返回结果即可。为了提高性能,尽量使用函数组件。

区别 函数组件 类组件
是否有 this 没有
是否有生命周期 没有
是否有状态 state 没有

问题 3:React 中 refs 干嘛用的?

主题: React
难度: ⭐⭐

Refs 提供了一种访问在render方法中创建的 DOM 节点或者 React 元素的方法。在典型的数据流中,props 是父子组件交互的唯一方式,想要修改子组件,需要使用新的pros重新渲染它。凡事有例外,某些情况下咱们需要在典型数据流外,强制修改子代,这个时候可以使用 Refs

咱们可以在组件添加一个 ref 属性来使用,该属性的值是一个回调函数,接收作为其第一个参数的底层 DOM 元素或组件的挂载实例。

class UnControlledForm extends Component {   handleSubmit = () => {     console.log("Input Value: ", this.input.value)   }   render () {     return (       <form onSubmit={this.handleSubmit}>         <input           type='text'           ref={(input) => this.input = input} />         <button type='submit'>Submit</button>       </form>     )   } }

请注意,input 元素有一个ref属性,它的值是一个函数。该函数接收输入的实际 DOM 元素,然后将其放在实例上,这样就可以在 handleSubmit 函数内部访问它。

经常被误解的只有在类组件中才能使用 refs,但是refs也可以通过利用 JS 中的闭包与函数组件一起使用。

function CustomForm ({handleSubmit}) {   let inputElement   return (     <form onSubmit={() => handleSubmit(inputElement.value)}>       <input         type='text'         ref={(input) => inputElement = input} />       <button type='submit'>Submit</button>     </form>   ) }

问题 4:在 React 中如何处理事件

主题: React
难度: ⭐⭐

为了解决跨浏览器的兼容性问题,SyntheticEvent 实例将被传递给你的事件处理函数,SyntheticEvent是 React 跨浏览器的浏览器原生事件包装器,它还拥有和浏览器原生事件相同的接口,包括 stopPropagation()preventDefault()

比较有趣的是,React 实际上并不将事件附加到子节点本身。React 使用单个事件侦听器侦听顶层的所有事件。这对性能有好处,也意味着 React 在更新 DOM 时不需要跟踪事件监听器。

问题 5:state 和 props 区别是啥?

主题: React
难度: ⭐⭐

propsstate是普通的 JS 对象。虽然它们都包含影响渲染输出的信息,但是它们在组件方面的功能是不同的。即

  • state 是组件自己管理数据,控制自己的状态,可变;
  • props 是外部传入的数据参数,不可变;
  • 没有state的叫做无状态组件,有state的叫做有状态组件;
  • 多用 props,少用 state,也就是多写无状态组件。

问题 6:如何创建 refs

主题: React
难度: ⭐⭐

Refs 是使用 React.createRef() 创建的,并通过 ref 属性附加到 React 元素。在构造组件时,通常将 Refs 分配给实例属性,以便可以在整个组件中引用它们。

class MyComponent extends React.Component {   constructor(props) {     super(props);     this.myRef = React.createRef();   }   render() {     return <p ref={this.myRef} />;   } }

或者这样用:

class UserForm extends Component {   handleSubmit = () => {     console.log("Input Value is: ", this.input.value)   }   render () {     return (       <form onSubmit={this.handleSubmit}>         <input           type='text'           ref={(input) => this.input = input} /> // Access DOM input in handle submit         <button type='submit'>Submit</button>       </form>     )   } }

问题 7:什么是高阶组件?

主题: React
难度: ⭐⭐

高阶组件(HOC)是接受一个组件并返回一个新组件的函数。基本上,这是一个模式,是从 React 的组合特性中衍生出来的,称其为纯组件,因为它们可以接受任何动态提供的子组件,但不会修改或复制输入组件中的任何行为。

const EnhancedComponent = higherOrderComponent(WrappedComponent);

HOC 可以用于以下许多用例

  • 代码重用、逻辑和引导抽象
  • 渲染劫持
  • state 抽象和操作
  • props 处理

问题 8:在构造函数调用 super 并将 props 作为参数传入的作用是啥?

主题: React
难度: ⭐⭐

在调用 super() 方法之前,子类构造函数无法使用this引用,ES6 子类也是如此。将 props 参数传递给 super() 调用的主要原因是在子构造函数中能够通过this.props来获取传入的 props

传递 props

class MyComponent extends React.Component {   constructor(props) {     super(props);     console.log(this.props);  // { name: 'sudheer',age: 30 }   } }

没传递 props

class MyComponent extends React.Component {   constructor(props) {     super();     console.log(this.props); // undefined     // 但是 Props 参数仍然可用     console.log(props); // Prints { name: 'sudheer',age: 30 }   }    render() {     // 构造函数外部不受影响     console.log(this.props) // { name: 'sudheer',age: 30 }   } }

上面示例揭示了一点。props 的行为只有在构造函数中是不同的,在构造函数之外也是一样的。

问题 9:什么是控制组件?

主题: React
难度: ⭐⭐⭐

在 HTML 中,表单元素如 <input><textarea><select>通常维护自己的状态,并根据用户输入进行更新。当用户提交表单时,来自上述元素的值将随表单一起发送。

而 React 的工作方式则不同。包含表单的组件将跟踪其状态中的输入值,并在每次回调函数(例如onChange)触发时重新渲染组件,因为状态被更新。以这种方式由 React 控制其值的输入表单元素称为受控组件

问题 10:如何 React.createElement ?

主题: React
难度: ⭐⭐⭐

问题:

const element = (   <h1 className="greeting">     Hello, world!   </h1> )

上述代码如何使用 React.createElement 来实现:

const element = React.createElement(   'h1',   {className: 'greeting'},   'Hello, world!' );

问题 11:讲讲什么是 JSX ?

主题: React
难度: ⭐⭐⭐

Facebook 第一次发布 React 时,他们还引入了一种新的 JS 方言 JSX,将原始 HTML 模板嵌入到 JS 代码中。JSX 代码本身不能被浏览器读取,必须使用Babelwebpack等工具将其转换为传统的JS。很多开发人员就能无意识使用 JSX,因为它已经与 React 结合在一直了。

class MyComponent extends React.Component {   render() {     let props = this.props;       return (       <p className="my-component">       <a href={props.url}>{props.name}</a>       </p>     );   } }

问题 12:根据下面定义的代码,可以找出存在的两个问题吗 ?

主题: React
难度: ⭐⭐⭐

请看下面的代码:

React必知必会的35个面试题

答案:

1.在构造函数没有将 props 传递给 super,它应该包括以下行

constructor(props) {   super(props);   // ... }

2.事件监听器(通过addEventListener()分配时)的作用域不正确,因为 ES6 不提供自动绑定。因此,开发人员可以在构造函数中重新分配clickHandler来包含正确的绑定:

constructor(props) {   super(props);   this.clickHandler = this.clickHandler.bind(this);   // ... }

问题 13:为什么不直接更新 state 呢 ?

主题: React
难度: ⭐⭐⭐

如果试图直接更新 state ,则不会重新渲染组件。

 // 错误  This.state.message = 'Hello world';

需要使用setState()方法来更新 state。它调度对组件state对象的更新。当state改变时,组件通过重新渲染来响应:

// 正确做法 This.setState({message: ‘Hello World’});

问题 14:React 组件生命周期有哪些不同阶段?

主题: React
难度: ⭐⭐⭐

在组件生命周期中有四个不同的阶段:

  1. Initialization:在这个阶段,组件准备设置初始化状态和默认属性。
  2. Mounting:react 组件已经准备好挂载到浏览器 DOM 中。这个阶段包括componentWillMountcomponentDidMount生命周期方法。
  3. Updating:在这个阶段,组件以两种方式更新,发送新的 props 和 state 状态。此阶段包括shouldComponentUpdatecomponentWillUpdatecomponentDidUpdate生命周期方法。
  4. Unmounting:在这个阶段,组件已经不再被需要了,它从浏览器 DOM 中卸载下来。这个阶段包含 componentWillUnmount 生命周期方法。

除以上四个常用生命周期外,还有一个错误处理的阶段:

Error Handling:在这个阶段,不论在渲染的过程中,还是在生命周期方法中或是在任何子组件的构造函数中发生错误,该组件都会被调用。这个阶段包含了 componentDidCatch 生命周期方法。

React必知必会的35个面试题

问题 15:React 的生命周期方法有哪些?

主题: React
难度: ⭐⭐⭐

  • componentWillMount:在渲染之前执行,用于根组件中的 App 级配置。
  • componentDidMount:在第一次渲染之后执行,可以在这里做AJAX请求,DOM 的操作或状态更新以及设置事件监听器。
  • componentWillReceiveProps:在初始化render的时候不会执行,它会在组件接受到新的状态(Props)时被触发,一般用于父组件状态更新时子组件的重新渲染
  • shouldComponentUpdate:确定是否更新组件。默认情况下,它返回true。如果确定在 stateprops 更新后组件不需要在重新渲染,则可以返回false,这是一个提高性能的方法。
  • componentWillUpdate:在shouldComponentUpdate返回 true 确定要更新组件之前件之前执行。
  • componentDidUpdate:它主要用于更新DOM以响应propsstate更改。
  • componentWillUnmount:它用于取消任何的网络请求,或删除与组件关联的所有事件监听器。

问题 16:这三个点(…)在 React 干嘛用的?

主题: React
难度: ⭐⭐⭐

... 在React(使用JSX)代码中做什么?它叫什么?

<Modal {...this.props} title='Modal heading'  animation={false}/>

这个叫扩展操作符号或者展开操作符,例如,如果this.props包含a:1b:2,则

<Modal {...this.props} title='Modal heading' animation={false}>

等价于下面内容:

<Modal a={this.props.a} b={this.props.b} title='Modal heading' animation={false}>

扩展符号不仅适用于该用例,而且对于创建具有现有对象的大多数(或全部)属性的新对象非常方便,在更新state 咱们就经常这么做:

this.setState(prevState => {     return {foo: {...prevState.foo, a: "updated"}}; });

问题 17:使用 React Hooks 好处是啥?

主题: React
难度: ⭐⭐⭐

首先,Hooks 通常支持提取和重用跨多个组件通用的有状态逻辑,而无需承担高阶组件或渲染 props 的负担。Hooks 可以轻松地操作函数组件的状态,而不需要将它们转换为类组件。

Hooks 在类中不起作用,通过使用它们,咱们可以完全避免使用生命周期方法,例如 componentDidMountcomponentDidUpdatecomponentWillUnmount。相反,使用像useEffect这样的内置钩子。

问题 18:什么是 React Hooks?

主题: React
难度: ⭐⭐⭐

Hooks是 React 16.8 中的新添加内容。它们允许在不编写类的情况下使用state和其他 React 特性。使用 Hooks,可以从组件中提取有状态逻辑,这样就可以独立地测试和重用它。Hooks 允许咱们在不改变组件层次结构的情况下重用有状态逻辑,这样在许多组件之间或与社区共享 Hooks 变得很容易。

问题 19:React 中的 useState() 是什么?

主题: React
难度: ⭐⭐⭐

下面说明useState(0)的用途:

... const [count, setCounter] = useState(0); const [moreStuff, setMoreStuff] = useState(...); ...  const setCount = () => {     setCounter(count + 1);     setMoreStuff(...);     ... };

useState 是一个内置的 React Hook。useState(0) 返回一个元组,其中第一个参数count是计数器的当前状态,setCounter 提供更新计数器状态的方法。

咱们可以在任何地方使用setCounter方法更新计数状态-在这种情况下,咱们在setCount函数内部使用它可以做

赞(0)
分享到: 更多 (0)

网站地图   沪ICP备18035694号-2    沪公网安备31011702889846号