• 高频react面试题自检


    fetch封装

    npm install whatwg-fetch --save  // 适配其他浏览器
    npm install es6-promise
    
    export const handleResponse = (response) => {
      if (response.status === 403 || response.status === 401) {
        const oauthurl = response.headers.get('locationUrl');
        if (!_.isEmpty(oauthUrl)) {
          window.location.href = oauthurl;
          return;
        }
      }
      if (!response.ok) {
        return getErrorMessage(response).then(errorMessage => apiError(response.status, errorMessage));
      }
      if (isJson(response)) {
        return response.json();
      }
      if (isText(response)) {
        return response.text();
      }
    
      return response.blob();
    };
    
    const httpRequest = {
      request: ({
        method, headers, body, path, query,
      }) => {
        const options = {};
        let url = path;
        if (method) {
          options.method = method;
        }
        if (headers) {
          options.headers = {...options.headers,...headers};
        }
        if (body) {
          options.body = body;
        }
        if (query) {
          const params = Object.keys(query)
            .map(k => `${k}=${query[k]}`)
            .join('&');
          url = url.concat(`?${params}`);
        }
        return fetch(url, Object.assign({}, options, { credentials: 'same-origin' })).then(handleResponse);
      },
    };
    
    export default httpRequest;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50

    react-router里的标签和标签有什么区别

    对比,Link组件避免了不必要的重渲染

    展示组件(Presentational component)和容器组件(Container component)之间有何不同

    展示组件关心组件看起来是什么。展示专门通过 props 接受数据和回调,并且几乎不会有自身的状态,但当展示组件拥有自身的状态时,通常也只关心 UI 状态而不是数据的状态。

    容器组件则更关心组件是如何运作的。容器组件会为展示组件或者其它容器组件提供数据和行为(behavior),它们会调用 Flux actions,并将其作为回调提供给展示组件。容器组件经常是有状态的,因为它们是(其它组件的)数据源。

    何为 redux

    Redux 的基本思想是整个应用的 state 保持在一个单一的 store 中。store 就是一个简单的 javascript 对象,而改变应用 state 的唯一方式是在应用中触发 actions,然后为这些 actions 编写 reducers 来修改 state。整个 state 转化是在 reducers 中完成,并且不应该有任何副作用。

    参考:前端react面试题详细解答

    怎么阻止组件的渲染

    在组件的 render 方法中返回 null 并不会影响触发组件的生命周期方法

    高阶组件

    高阶函数:如果一个函数接受一个或多个函数作为参数或者返回一个函数就可称之为高阶函数

    高阶组件:如果一个函数 接受一个或多个组件作为参数并且返回一个组件 就可称之为 高阶组件

    react 中的高阶组件

    React 中的高阶组件主要有两种形式:属性代理反向继承

    属性代理 Proxy

    • 操作 props
    • 抽离 state
    • 通过 ref 访问到组件实例
    • 用其他元素包裹传入的组件 WrappedComponent

    反向继承

    会发现其属性代理和反向继承的实现有些类似的地方,都是返回一个继承了某个父类的子类,只不过属性代理中继承的是 React.Component,反向继承中继承的是传入的组件 WrappedComponent

    反向继承可以用来做什么:

    1.操作 state

    高阶组件中可以读取、编辑和删除WrappedComponent组件实例中的state。甚至可以增加更多的state项,但是非常不建议这么做因为这可能会导致state难以维护及管理。

    function withLogging(WrappedComponent) {    
        return class extends WrappedComponent {    
            render() {    
                return (    
                    <div>;    
                        <h2>;Debugger Component Logging...<h2>;    
                        <p>;state:<p>;    
                        <pre>;{JSON.stringify(this.state, null, 4)}<pre>;    
                        <p>props:<p>;    
                        <pre>{JSON.stringify(this.props, null, 4)}<pre>;    
                        {super.render()}    
                    <div>;    
                );    
            }    
        };    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    2.渲染劫持(Render Highjacking)

    条件渲染通过 props.isLoading 这个条件来判断渲染哪个组件。

    修改由 render() 输出的 React 元素树

    对componentWillReceiveProps 的理解

    该方法当props发生变化时执行,初始化render时不执行,在这个回调函数里面,你可以根据属性的变化,通过调用this.setState()来更新你的组件状态,旧的属性还是可以通过this.props来获取,这里调用更新状态是安全的,并不会触发额外的render调用。

    使用好处: 在这个生命周期中,可以在子组件的render函数执行前获取新的props,从而更新子组件自己的state。 可以将数据请求放在这里进行执行,需要传的参数则从componentWillReceiveProps(nextProps)中获取。而不必将所有的请求都放在父组件中。于是该请求只会在该组件渲染时才会发出,从而减轻请求负担。

    componentWillReceiveProps在初始化render的时候不会执行,它会在Component接受到新的状态(Props)时被触发,一般用于父组件状态更新时子组件的重新渲染。

    react 生命周期

    初始化阶段:

    • getDefaultProps:获取实例的默认属性
    • getInitialState:获取每个实例的初始化状态
    • componentWillMount:组件即将被装载、渲染到页面上
    • render:组件在这里生成虚拟的 DOM 节点
    • componentDidMount:组件真正在被装载之后

    运行中状态:

    • componentWillReceiveProps:组件将要接收到属性的时候调用
    • shouldComponentUpdate:组件接受到新属性或者新状态的时候(可以返回 false,接收数据后不更新,阻止 render 调用,后面的函数不会被继续执行了)
    • componentWillUpdate:组件即将更新不能修改属性和状态
    • render:组件重新描绘
    • componentDidUpdate:组件已经更新

    销毁阶段:

    • componentWillUnmount:组件即将销毁

    shouldComponentUpdate 是做什么的,(react 性能优化是哪个周期函数?)

    shouldComponentUpdate 这个方法用来判断是否需要调用 render 方法重新描绘 dom。因为 dom 的描绘非常消耗性能,如果我们能在 shouldComponentUpdate 方法中能够写出更优化的 dom diff 算法,可以极大的提高性能。

    在react17 会删除以下三个生命周期
    componentWillMount,componentWillReceiveProps , componentWillUpdate

    React.Component 和 React.PureComponent 的区别

    PureComponent表示一个纯组件,可以用来优化React程序,减少render函数执行的次数,从而提高组件的性能。

    在React中,当prop或者state发生变化时,可以通过在shouldComponentUpdate生命周期函数中执行return false来阻止页面的更新,从而减少不必要的render执行。React.PureComponent会自动执行 shouldComponentUpdate。

    不过,pureComponent中的 shouldComponentUpdate() 进行的是浅比较,也就是说如果是引用数据类型的数据,只会比较不是同一个地址,而不会比较这个地址里面的数据是否一致。浅比较会忽略属性和或状态突变情况,其实也就是数据引用指针没有变化,而数据发生改变的时候render是不会执行的。如果需要重新渲染那么就需要重新开辟空间引用数据。PureComponent一般会用在一些纯展示组件上。

    使用pureComponent的好处:当组件更新时,如果组件的props或者state都没有改变,render函数就不会触发。省去虚拟DOM的生成和对比过程,达到提升性能的目的。这是因为react自动做了一层浅比较。

    React中的setState和replaceState的区别是什么?

    (1)setState() setState()用于设置状态对象,其语法如下:

    setState(object nextState[, function callback])
    
    
    • 1
    • 2
    • nextState,将要设置的新状态,该状态会和当前的state合并
    • callback,可选参数,回调函数。该函数会在setState设置成功,且组件重新渲染后调用。

    合并nextState和当前state,并重新渲染组件。setState是React事件处理函数中和请求回调函数中触发UI更新的主要方法。

    (2)replaceState() replaceState()方法与setState()类似,但是方法只会保留nextState中状态,原state不在nextState中的状态都会被删除。其语法如下:

    replaceState(object nextState[, function callback])
    
    
    • 1
    • 2
    • nextState,将要设置的新状态,该状态会替换当前的state。
    • callback,可选参数,回调函数。该函数会在replaceState设置成功,且组件重新渲染后调用。

    总结: setState 是修改其中的部分状态,相当于 Object.assign,只是覆盖,不会减少原来的状态。而replaceState 是完全替换原来的状态,相当于赋值,将原来的 state 替换为另一个对象,如果新状态属性减少,那么 state 中就没有这个状态了。

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

    (1)有状态组件

    特点:

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

    使用场景:

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

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

    (2)无状态组件 特点:

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

    使用场景:

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

    优点:

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

    缺点:

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

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

  • 相关阅读:
    光伏电站智能勘探:无人机优势及流程详解
    不小心清空了回收站怎么恢复,回收站删除的东西可以恢复吗
    持续集成部署-k8s-资源调度:DaemonSet
    你知道在Linux终端中“>“和“>>“之间的区别吗?
    verdi fsdb转vcd波形:用于后端功耗分析
    书单|1024程序员狂欢节充能书单!
    SAP FI 系列 (032) - 应收票据的配置
    javaI/O包中的包装模式
    Papers with Code一个查找论文和对应代码的神器
    [附源码]SSM计算机毕业设计智能视频推荐网站JAVA
  • 原文地址:https://blog.csdn.net/beifeng11996/article/details/127840932