React面试题总结

1.vue-router 和 react-router的区别

首先,我们先看一下在vue-router和react-router中的用法本质
Vue-Router

  • hash:使用URL hash值来作路由。默认模式
  • history:依赖HTML5 History API和服务器配置。查看HTML5 History模式。
  • abstract:支持所有的JavaScript运行环境,入Node.js服务器端

React-Router

  • <HashRouter>URL格式为Hash路由组件
  • <MemoryRouter>内存路由组件
  • <NativeRouter>Native的路由组件
  • <StaticRouter>地址不改变的静态路由组件

了解以上知识后,我们看一下前端路由的本质:

前端路由本质的两种支持:(改变视图的同时不会向后端发出请求)
1.hash——即地址栏URL中的#符号以及之后的数据。
2.history——利用了HTML5 History Interface中新增的pushState()和replaceState()方法。(使用需要注意兼容性)(Apache或者Nginx需要配置)
前端路由,简单来说,就是当浏览器的url产生变化时,不向服务器进行请求,而是直接控制前端页面产生变化,以期待前端在比如功能切换时,产生类似页面跳转等效果。

典型代码:
vue-router

JS:

const Foo = { template: '<div>foo</div>' } //声明的组件
const Bar = { template: '<div>bar</div>' }

const routes = [  //声明的路由数据,数组包对象
  { path: '/foo', component: Foo },  //路径+组件  需要的数据
  { path: '/bar', component: Bar }
]

const router = new VueRouter({  //new了一个路由实例,传入参数routes
  routes
})

const app = new Vue({  //new一个vue实例,传入一个router参数
  router
}).$mount('#app')//挂载到#app dom上

HTML:

<div id="app">
  <h1>Hello App!</h1>
  <p>
    <router-linkto="/foo">Go to Foo</router-link> //路由跳转组件,点击跳到/foo
    <router-linkto="/bar">Go to Bar</router-link>
  </p>
  <!-- 路由出口-->
 <router-view></router-view>  // 展示匹配到的组件
</div>
react-router

JS/JSX:

// modules/Foo.js
import React from 'react'
export default React.createClass({ //导出一个类组件
  render() {
    return<div>Foo</div>
  }
})
// modules/Bar.js
import React from 'react'
export default React.createClass({ //导出一个bar
  render() {
    return<div>Bar</div>
  }
})
// index.js
// ...配置路由信息 , 需要引入配置的组件
render((
  <Routerhistory={hashHistory}> //声明路由使用模式
    <Route path="/" component={App}>  //主路由入口
      <Route path="/foo" component={Foo}/> //子路由
      <Route path="/bar" component={Bar}/>
    </Route>
  </Router>
), document.getElementById('app'))
// modules/App.js
// ...
  render() {
    return (
      <div>
        <h1>React RouterTutorial</h1>
        <ulrole="nav">
          <li><Linkto="/foo">Go To Foo</Link></li> //linkto 跳转到foo
          <li><Linkto="/bar">Go To Bar</Link></li> //linkto 跳转到bar
        </ul>

        {/* 路由匹配到的组件将渲染在这里 */}
        {this.props.children} //子组件作为children传入父组件

      </div>
    )
  }
// ...

接下来我们回到主题:vue-router和react-router的区别

本质区别:

  • vue-router是全局配置方式,react-router是全局组件方式
  • vue-router仅支持对象形式的配置,react-router支持对象形式和jsx语法的组件形式配置。
  • vue-router任何组件都会被渲染到<router-view/>的位置,react-router子组件作为children被传入父组件。而根组件被渲染到<Router/>位置。
  • 使用方式上的不同,获取参数的方式不同
vue-router 使用:<router-link> <router-view>
reacrt-router使用:router包裹,<linkto="" >  <route>
vue-router获取参数:this.$router //全局路由的实例 this.$route //当前的路由信息
react-router获取参数:import {userParams} from "react-router-dom"  let {id}=useParams() 

2.如果你是管理员,做管理系统项目,vue和react你会怎么选择

vue适合webapp,适合做用户交互多,各种动态效果变化丰富的应用。特别是PC、手机的网页版,商城等页面。
原因:vue实现逻辑复杂的功能比较简单。
react适合oa系统,适合大批量的数据展示、适合做大型应用。特别适合公司的后台管理系统。
原因:react对那种比较复杂的交互,实现起来比较麻烦,没有vue方便。同时react的渲染原理是渲染整个组件树,所以,一方面是费性能,而且代码写起来逻辑复杂。但是react对批量数据操作很厉害。
总而言之,项目要求比较高的适合使用react,因为react的社区更活跃一些,尤其是各种UI框架比较稳定、系统,可以信赖。Vue的社区也很活跃,但相对而言各种组件五花八门,大多数不够完善,缺乏系统性和迭代性,对于项目的后期维护和新手入手都不太友好。
从应用上来看,react打出来的包会大一些,相对来说,vue的包小一些,如果项目场景对加载速度由要求,建议使用vue。

3.react的生命周期

挂载
constructor():组件的初始化
componentWillMount:组件将要挂载时促发
render()渲染
componentDidMount:组件第一次挂载完成时触发
更新
shouldComponentDidMount:是否需要更新数据,返回false则不更新
componentWillUpdate:将要更新数据触发
componentDidUpdate:组件更新完成触发
卸载
componentWillUnmount:组件销毁的时候触发
16.3版本后新增:getDerivedStateFrinOrios前面要加上static保留字,声明为静态方法,不然会被react忽略掉,不常用,componentWillMount,componentWillUpdate弃用

4.渲染一个react组件的过程

1.在组件渲染过程中,会先走constructor处理里面的逻辑,如:设置初始的state
2.再执行getDeriveStateFromProps钩子,return prevProps的操作就是将props的内容映射到state中,使用getDeriveStateFromProps钩子,需要先使用this.state
3.组件渲染的过程中都会走一遍componentDidMount钩子
4.如果有触发state更新,钩子会从getDeriveStateFromProps开始处理
5.再执行shouldComponentUpdate钩子,满足条件后返回true触发更新走render函数
6.render之后还要看是否有进一步的更新操作
7.看是否有getSnapshotBeforeUpdate钩子拦截 它的返回值是componentDidupdate钩子的第三个参数snapshot
8.不管有咩有getSnapshotBeforeUpdate,都会走到componentDidUpdate钩子,如果再这个过程中还有操作引起state的内容变化,会再次从getDerivedStateFromProps --- shouldComponentUpdate --- render ---getSnapshotBeforeUpdate --- componentDidUpdate

5.如果进行三次setState会发生什么,循环执行setState组件会一直重新渲染吗

setState这个方法是用来告诉react组件数据有更新,有可能需要重新渲染。它是异步的,react通常会集齐一批需要更新的组件,然后一次性更新来保证渲染的性能,所以进行三次只有一次的效果,并不会导致多次渲染。
此外再使用setState改变状态之后,立刻使用this.state去拿最新的状态往往是拿不到的,如果需要最新的state做业务的话,可以在componentDidUpdate或者setState的回调函数里获取。(官方推荐第一种)

6.react diff的原理

1.React通过制定大胆的diff策略,将 O(n3) 复杂度的问题转换成 O(n) 复杂度的问题;
React是如何将O(n3) 复杂度的问题转换成 O(n) 的?
-只进行同级比较
-不同类的React组件会被当做完全不同的DOM结构而被完全替换
-key prop:开发人员可以通过给Virtual DOM一个唯一的key属性暗示React这是同一个DOM结构,反之若key值不同则会被当做完全不同的DOM结构。
2.React通过分层求异的策略,对tree diff进行算法优化;
3.React通过相同类生成相似树形结构,不同类生成不同树形结构的策略,对component diff进行算法优化。
4.React通过设置唯一key的策略,对element diff进行算法优化;
5.建议,在开发组件时,保持稳定的DOM结构会有助于性能的提升;
6.建议,在开发过程中,尽量减少类似将最后一个节点移动到列表首部的操作,当节点数量过大或更新操作过于频繁时,在一定程度上会影响React的渲染性能。

7.react的传参

8.react和vue的区别

9.react在哪个生命周期获取参数

10.react都用过哪些功能

11.redux的流程图,手画

12.react的性能优化

13.react里的状态管理都有哪些 说一说redux里的actionCreator里都有什么

14.vue和react的适配问题

15.react相比jquery的优势

16.react如何实现性能优化

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,185评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,652评论 3 393
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,524评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,339评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,387评论 6 391
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,287评论 1 301
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,130评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,985评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,420评论 1 313
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,617评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,779评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,477评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,088评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,716评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,857评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,876评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,700评论 2 354

推荐阅读更多精彩内容