首页 > 其他分享 >React中常见的面试题

React中常见的面试题

时间:2024-05-29 23:57:41浏览次数:17  
标签:面试题 const DOM 常见 React 组件 import 路由

本文是结合实践中和学习技术文章总结出来的笔记(个人使用),如有雷同纯属正常((✿◠‿◠))

喜欢的话点个赞,谢谢!

1. 约束性组件与非约束性组件

1.1. 非约束性组件

非约束性组件其实就是不能控制状态的组件,比如:

<input type="text" defaultValue="123" onChange={handleChange}>

在这里我们可以输入value值,也可以根据输入的值在change回调里面处理逻辑,但是我们无法控制value值

1.2. 约束性组件

约束性组件就是我们可以直接控制组件的value值或者显示结果的组件,比如:

<input type="text" value={this.state.value} onChange={handleChange}>

在这里我们可以直接控制value值的显示,可以在第三方逻辑中处理value值然后修改显示结果

2. 高阶组件 HOC

高阶组件本质是一个函数。它可以接收一个组件作为参数,然后返回处理完逻辑处理结果之后返回一个新的组件。

高阶组件通常用于处理一些比如路由守卫封装或者表单组件的逻辑复用封装,比如封装一个弹出窗:

显示页面:

import ModalFn from "../../Component/index.tsx"
import { Modal } from 'antd';
const ModalExtend = ModalFn(Modal)
function Test() {
    return <div>
        <ModalExtend />
    </div>
}

export default Test

封装逻辑:

import { Button } from 'antd';
import React from 'react';

export default function ModalFn(Modal) {
    return class ModalExtend extends React.PureComponent {
        state = {
            isModalOpen: false
        }

        //显示弹出窗
        handleShowModal = () => {
            this.setState({
                isModalOpen: true
            })
        }
        //确定按钮
        handleOk = () => {

        }
        //取消按钮
        handleCancel = () => {
            this.setState({
                isModalOpen: false
            })
        }
        render(): React.ReactNode {
            const ModalProps = {
                open: this.state.isModalOpen,
                onOk: this.handleOk,
                onCancel: this.handleCancel,
                title: "Basic Modal"
            }

            return (
                <>
                    <Button type="primary" onClick={this.handleShowModal}>
                        Open Modal
                    </Button>
                    <Modal {...ModalProps} />
                </>
            )
        }

    }
}

展示效果:

不过我们通常不会这么做,我们做antd的二次封装只要传递参数即可,只不过一般的二次封装的思路都是学习自高阶组件

3. React路由

现在前端的项目一般都是SPA单页面应用,不再是以前多个页面多套HTML代码项目了,应用内的跳转不需要刷新页面就能完成页面跳转靠的就是路由系统

React路由系统分为BrowerRouter路由和HashRouter路由,分别表现为:

  • BrowerRouter路由: 就像平常网站www.baidu.com/test 这就是一个路由,在服务器渲染的时候需要后端做映射
  • HashRouter 路由: 比BrowerRouter多出了一个#符号,使用URL的哈希值实现,比如www.baidu.com/#/test,不需要后端做URL映射

可能会问到路由拦截(也就是路由守卫)的问题,这里不详细介绍,可以看看我之前发的React路由文章

4. React diff算法和虚拟DOM

diff算法是React实现组件差异化更新的核心逻辑之一,它与虚拟DOM是相辅相成的存在,正因为有了虚拟DOM才有diff的可能性

虚拟DOM本质上是JS到DOM之间的一个映射缓存,它在形态上表现为一个能够描述DOM树结构和属性信息的JS对象,如下图所示:

function Test(){
  return(
    <div className='aaa'>
        React
    </div>
  )
}

diff算法: diff算法的本身是VirtualDOM 在render的时候差量更新时需要进行比对需要更新哪些节点的一个产物,diff是递归更新虚拟DOM树的,一旦开始不可以暂停打断

更详细的diff算法和解释可以看看我之前发的React diff算法与虚拟DOM

5. React 性能优化

React性能优化一般有两种情况,类组件性能优化和函数组件性能优化,更多详细内容可以看看我之前写的React性能优化专题

5.1. 类组件:

PurComponent : 类组件可以继承React.PurComponent 组件,PurComponent组件在shouldComponentUpdate里面对组件state、props更新渲染做了浅比较

Immutable.js : Immutable 是Facebook推出的用来给数据做持久性优化的库,配合PurComponent使用的话可以进行组件更新渲染的深层次比较,避免组件无意义的二次渲染

5.2. 函数组件

React.memo:

React.memo 的使用方式相比immutable更加简单一些.它本质上是一个高阶组件,直接包裹住要声明的函数组件即可,内部也是浅比较,与PurComponent类似

useMemo:

React.memo的特性和用法,缺点很明显,无法感知组件内部的state,还有就是不能控制单一的某一段逻辑,所以官方建议使用useMemo加强深比较的能力,useMemo用法就是传递2个参数:第一个是需要渲染的内容,第二个参数是一个状态,根据这个状态是否变化来决定这段内容的更新与否

6. React 数据持久化

有一些面试官不会直接问状态管理容器redux、mobx之类的,会直接问你了解React数据持久化么?

一般的第三方数据持久化库都是用localStorage 或 AsyncStorage来进行存储数据的,我这里以redux-persist + @reduxjs/toolkit为例:

安装:

yarn add redux-persist
yarn add react-redux
yarn add @reduxjs/toolkit

配置src/store.ts

import { configureStore, combineReducers } from '@reduxjs/toolkit'
import HomeReducer from './models/home'

import { persistStore, persistReducer } from 'redux-persist'
// 选择持久化存储引擎,如 localStorage 或 AsyncStorage
import storage from 'redux-persist/lib/storage' // 默认使用localStorage作为存储引擎

// 组合各个模块的reducer
const reducer = combineReducers({
    Home: HomeReducer
})

// 配置持久化设置
const persistConfig = {
    key: 'root', // 存储的键名
    storage,// 持久化存储引擎
    // 可选的配置项,如白名单、黑名单等 选其一就好了
    // blacklist:['Home'], // 只有 Home 不会被缓存
    whitelist: ["Home"], // 只有 Home 会被缓存
}

const persistedReducer = persistReducer(persistConfig, reducer)

export const store = configureStore({
    reducer: persistedReducer, // 注册子模块
    middleware: (getDefaultMiddleware) =>
        getDefaultMiddleware({
            serializableCheck: false // 关闭默认的序列化检查//关闭严格模式
        })
})

export const persistor = persistStore(store)

配置src/models/HomeReducer

import { createSlice } from '@reduxjs/toolkit'

// 定义状态类型  
interface Action {
    payload: number,
    type: string
}
interface State {
    count: number
}

export const HomeStore = createSlice({
    // 模块名称独一无二
    name: 'home',
    // 初始数据
    initialState: {
        count: 1
    },
    // 修改数据的同步方法
    reducers: {
        increment: (state: State, action: Action) => {
            state.count += action.payload
        },
        decrement: (state: State, action: Action) => {
            state.count -= action.payload
        },
    }
})

// 导出
export const { increment, decrement } = HomeStore.actions
export default HomeStore.reducer

配置好了以后:

刷新没有变化

mac不太方便做GIF,过程也很简单,大家可以create一个demo自己尝试一下

7. React Hooks

Hooks基本上也是属于热门面试问答题,主要涉及到几个方面:常用的Hooks钩子、Hooks组件与类组件的区别、自定义Hooks、Hooks的逻辑复用

8. (明日更新)

标签:面试题,const,DOM,常见,React,组件,import,路由
From: https://blog.csdn.net/qq_32453495/article/details/139308639

相关文章

  • 深入解析Web前端三大主流框架:Angular、React和Vue
    Web前端三大主流框架分别是Angular、React和Vue。下面我将为您详细介绍这三大框架的特点和使用指南。Angular核心概念:组件(Components):组件是Angular应用的构建块,每个组件由一个带有装饰器的类、一个HTML模板、一个CSS样式表组成。组件通过输入(@Input)和输出(@Output)装饰......
  • 临阵磨枪之公网资产自查常见高风险漏洞——如何快速自查目标资产是否存在常见漏洞
    总纲收束公网资产的攻击面常见资产类型分类公网域名公网出口IP公众号、小程序名单应用APP程序名称供应链——内部资产涉及框架、中间件、服务器等。整理公网资产出入口地址锚定资产的具体公网入口,便于配合资产表单快速定位漏洞地址,进行应急处理。自查往届HVV频发漏洞,......
  • 添砖Java(十二)——异常,异常捕获,常见异常方法
    异常:定义:异常通俗来讲,其实就是你写出bug来了,编译器给你报错了。publicstaticvoidmain(String[]args)throwsException{intz=10/0;} 这个代码虽然说是可以运行,但是编译器会报错。因为10不能去除以0。异常分为两种,一种是运行时异常,另一种时编译时......
  • 面试题 - C# 交错序列求和
    试题求以下表达式的值,写出您想到的一种或几种实现方法:1-2+3-4+.....+m?最好用C#代码实现。分析这个表达式是一个交错序列的和,其中正数和负数交替出现。通常我们可以使用循环来实现这个计算,但面试官更青睐效率高的方式实现。直观循环法这种方法简单易懂,适合初学者理解和实现......
  • react使用antd实现表格的时间排序
    importReactfrom'react';import{Table}from'antd';importmomentfrom'moment';constdata=[{key:'1',date:'2018-01-11T12:00:00Z',},{key:'2',date:'2......
  • 最简单/最常见的行情驱动
    Onbar,Onbarclose,OnbaropenOnbar其实就是将k线数据遍历,一个bar会上传tick数据,包括单位时间内的最高成交价格,最低成交价格,开盘价和收盘价。通过对价格的遍历,绘制指标和进行行情变化的判断是否执行行情数据策略。 macd指标/*macdmacd其实一根线a是对k线进行加权平均另一根线b是......
  • React学习教程
    ReactReact前言官方文档React18中文文档1(国内社区):https://react.docschina.org/React18中文文档2(官方):https://zh-hans.reactjs.orgReact18英文文档:https://reactjs.orgReact17英文文档:https://17.reactjs.orgreact概述React是一个用于动态构建用......
  • 赶紧收藏!2024 年最常见 20道 Rocket MQ面试题(三)
    上一篇地址:赶紧收藏!2024年最常见20道RocketMQ面试题(二)-CSDN博客五、请解释RocketMQ中的全局有序和局部有序的概念。在RocketMQ中,有序性是消息传递的一个重要特性,它确保了在特定条件下消息能够按照发送的顺序被消费。RocketMQ提供了两种有序性保证:全局有序和局部有序。全......
  • 整理好了!2024年最常见 20 道 Rocket MQ面试题(四)
    上一篇地址:整理好了!2024年最常见20道RocketMQ面试题(三)-CSDN博客七、RocketMQ消费模式有几种?RocketMQ提供了两种主要的消费模式,分别是:集群消费模式(Clustering):在这种模式下,同一Topic下的消息被分发到同一个ConsumerGroup中的不同实例进行消费,但任意一条消息只会被该组中......
  • JAVAEE之线程多进阶(1)_常见的锁策略
    前言 在前面的线程初阶的内容中,我们已经简单介绍了锁,包括synchronized、volatile关键字(详细内容可见:https://blog.csdn.net/2301_80653026/article/details/138818637和https://blog.csdn.net/2301_80653026/article/details/138867371),我们在接下来要讲解的锁策略内容,对......