react面试题

1、State的更新会被合并?

浅合并

2、render函数为什么return要加()

1、圆括号的作用是分割作用域和执行,在render中是给babel-jsx解析用的,这样写更符号原生编码习惯的的思维,也方便解析
2、return的圆括号是为了代码换行,不用括号的话只能写一行

用[]会渲染页面,有可能会出现key值报错

3、render为什么会执行多次?

6、React 合成事件和原生 DOM 事件的主要区别:

(1)React 组件上声明的事件没有绑定在 React 组件对应的原生 DOM 节点上。

(2)React 利用事件委托机制,将几乎所有事件的触发代理(delegate)在 document 节点上,事件对象(event)是合成对象(SyntheticEvent),不是原生事件对象,但通过 nativeEvent 属性访问原生事件对象。

(3)由于 React 的事件委托机制,React 组件对应的原生 DOM 节点上的事件触发时机总是在 React 组件上的事件之前。

7、React 事件概述

React 根据W3C 规范来定义自己的事件系统,其事件被称之为合成事件 (SyntheticEvent)。而其自定义事件系统的动机主要包含以下几个方面:

(1)抹平不同浏览器之间的兼容性差异。最主要的动机。

(2)事件"合成",即事件自定义。事件合成既可以处理兼容性问题,也可以用来自定义事件(例如 React 的 onChange 事件)。

(3)提供一个抽象跨平台事件机制。类似 VirtualDOM 抽象了跨平台的渲染方式,合成事件(SyntheticEvent)提供一个抽象的跨平台事件机制。

(4)可以做更多优化。例如利用事件委托机制,几乎所有事件的触发都代理到了 document,而不是 DOM 节点本身,简化了 DOM 事件处理逻辑,减少了内存开销。(React 自身模拟了一套事件冒泡的机制)

(5)可以干预事件的分发。V16引入 Fiber 架构,React 可以通过干预事件的分发以优化用户的交互体验。

注:「几乎」所有事件都代理到了 document,说明有例外,比如audio、video标签的一些媒体事件(如 onplay、onpause 等),是 document 所不具有,这些事件只能够在这些标签上进行事件进行代理,但依旧用统一的入口分发函数(dispatchEvent)进行绑定。

8、当文本中带有标签该如何渲染

固定语法<div dangerouslySetInnerHTML={{ __html: iHtml }}></div>

9、react是什么

用于动态构建用户界面的javaScript库 (只关注视图)——不用操作dom的意思

10、react是谁开发的

由Facebook开发,且开源。

11、react的优点

1、高效,使用虚拟DOM+优秀的Diff算法,尽量减少与真实DOM的交互
2、组件化开发
3、声明式编码
3、在React Native中可以使用React语法进行移动端开发

12、react如何将虚拟DOM渲染到页面

ReactDOM.render(被渲染的虚拟DOM,document获取的根节点)

13、创建虚拟DOM的两种方式

  • 纯js: const VDOM = React.createElement(标签名,标签属性,标签内容)
  • jsx语法(纯js的语法糖,运行时会自动编译为纯js的方式)

15、关于虚拟DOM:

1、本质是Object类型的对象(一般对象)
2、虚拟DOM比"较",真实DOM比较“重”,因为虚拟DOM是React内部在用,无需真实DOM上那么多的属性。
3、虚拟DOM最终会被React转化为真实的DOM,呈现在页面上

16、jsx

1、全称:javaScript XML
2、react定义的一种类似于XML的JS扩展语法:js + XML
更高效创建虚拟DOM
3 语法规则:

  定义虚拟DOM时,不要写引号。
  标签中混入JS表达式时要用{}
  样式的类名指定不要用class,要用className。
  style写法 style={{color:'white',fontSize:'29px'}}(外边的阔号时表示里面放的js表达式,这里放的是一个对象)
  只有一个根标签
  标签必须闭合
  标签首字符
    若小写字母开头,则将该标签转为html中同名元素,若html中无该标签对应的同名元素,则报错
	若大写字母开头,react就去渲染相应的的组件,若组件没有定义,则报错。## XML

17、XML早期用于存储和传输数据,后来被JSON取代

原因是:XML存储的信息会附带标签,JSON就不用,比较轻便,具有parse和stringify两个属性,转化数据类型很方便

18、为什么react中的方法会丢失this

当我们onClick={this.fn}
1,只是把onClick指向堆中的fn,调用时也就没有实例————所以this会指向window
2,因为bable编译会自动添加strick(严格模式),所以this就会变为undefined

19、执行了ReactDOM.render(…) 之后,都发生了什么?

1、React解析组件标签,找到了Directive组件。
2、发现组件是使用类定义的,随后new出来该类的实例,并通过该实例调用到原型上的render方法。
3、将render将返回的虚拟DOM转为真实DOM,随后呈现在页面上

render中的this是组件实例对象

20、constructor作用

初始化state
函数
构造器能省略就省略
构造器是否接收props,是否传递super,取决是否希望在构造器中通过this访问props

21、解读this.fn=this.fn.bind(this)

首先我们都知道,方法挂在构造函数的prototype(原型)上,这里我们将实例的fn属性=修改了this的fn函数
此时的实例是这个样子{fn:fn(),……} 原型上的fn函数并不会改变
但是当我们调用this.fn,会首先在对象自身找fn,从而解决了this指向的问题

22、初始化state必须在constructor中吗

初始化state也可以可以constructor外部,实例上也会增加state这个属性

23、porps和state的相同点,和不同点

不同点:

  • props:来自父组件,不可修改,但是可以运算{ num+1 }
  • state: 组件实例的属性,可修改

相同点:

  • 值改变都可以触发组件的更新

24、函数组件和class组件的区别?

函数组件使用可以接收props参数,无法使用state,refs

25、获取dom须知和事件执行机制

  • React中使用的是自定义(合成)事件,而不是使用的原生DOM事件 ————为了更好的兼容性
  • React中的事件是通过事件委托方式处理的(委托组件最外层的元素) ————为了高效性
  • 通过event.target得到发生事件的DOM元素对象 ————不要过度的使用ref

26、受控组件,非受控组件

受控组件——每次输入都会更新状态
非受控组件————只有用到的时候才获取(会用大量的ref,不推荐)

27、react生命周期

必须熟悉的:

  • constructor()
  • render()
  • componentDidMount()
  • componentDidUpdate(preProp,preState,snaoshotValue) 更新阶段
  • componentWillUnmount() 卸载阶段

以下知道即可————————

  • getDerivedStateFromProps()
    需要加static,接收两个参数(props,state)
    作用是让返回一个状态对象或null,且此值不可修改
    场景 state的值任何时候都取决于state
  • getSnapshotBeforeUpdate() 在更新之前获取快照

28、卸载组件

 del = () => {
    ReactDOM.unmountComponentAtNode(document.getElementById("root"))
  }

29、如何让组件不发生无效的重新渲染

  • 重写shouldComponentUpdate()方法

    比较新旧state或props数据,如果有变化才返回true,如果没有返回false

  • 使用PureComponent

    PuerComponent重写了shouldComponentupdate(),只有state或props数据有变化才会返回true
    【注意】:
    只是进行state和props数据的浅比较,如果只是数据对象内部数据变了,返回false
    不要直接修改state数据,而是要产生新数据
    项目中一般用PureComponent来优化

30、路径改变,样式文件丢失的3种解决办法?

  • 直接把’./‘替换为’/’
  • %PUBLIC_URL% (相当于public的绝对路径)
  • 用hash值,不用history,因为#后边的内容不会带到服务器

31、SPA的理解

  • 单页WEB应用
  • 整个应用只有一个完整的应用
  • 点击页面中的链接不会刷新页面,指挥做局部的更新
  • 数据都需要通过ajax请求获取,并在前端异步展现
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值