React面试题

2023-11-05

目录

1.什么是虚拟DOM?

2.类组件和函数组件之间的区别是什么?

3.什么是React?

4. 说说 Real DOM 和 Virtual DOM 的区别?优缺点?

5.在react中如何处理事件? 

6.class组件和函数组件区别

7.state和props区别是什么?

8.React 事件绑定的方式

9. 事件处理方法this指向改变

10.React事件处理方法传值

11. React如何获取表单数据?

12.为什么不直接更新state?

13.React条件渲染方法有哪些?

14.React怎么实现列表渲染?

15. React中key的作用是什么?

16. React组件样式的定义方式?

17.Props校验数据类型

18.受控组件和非受控组件的区别

19.props和state的区别

20.react-roter-dom中V5和V6区别?

21.父传子通信流程

22.子传父通信的流程

23.非父子组件通信

24.context状态树是怎么运行的?

25.React生命周期分为几个阶段?

26.简述React的生命周期函数?

27.React旧生命周期有哪些问题?

28. React新生命周期有哪些改变?

29. react的路由几种模式,是什么?

30.react路由常用的组件有哪些?

31.react路由传参的方式有哪些?

32.react路由跳转的方式有哪些?

33 .react路由嵌套如何配置? 

34. withRouter是干什么的?

35. 什么是Redux?

36.Redux的三大原则 

37.redux的执行原理

38.redux的使用步骤

39.React Router与常规路由有何不同? 

40.state和props有什么区别 

41.super() 和super(props)有什么区别?

42.说说 React中的setState执行机制 

43.React的事件机制总结 

44.说说对React refs 的理解?应用场景?

45.说说对高阶组件的理解?应用场景?

46.说说对Redux中间件的理解?常用的中间件有哪些? 

47.React中常见的Hooks方法有哪些?

48.useMemo, useCallback做了那些性能优化?

 49.react中ref的使用方式?

50.你对“单一事实来源”有什么理解? 

51.SPA(单页应用)首屏加载速度慢怎么解决?

52.BFC的理解

53.说说javascript内存泄漏的几种情况?

54.说说你对webSocket的理解?

55.说说package.json中版本号的规则?

56.说说你对koa中洋葱模型的理解?

57.说说Connect组件的原理是什么?


              

1.什么是虚拟DOM?

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

2.类组件和函数组件之间的区别是什么?

类组件可以使用其他特性,如状态和生命周期钩子,并且他有this

函数组件只能接收props渲染到页面,无状态组件,没有this,不能使用生命周期钩子

函数组件性能要高于类组件,因为类组件使用要实例化,而函数组件直接执行取返回结果即可,为了提高性能,尽量使用函数组件

3.什么是React?

React,用于构建用户界面的 JavaScript 库,只提供了 UI 层面的解决方案 
遵循组件设计模式、声明式编程范式和函数式编程概念,以使前端应用程序更高效 
使用虚拟 DOM 来有效地操作 DOM,遵循从高阶组件到低阶组件的单向数据流 
帮助我们将界面成了各个独立的小块,每一个块就是组件,这些组件之间可以组合、嵌套,构成整体页面 
react 类组件使用一个名为 render() 的方法或者函数组件return,接收输入的数据并返回需要展示的内容

React 特性有很多,如: 
JSX 语法 
单向数据绑定 
虚拟 DOM 
声明式编程 
Component 
React 存在的优势: 
高效灵活 
声明式的设计,简单使用 
组件式开发,提高代码复用率 
单向响应的数据流会比双向绑定的更安全,速度更快

4. 说说 Real DOM 和 Virtual DOM 的区别?优缺点?

两者的区别如下: 
虚拟 DOM 不会进行排版与重绘操作,而真实 DOM 会频繁重排与重绘 
虚拟 DOM 的总损耗是“虚拟 DOM 增删改+真实 DOM 差异增删改+排版与重绘”,真实 DOM 的总损耗是“真实 DOM 完全增删改+排版与重绘”

真实 DOM 的优势: 
易用 
缺点: 
效率低,解析速度慢,内存占用量过高 
性能差:频繁操作真实 DOM,易于导致重绘与回流 
使用虚拟 DOM 的优势如下: 
简单方便:如果使用手动操作真实 DOM 来完成页面,繁琐又容易出错,在大规模应用下维护起来也很困难 
性能方面:使用 Virtual DOM,能够有效避免真实 DOM 数频繁更新,减少多次引起重绘与回流,提高性能 
跨平台:React 借助虚拟 DOM,带来了跨平台的能力,一套代码多端运行 
缺点: 
在一些性能要求极高的应用中虚拟 DOM 无法进行针对性的极致优化 
首次渲染大量 DOM 时,由于多了一层虚拟 DOM 的计算,速度比正常稍慢

5.在react中如何处理事件? 

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

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


6.class组件和函数组件区别

  1. class组件是有状态的组件,可以定义state状态,函数组件无状态
  2. class组件有生命周期的,函数组件无生命周期
  3. class组件是由this对象,函数组件没有this对象
  4. 组件调用: class组件实例化后调用render方法调用,函数组件直接调用的。
  5. class组件内部的话,render方法return返回渲染jsx模板,函数组件直接返回即可
  6. ref获取子组件的对象,class组件可以直接获取到的,函数组件无法直接获取到。
  7. 绑定bind改变this指向,只适用于class组件

7.state和props区别是什么?

相同点:都是普通的js对象,他们包含着影响渲染输出的信息

不同点:state是组件自己管理数据,控制自己的状态,可变

props是外部传入的数据参数,不可变

没有state的叫做无状态组件,有state的叫有状态组件

多用props,少用state

8.React 事件绑定的方式

React 事件绑定属性的命名采用驼峰式写法, 采用 JSX 的语法传入一个函数作为事件处理函数

事件绑定函数的方式

1.直接写函数名字{callback},

2.可以使用bind方法绑定调用{callback.bind(this)}

9. 事件处理方法this指向改变

当我们把事件函数写成普通函数的形式时 , 调用函数使用state变量会报错,提示state变量不存在,

是因为

  • 事件处理程序的函数式函数调用模式,在严格模式下,this指向undefined

  • render函数是被组件实例调用的,因此render函数中的this指向当前组件

解决方法: 1. 把普通函数改成箭头函数 2. 调用函数的时候使用bind方法改变this指向

10.React事件处理方法传值

1.调用的时候定义一个箭头函数 函数中调用方法传递参数据

<button onClick={()=> this.del(index) }>
   点击
</button>

2.  bind方法传递参数

<button onClick={this.del.bind(this,index) }>
  点击
</button>

11. React如何获取表单数据?

  1. 给文本框绑定value属性,value属性绑定state中定义的变量
  2. 给表单绑定onChange事件,调用定义的方法
  3. 在方法中我们获取e.target.value属性,赋给value属性绑定的变量

12.为什么不直接更新state?

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

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

13.React条件渲染方法有哪些?

  1. if-else的条件渲染方法
  2. 三元运算符进行条件渲染,可以缩短代码量
  3. switch的多条件渲染效果
  4. HOC条件渲染

14.React怎么实现列表渲染?

react中可以使用map方法渲染列表,return对应的页面结构即可, React 在渲染列表时,会要求开发者为每一个列表元素指定唯一的 key ,我们尽量不要使用index索引值作为key,如果对数据进行:逆序添加、逆序删除等破坏顺序操作:可能会引起页面更新错误问题。

15. React中key的作用是什么?

key是虚拟DOM对象的唯一标识,在更新显示时key起到极其重要的作用 ,简单的来说就是为了提高diff的同级比较的效率,避免原地复用带来的副作用

react采用的是自顶而下的更新策略,每次小的改动都会生成一个全新的的vdom,从而进行diff,如果不写key,就会发生本来应该更新却没有更新 

16. React组件样式的定义方式?

  1. 外联样式

    定义css文件,在组件中通过import导入css样式,

    import "App.css"

  2. 内联样式

    React推崇的是内联的方式定义样式。这样做的目的就在于让你的组件更加的容易复用

    定义一个style属性,属性中定义对应的css样式即可,比如style={{fontSize:'15px'}}

    外层花括号是语法,内层花括号是对象边界符

17.Props校验数据类型

array(数组)、bool(布尔值)、func(函数number(数字)、object(对象)、string(字符串)

18.受控组件和非受控组件的区别

受控组件 
由React控制的输入表单元素而改变其值的方式,称为受控组件。 
比如,给表单元素input绑定一个onChange事件,当input状态发生变化时就会触发onChange事件,从而更新组件的state。 
非受控组件 
非受控组件指的是,表单数据由DOM本身处理。即不受setState()的控制,与传统的HTML表单输入相似,input输入值即显示最新值。 
在非受控组件中,可以使用一个ref来从DOM获得表单值。

19.props和state的区别

props是指组件间传递的一种方式,props自然也可以传递state。由于React的数据流是自上而下的,所以是从父组件向子组件进行传递;另外组件内部的this.props属性是只读的不可修改!

state是组件内部的状态(数据),不能够直接修改,必须要通过setState来改变值的状态,从而达到更新组件内部数据的作用。

20.react-roter-dom中V5和V6区别?

  • V5中Switch换成Routes标签,
  • V5中exact属性没有了,V6默认是精准匹配
  • V5中的component属性,V6用的element,element属性是组件标签
  • V6中重定向导航组件换成Navigate
  • V6中路由嵌套直接采用组件包裹的方式,可以不适用path绝对路径,
  • V6中的 相当于vue中router-view
  • 获取参数和Hooks方法的变化
  • props获取V6中props值没有参数数据,必须采用Hooks的路由获取数据。
  • withRouter在V6版本中也被去掉了。

21.父传子通信流程

  1. 在父组件中的子组件标签上绑定自定义属性,挂载传递的数据
  2. 子组件中props接受传递的数据,直接使用即可

22.子传父通信的流程

  1. 父组件中子组件标签上绑定一个属性,传递一个方法给子组件
  2. 子组件中通过props接受这个方法,直接调用,传递相应的参数即可

23.非父子组件通信

  1. 状态提升(中间人模式) 
    React中的状态提升概括来说,就是将多个组件需要共享的状态提升到它们最近的父组件,在父组件上改变这个状态然后通过props分发给子组件
  2. context状态树传参

24.context状态树是怎么运行的?

  1. 在父组件中我们通过createContext() 创建一个空对象,在父组件的最外层我们使用Provider包裹数据,通过value绑定要传递的对象数据。
  2. 在嵌套的子组件中,我们有两种方式获取数据: 
    (1) 我们可以使用Customer标签,在标签中绑定一个箭头函数,函数的形参context就是value传递的数据 
    (2). class组件中我们可以定义static contextType=context对象,组件中直接使用this.context获取数据。

25.React生命周期分为几个阶段?

Mounting(挂载阶段):已插入真实 DOM 
Updating(更新阶段):正在被重新渲染 
Unmounting(卸载阶段):已移出真实 DOM

26.简述React的生命周期函数?

挂载阶段: 
constructor() 在 React 组件挂载之前,会调用它的构造函数。 
componentWillMount: 在调用 render 方法之前调用,并且在初始挂载及后续更新时都会被调用。 
componentDidMount(): 在组件挂载后(插入 DOM 树中)立即调用

更新运行阶段: 
componentWillReceiveProps: 在接受父组件改变后的props需要重新渲染组件时用到的比较多,外部组件传递频繁的时候会导致效率比较低 
shouldComponentUpdate():用于控制组件重新渲染的生命周期,state发生变化,组件会进入重新渲染的流程,在这里return false可以阻止组件的更新 
render(): render() 方法是 class 组件中唯一必须实现的方法。 
* *componentWillUpdate(): shouldComponentUpdate返回true以后,组件进入重新渲染完成之前进入这个函数。 
* **componentDidUpdate()
: 每次state改变并重新渲染页面后都会进入这个生命周期 
卸载或销毁阶段 
componentWillUnmount (): 在此处完成组件的卸载和数据的销毁。

27.React旧生命周期有哪些问题?

(1) componentWillMount ,在ssr中 这个方法将会被多次调用, 所以会重复触发多遍,同时在这里如果绑定事件, 
将无法解绑,导致内存泄漏 , 变得不够安全高效逐步废弃。 
(2) componentWillReceiveProps 外部组件多次频繁更新传入多次不同的 props,会导致不必要的异步请求 
(3) componetWillupdate, 更新前记录 DOM 状态, 可能会做一些处理,与componentDidUpdate相隔时间如果过长, 会导致 状态不太信

28. React新生命周期有哪些改变?

  1. 用 getDerivedStateFromProps替换了 compoentWillMount和compontWillReceiveProps生命周期函数
  2. 用getSnapshotBeforeUpdate函数替换componetWillUpdate方法,避免和CompoentDidUpdate函数中获取数据不一致的问题

29. react的路由几种模式,是什么?

两种路由模式: 
一种是Hash路由模式,用的是HashRouter组件 
一种是历史路由模式,用的是BrowserRouter组件绑定

30.react路由常用的组件有哪些?

HashRouter或BrowserRouter配置路由模式 
Route 定义路由组件映射关系 
Redirect 设置路由重定向 
NavLink 或者Link 页面路由跳转 
Switch 路由匹配,当path匹配到一个component之后,将不会再想下继续匹配,提高了程序效率

31.react路由传参的方式有哪些?

//隐士参数传递 
(1) this.props.history.push({ pathname : '/user' ,query : {id:100}}) 
this.props.location.query.id 获取query传递的参数据,刷新数据不在 
(2) this.props.history.push({ pathname:'/user',state:{id: 1000 } }) this.props.location.state.id 获取state的数据,刷新数据还在 
3. url传参方式 () history.location.search获取数据比较麻烦,得自己解析 
4. 动态路由定义 /detail/:id => /detail/100 => location.match.params中接受的参数是 {id:100}

32.react路由跳转的方式有哪些?

声明式导航: 
使用NavLink或者Link跳转, to属性后面跟字符串或者跟对象 
编程式导航跳转: 
props.history.push(url) 跳转页面可以返回上一页,保留历史记录 
props.history.replace(url) 跳转页面,清空历史记录 
props.history.go(num) 返回第几个页面

33 .react路由嵌套如何配置? 

  1. 配置父组件的路由地址,在父组件中配置子组件的路由映射关系
  2. 关闭父组件路由配置exact属性,避免精准匹配
  3. 父组件路由地址作为子组件路由地址的开始的一部分。比如父组件是/index 子组件应该是/index/子组件地址

34. withRouter是干什么的?

是所有组件都直接与路由相连(比如拆分的子组件)的,当这些组件需要路由参数时,使用withRouter就可以给此组件传入路由参数,将react-router的history、location、match三个对象传入props对象上,此时就可以使用this.props.history跳转页面了或者接受参数了

35. 什么是Redux?

在react中每个组件的state是由自身进行管理,包括组件定义自身的state、组件之间的通信通过props传递、使用Context实现数据共享等,如果让每个组件都存储自身相关的状态,理论上来讲不会影响应用的运行,但在开发及后期我们将比较难以维护,所以我们可以把数据进行集中式的管理,redux就是一个实现上述集中管理的容器的工具,redux并不是只应用在react中,还与其他界面库一起使用,如Vue

36.Redux的三大原则 

  • state数据必须是单一数据源
  • redux中的state数据必须 是只读的,只能通过dispatch调用actions修改
  • Reducer必须使用纯函数来执行修改

37.redux的执行原理

React的组件需要获取或者修改页面的数据,通过dispatch方法调用actions进入到Reducer函数中修改state的数据内容,state更新后,通知组件更新页面即可。

38.redux的使用步骤

  1. 创建一个store文件夹,新建一个index.js文件
  2. 文件中导入redux的createStore方法,用于创建公共数据区域
  3. 创建一个reducer纯函数,接受两个参数state,actions分别表示分别表示数据和操作state的方法,返回state数据给组件页面
  4. 把reducer作为createStore的参数抛出
  5. 在需要使用的页面导入store文件,通过store.getState获取数据,通过store.dispatch触发action修改state数据
  6. store.subscrible 方法监听 store 的改变,避免数据不更新

39.React Router与常规路由有何不同? 

主题 常规路由 React 路由
参与的页面 每个视图对应一个新文件 只涉及单个HTML页面
URL 更改 HTTP 请求被发送到服务器并且接收相应的 HTML 页面 仅更改历史记录属性
体验 用户实际在每个视图的不同页面切换 用户认为自己正在不同的页面间切换

40.state和props有什么区别 

相同点: 
两者都是 JavaScript 对象 
两者都是用于保存信息 
props 和 state 都能触发渲染更新 
区别: 
props 是外部传递给组件的,而 state 是在组件内被组件自己管理的,一般在 constructor 中初始化 
props 在组件内部是不可修改的,但 state 在组件内部可以进行修改 
state 是多变的、可以修改

41.super() 和super(props)有什么区别?

在 React 中,类组件基于 ES6,所以在 constructor 中必须使用 super 
在调用 super 过程,无论是否传入 props,React 内部都会将 porps 赋值给组件实例 porps 属性中 
如果只调用了 super(),那么 this.props 在 super() 和构造函数结束之间仍是 undefined

42.说说 React中的setState执行机制 

一个组件的显示形态可以由数据状态和外部参数所决定,而数据状态就是state, 当需要修改里面的值的状态需要通过调用setState来改变,从而达到更新组件内部数据的作用 
setState第一个参数可以是一个对象,或者是一个函数,而第二个参数是一个回调函数,用于可以实时的获取到更新之后的数据 
在使用setState更新数据的时候,setState的更新类型分成:同步更新,异步更新 
在组件生命周期或React合成事件中,setState是异步 
在setTimeout或者原生dom事件中,setState是同步 
对同一个值进行多次 setState, setState 的批量更新策略会对其进行覆盖,取最后一次的执行结果

43.React的事件机制总结 

React事件机制总结如下: 
- React 上注册的事件最终会绑定在document这个 DOM 上,而不是 React 组件对应的 DOM(减少内存开销就是因为所有的事件都绑定在 document 上,其他节点没有绑定事件) 
- React 自身实现了一套事件冒泡机制,所以这也就是为什么我们 event.stopPropagation()无效的原因。 
- React 通过队列的形式,从触发的组件向父组件回溯,然后调用他们 JSX 中定义的 callback 
- React 有一套自己的合成事件 SyntheticEvent

44.说说对React refs 的理解?应用场景?

创建ref的形式有三种: 
- 传入字符串,使用时通过 this.refs.传入的字符串的格式获取对应的元素 
- 传入对象,对象是通过 React.createRef() 方式创建出来,使用时获取到创建的对象中存在 current 属性就是对应的元素 
- 传入hook,hook是通过 useRef() 方式创建,使用时通过生成hook对象的 current 属性就是对应的元素

在某些情况下,我们会通过使用refs来更新组件,但这种方式并不推荐,更多情况我们是通过props与state的方式进行去重新渲染子元素

但下面的场景使用refs非常有用: 
- 对Dom元素的焦点控制、内容选择、控制 
- 对Dom元素的内容设置及媒体播放 
- 对Dom元素的操作和对组件实例的操作 
- 集成第三方 DOM 库

45.说说对高阶组件的理解?应用场景?

 一个函数的参数是一个函数,或者 函数的返回值是一个函数,我们称这类函数是高阶函数。 
什么是React高阶组件:一个组件的参数是组件,并且返回值是一个组件,我们称这类组件为高阶组件 
withRouter() memo() react-redux中connect方法是高阶组件 
React 中的高阶组件主要有两种形式:属性代理 和 反向继承。 
属性代理: 是 一个函数接受一个 WrappedComponent 组件作为参数传入,并返回一个继承了 React.Component 组件的类,且在该类的 render() 方法中返回被传入的 WrappedComponent 组件

反向继承:是 一个函数接受一个 WrappedComponent 组件作为参数传入,并返回一个继承了该传入 WrappedComponent 组件的类,且在该类的 render() 方法中返回 super.render() 方法。

46.说说对Redux中间件的理解?常用的中间件有哪些? 

Redux中,中间件就是放在就是在dispatch过程,在分发action进行拦截处理 
前面我们了解到了Redux整个工作流程,当action发出之后,reducer立即算出state,整个过程是一个同步的操作 
那么如果需要支持异步操作,或者支持错误处理、日志监控,这个过程就可以用上中间件,其本质上一个函数,对store.dispatch方法进行了改造,在发出 Action和执行 Reducer这两步之间,添加了其他功能

常用的redux中间件,如: 
redux-thunk:用于异步操作 
redux-logger:用于日志记录

中间件都需要通过applyMiddlewares进行注册,作用是将所有的中间件组成一个数组,依次执行然后作为第二个参数传入到createStore中

const store = createStore(
  reducer,
  applyMiddleware(thunk, logger)
);

47.React中常见的Hooks方法有哪些?

  • useState

    useState()用于为函数组件引入状态。在useState()中,数组第一项为一个变量,指向状态的当前值。类似this.state,第二项是一个函数,用来更新状态,类似setState

  • useEffect

    useEffect()接受两个参数,第一个参数是你要进行的异步操作,第二个参数是一个数组,用来给出Effect的依赖项。只要这个数组发生变化,useEffect()就会执行

  • useRef

    相当于class组件中的createRef的作用,ref.current获取绑定的对象

  • useContext

    接受context状态树传递的数据内容

  • useReducer

    接受reducer函数和状态的初始值作为参数,返回一个数组,其中第一项为当前的状态值,第二项为发送action的dispatch函数

  • userMemo useCallback

    useMemo 和 useCallback接收的参数都是一样,第一个参数为回调,第二个参数为要依赖的数据 
    共同作用:仅仅依赖数据发生变化, 才会调用,也就是起到缓存的作用。useCallback缓存函数,useMemo 缓存返回值。

48.useMemo, useCallback做了那些性能优化?

useMemo 主要缓存复杂运算的数据的结果,第二个参数,定义监听的变量,需要返回一个结果。

当父组件的组件更新的时候会导致子组件的重新渲染,但是如果父组件的更新的数据没有传递给子组件的话,这个时候如果还让子组件重新渲染的化,就会导致组件的更新的性能消耗比较大。

所以说这个时候我们可以使用useMemo, 或者React中内置的memo方法对子组件进行缓存,这样的话只有父组件更新跟子组件相关联的数据的时候才会导致子组件的重新渲染,从而提高组件的渲染性能。

但是如果我们给子组件传递方法的时候,上面memo方法的缓存就不起作用了,原因是父组件没更新一次会导致方法的重新调用,进而导致子组件的重新更新,所以这个时候我们可以使用useCallback对传递的方法进行缓存,监听数据更新后才会重新调用方法,从而提高组件的渲染性能。

 49.react中ref的使用方式?

1.可以直接写一个字符串,不过它只适用于类组件

2.createRef和useRef来定义ref变量,ref.current获取数据

3.可以使用箭头函数的方式,提前定义一个变量,箭头函数的形参就是当前对象 

const App = ()=>{
  let h = useRef();
 
  let inp = null;//定义一个空变量
 
  const setVal = ()=>{
    console.log(inp.value);
  }
  return (
    <div>
      <h3 ref={h}>ceshi</h3>
      <button onClick={()=>console.log(h.current)}>获取</button>
 
      <hr />
      <input placeholder="输入内容" ref={(el)=>{ inp = el; }} onChange={setVal}/>
    </div>
  )
}

ref属性不能直接绑定到函数子组件的,函数组件没有this对象,无法获取函数子组件的对象内容,最后函数组件forwardRef高阶组件组件,可以把ref属性通过参数的参数传递到函数子组件的内部,对ref属性进行转发的操作

50.你对“单一事实来源”有什么理解? 

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

51.SPA(单页应用)首屏加载速度慢怎么解决?

 1,减少入口文件体积:常用的手段是路由懒加载,只有在解析路由时才会加载组件;
 2,静态资源本地缓存: 后端返回资源: 采用HTTP缓存;前端合理利用:localStorage;
 3,UI框架按需加载 
 4,避免组件重复打包
 5,图片资源压缩
 6,开启GZip压缩,拆完包后,我们再用gzip做一下压缩,安装compression-webpack-plugin
webpack中配置安装

52.BFC的理解

BFC(Block Formatting Context)块格式化上下文,简单的理解:BFC就是一个块级容器,它会隔离外部,让盒子里面的元素不影响外面的元素,也就是在搭建页面的时候,不影响外面的布局。

不使用BFC:内部元素使用浮动的时候,外面的盒子计算不到高度,就会导致高度坍塌
        如果两个块级盒子都设置了margin值,两个盒子相邻的那一边的margin就会重叠

触发条件:最常见的是通过 overflow: hidden 来构建 BFC。一般情况下,它的副作用最小。但如果元素下有超出盒子范围的内容,会被截掉,

解决问题:

        1.解决边距重叠问题:我们只需要在其中一个块级元素外面包裹一层容器,使两个块级元素不属于同一层级,并且触发BFC
        2.解决高度塌陷问题:如果盒子里面的元素加了浮动,计算外面盒子的高度不会计算浮动的盒子高度,因为浮动不占空间。这个时候我们就需要在外面的盒子触发BFC,这样使他即使内部元素加了浮动也计算浮动元素的高度,不会导致高度坍塌
        3.解决相邻盒子浮动区域重叠问题:给相邻的盒子也加上浮动,给相邻的盒子设置overflow:hidden

53.说说javascript内存泄漏的几种情况?

1.意外的全局变量

一个未声明变量的引用会在全局对象中创建一个新的变量。

2.闭包引起的内存泄漏

闭包可以使变量常驻内存,但如果使用不当就会在成内存泄漏

3.DOM之外的引用

4.被遗漏的定时器和回调函数

怎样避免内存泄漏

1)减少不必要的全局变量,或者生命周期较长的对象,及时对无用的数据进行垃圾回收;

2)注意程序逻辑,避免“死循环”之类的 ;

3)避免创建过多的对象  原则:不用了的东西要及时归还。

54.说说你对webSocket的理解?

WebSocket是一种基于TCP的全双工通信协议,在应用层。

WebSocket的优缺点

        优点:建立WebSocket连接之后,客户端与服务端交流更方便

             客户端只需要向服务端发送一次请求,服务端主动向客户端发送消息

        缺点:在服务端的状态不会频繁变化的时候,就不需要使用WebSocket连接了,浪费性能

为什么需要WebSocket

        1、传统上的HTTP协议它是无状态的,服务器不能够识别是哪个客户端发送的请求,不能够保存状态。

        2、WebSocket弥补了这一问题,在客户端向服务端发送请求之后,服务器处理请求并返回到客户端,使用WebSocket可以使得服务器主动向浏览器推送消息

WebSocket协议的原理

        与服务器进行三次握手,建立TCP连接

        向服务器发送HTTP请求,请求中包含WebSocket的版本信息:包括upgrade、connection等等。

        服务器处理请求并返回客户端,此时可以进行WebSocket请求了

        服务端也可以主动向客户端推送消息了。

55.说说package.json中版本号的规则?

        第一部分为主版本号,变化了表示有了一个不兼容上个版本的大更改

        第二部分为次版本号,变化了表示增加了新功能,并且可以向后兼容

        第三部分为修订版本号,变化了表示 有bug修复,并且可以向后兼容

        第四部分为日期版本号加希腊字母版本号,希腊字母版本号共有五种,分别为base、alpha、 bela 、RCrelease

56.说说你对koa中洋葱模型的理解?

        Koa的洋葱模型是以next()函数为分割点,先由外到内执行Request的逻辑,然后再由内到外执行Response的逻辑,这里的request的逻辑,我们可以理解为是next之前的内容,response的逻辑是next函数之后的内容,也可以说每一个中间件都有两次处理时机。洋葱模型的核心原理主要是借助compose方法。

57.说说Connect组件的原理是什么?

react-redux用于连接react组件及redux,方便开发者使用redux
管理状态。其中connect方法是关键,用法如下:

connect([mapStateToProps], [mapDispatchToProps])(component)
看connect使用方法就知道是高阶组件,接收参数为mapStateToProps和mapDispatchToProps俩个方法,返回的函数接收参数是组件,从而返回一个新的组件。
首先connect之所以会成功得原因?
是因为Provider组件,在原应用组件上包裹一层,使原来整个应用成为Provider的子组件
接收Redux的store作为props,通过context对象传递给子孙组件上的connect
那connect做了些什么呢?
它真正连接 Redux 和 React,它包在我们的容器组件的外一层,它接收上面 Provider 提供的 store 里面的 state 和 dispatch,传给一个构造函数,返回一个对象,以属性形式传给我们的容器组件。
概括:react-redux 库提供的一个 API,connect 的作用是让你把组件和store连接起来,产生一个新的组件(connect 是高阶组件)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

React面试题 的相关文章

  • 如何使用 Angular 1.5 中的组件为每个页面设置标题

    我最近开始使用 Angular 1 5 组件 我的应用程序中有多个页面 所以我决定创建一个
  • Web Worker 中的 RequireJS

    我正在尝试在网络工作者中使用 RequireJS 问题是我在使用它时不断收到以下错误 Uncaught Error importScripts failed for underscore at lib underscore js 我已经测试
  • Mat select - 获取selectionChange的旧值

    我有一个项目 其中有一个包含以下内容的表单mat select选择器 每当用户更改输入时 我都会向用户显示一个对话框来确认此操作 现在 The selectionChange 通知值何时更改并将新值传递为 event 当用户取消对话框时 有
  • 裁剪响应式全宽图像

    我必须剪辑跨越整个宽度的图像 以下事情对我不起作用 剪辑 这需要绝对位置 因此块元素不会堆叠在下面 背景位置 缩放时无法正确剪辑 放大时剪辑的部分会增加 反之亦然 包装器 包装器高度取决于浏览器宽度 因此其值应该是动态的 我使用了 seti
  • 考虑使用“jsdom”测试环境

    我有这个简单的测试 import React from react import render from testing library react import Button from describe Button gt it rend
  • 最小有效 JSON 是多少?

    我仔细阅读了 JSON 描述http json org http json org 但我不确定我是否知道这个简单问题的答案 最小可能的有效 JSON 字符串是什么 string 该字符串是有效的 JSON 吗 42简单的数字是有效的 JSO
  • 是否有正确的方法将自定义 Javascript 添加到 ASP.NET MVC 5 页面?

    目前 我已将 jQuery 源文件添加到 ASP NET 项目的 Scripts 文件夹中 在 Layout cshtml 页面中 我包含了 Scripts jquery 2 1 1 min js 现在 我可以在我制作的每个页面上包含 jQ
  • 如何使用 JavaScript 或 jQuery 清除 Google Chrome、Mozilla Firefox 和 Safari 中的剪贴板数据

    我正在开发一个网站 我想在使用 JavaScript 或 jQuery 查看我的网站时按下打印屏幕按钮时清除剪贴板数据 谁能帮我解决这个问题 我在 Internet Explorer 中成功处理了这个问题 提前致谢 由于安全原因 您无法使用
  • Angular JS未知提供者错误

    删除 Bower components 并清理缓存后 我使用 Bower install 重新安装了依赖项 该应用程序无法加载并出现以下错误 未捕获的错误 injector unpr 未知提供程序 forceReflowProvider 这
  • 对 UPDATE 行的 POST 请求

    我是 javascript 的新手 所以我正在寻找一些帮助来创建一种拖放地理编码标记的方法 以允许交互式更改地址 我相信通过更新 LOCATION 列行可以实现这一点 第一步是 发送 POST 请求 对吧 好吧 所以我想问是否有人可以给我看
  • jQuery/JavaScript“this”指针混淆

    当函数时 this 的行为bar被称为让我困惑 请参阅下面的代码 当从单击处理程序调用 bar 时 有什么方法可以将 this 安排为普通的旧 js 对象实例 而不是 html 元素 a class with a method functi
  • Opera Mobile 9.7 Beta 设置焦点 [重复]

    这个问题在这里已经有答案了 我们使用手持式扫描仪将物品移入和移出库存 扫描仪运行一个 ASP 页 该页提交表单以移动项目 我们最近购买了一台运行 Windows Mobile 6 1 的新扫描仪 很快就意识到 Mobile IE 完全没用
  • xhr 响应 for 循环不起作用

    我有 xhr 和 for 循环 它的工作非常罕见 for var i 0 i lt this files length i var xhr new XMLHttpRequest xhr upload onprogress function
  • 如何使用 jQuery 显示“忙”指示器?

    如何在网页中的特定点显示旋转的 忙 指示器 我想在 Ajax 请求开始 完成时启动 停止指示器 这真的只是显示 隐藏 gif 动画的问题 还是有更优雅的解决方案 您可以只显示 隐藏 gif 但您也可以将其嵌入到 ajaxSetup 中 以便
  • 防止 Firefox Web 通知自动关闭

    我已经在 Firefox 中将 Web 通知与服务器发送的 DOM 事件结合使用 不幸的是 通知在大约两到三秒后消失 我更喜欢 Chrome 的方法 即让消息保持可见 在任何给定时间最多显示三个 直到用户单击通知 这是我所拥有的 windo
  • 以编程方式将子节点添加到 jstree

    我正在尝试编写一些动态添加节点到 jstree 的代码 我已经关注了医生http www jstree com documentation crrm http www jstree com documentation crrm但无法获得一个
  • 当我尝试使用 jasmine 进行测试时,应用程序文件夹未在 Ext.appliation 中加载

    我正在尝试在我的应用程序 Ext js 5 中实现茉莉花以进行单元测试 为此 我创建了应用程序测试文件 Ext require Ext app Application Ext Loader setConfig enabled true Ex
  • 谷歌地图的灰度

    有没有什么方法可以在不丢失任何其他功能的情况下以灰度显示 Google 地图 通过 Javascript API 嵌入 是的 他们在 api V3 中引入了StyledMaps http code google com apis maps
  • IE8 - 隐藏 div 内的表单,返回键不再起作用

    我有一个登录表单 位于带有 display none 的 div 中 然后我使用 jquery 淡入表单 但 Enter Return 键不再提交表单 如果我将显示更改为阻止 则效果很好 此问题仅存在于 IE 中 有任何想法吗 这是一个不起
  • 构造函数可以返回什么值来避免返回 this ?

    确切的情况是什么 returnJavascript 中的语句可以返回除this当使用构造函数调用时new关键词 Example function Foo return something var foo new Foo 如果我没记错的话 如

随机推荐

  • Kettle的下载安装教程和使用简介(内含第一个kettle转换案例)

    本文首先介绍Kettle工具的安装及基本概念 然后通过一个案例实操介绍Kettle工具的使用 本文重要的内容如下 Kettle的安装 1 Java的安装 登录Java的官网后 进入到下载页面 http www oracle com tech
  • 设置JVM选项-ElasticSearch

    设置JVM的方法 在ElasticSearch中设置JVM选项有两种方法 一种是通过jvm options 另一种是通过环境变量ES JAVA OPTS jvm options jvm options是优选选择的方法 通过tar或者zip安
  • 函数式和面向对象编程有什么区别?

    函数式编程 Functional Programming 和 面向对象编程 Object Oriented Programming 是两个主流的编程范式 他们有各自独特的闪光点 比如函数式编程的数据不可变 惰性求值 面向对象编程的继承 多态
  • python 数据类型及转换

    常见的数据类型 使用 type 内置类可以查看变量所对应的类型 int 整数 十进制 二进制 使用0b开始表示 八进制 使用 0o 开始 十六进制 使用 0x 开始 float 浮点数 complex 复数 str 字符串 就是一段普通的文
  • 竞赛题-6258. 数组中最长的方波

    题目 给你一个整数数组 nums 如果 nums 的子序列满足下述条件 则认为该子序列是一个 方波 子序列的长度至少为 2 并且 将子序列从小到大排序 之后 除第一个元素外 每个元素都是前一个元素的 平方 返回 nums 中 最长方波 的长
  • gcc -Wall详解

    当GCC在编译过程中检查出错误的话 它就会中止编译 但检测到警告时却能继续编译生成可执行程序 因为警告只是针对程序结构的诊断信息 它不能说明程序一定有错误 而是存在风险 或者可能存在错误 虽然GCC提供了非常丰富的警告 但前提是你已经启用了
  • j2ee_XML建模

    1 什么叫XML建模 将XML配置文件中的元素 属性 文本信息转换成对象的过程叫做XML建模 XML建模 1 根据XML配置文件元素节点创建元素节点实体类 ConfigModel ActionModel ForwardModel 2 利用d
  • ifconfig、ip addr、ip route用法总结

    最近使用haproxy keepalived 负载均衡 发现虚拟IP有问题 配置文件里配的VIP是 4 143 但是执行 ip a 发现还有一个虚拟IP 4 134 应该是以前配置文件keepalived conf里设置过VIP 4 134
  • 做大模型时代的应用层创业!

    Datawhale创业 方向 大模型 合作伙伴 Datawhale 亲爱的科技探险家们和代码魔法师们 未来的钟声已经敲响 预示着一场极度炫酷的虚拟现实游戏即将展开 从初期简单的智能识别 到设计师级别的图纸设计 生成式AI技术 Generat
  • python写路径时候的问题————转载ningqingzy的文章

    作为笔记总结学习 如有侵权 立马删除 总结有三种方法 更换为绝对路径的写法 func1 C Users renyc 显式声明字符串不用转义 加r func1 r C Users renyc 使用Linux的路径 func1 C Users
  • 数仓 - hive ,身份证和手机号 匹配 - 正则方式

    数仓 hive 身份证和手机号 匹配 正则方式 身份证 内容校验 身份证号字段 regexp 1 9 0 9 14 1 9 0 9 16 0 9xX 长度校验 and length trim 身份证号字段 15 or length trim
  • MyBatis特殊SQL的执行(模糊查询、批量删除、动态设置表名、添加功能获取自增的主键)

    一 模糊查询 1 1 like xxx 的方式模糊查询 根据用户名进行模糊查询 param username return java util List
  • activiti 6.x 多实例加签(如有不足留言指出)

    最近刚接触activiti 用的6 x 网上资料太少 断点追流程看属性写了个加签的操作 目前测试的没啥问题 如有问题 请留言指教 上代码 完事之后三个表查查有没有新增数据 有就成了 多实例的才能复制 调用之前最好先判断下 protected
  • 7个程序员常用的接单平台推荐

    推荐7个程序员常用的接单平台 不管做兼职 副业 还是全职自由职业 都可能会用到下面几个网站 特别推荐第一个 飞援 地址链接 前端开发外包 小程序开发兼职 程序员兼职平台 飞援 程序员远程灵活用工平台 聚集了高质量的兼职和全职自由职业开发者
  • sklearn学习笔记

    1 波士顿房价线性回归模型 from sklearn import datasets from sklearn linear model import LinearRegression boston datasets load boston
  • 语法基础——Objective-C语法基础

    前言 学习过Swift之后 好久没用已经生疏了 现在有项目来了 不得不停下手下的工作 开始学习OC 当然这篇文章会以Java基础和C基础作为支撑 这样学习起来入门很简单 可能这篇文章有点个人主义 用作个人笔记吧 OC特点 支持C语法 支持面
  • java中将url下载并转换为MultipartFile文件

    url转换MultipartFile用于图片持久化 需要在对应的网络下才能使用 url转MultipartFile url 图片URL fileName 文件名 return 返回的文件 public static MultipartFil
  • chmod 用法示例

    介绍 Linux中的Chmod命令用于更改或分配文件和目录的权限 在Linux Unix系统中 文件和目录的可访问性是由文件所有权和权限决定的 在上一篇文章中 我们了解了如何使用chown命令管理文件和目录的所有权 在本教程中 我们将介绍c
  • There is no item category assigned to account xxxxxxx

    做GOODS ISSUE的时候遇到这么一个问题 报出一个错误There is no item category assigned to account xxxxxxx 暂时也不知道原因 后来到 Financial Accounting Gl
  • React面试题

    目录 1 什么是虚拟DOM 2 类组件和函数组件之间的区别是什么 3 什么是React 4 说说 Real DOM 和 Virtual DOM 的区别 优缺点 5 在react中如何处理事件 6 class组件和函数组件区别 7 state