前言
React是近几年来前端项目开发非常火的一个框架,其背景是Facebook团队的技术支持,市场占有率也很高。很多初学者纠结一开始是学react还是vue。个人觉得,有时间的话,最好两个都掌握一下。
react全家桶
(1)运用jsx语法
(2)React生命周期
(3)前后端交互用到的fetch/axios
(4)React-router路由
(5)数据流解决方案redux
(6)React-redux
(7)中间件
(8)Dva框架
(9)Umi框架
react的优缺点以及特点
优势:
1. 引入了虚拟DOM和diff算法,提高了Web性能。
2. 组件化,模块化开发。便于我们后期维护性。
3. 单向数据流,比较有序,便于数据管理。
不足:
1. react中只是MVC模式的View部分,所以在react开发中要依赖很多其他模块。
2. 当父组件进行重新渲染时,即使子组件的props或state没有任何改变,也会同样进行重新渲染。(react如何避免重复渲染)
特点:
1. 声明式设计(React采用声明式,可以轻松描述应用。)
2. 高性能(React通过对DOM的模拟,最大限度地减少与DOM的交互。)
3. 灵活(React可以与已知的库或框架很好地配合。)
在React如何做性能优化?
1. 给DOM的遍历上加上唯一的key。提高diff算法效率。
尽量不要用index,如果说在DOM中删了某一个节点,index也就会发生变化,这时候就会重新渲染,所以key值最好使用id。
2. 能用const声明的就用const。
在render里面尽量减少新变量的创建以及函数的指向改变问题。
3. 减少对真实DOM的操作。
4. 如果是用webpack搭建环境的话,当一个包过大加载过慢时,可分成多个包来优化。
5. 使用react-loadable,按需加载路由
6. 定时器,超时器使用过后在unmount中清除。
7. immutable对象管理状态 让状态不能被更改
8. 把component更换成pureComponent 也可以进行优化
你对pureComponent的理解
1.当更新时,如果组件的props或者state都没有改变,render函数就不会触发。
2.省去虚拟DOM的生成和对比过程,达到提升性能的目的。
3.具体原因是因为react自动帮我们做了一层浅比较
简述react项目的开发过程?
答:
安装node环境
使用creat-react-app创建项目
通过npm start运行项目
查看生产环境的项目目录及结构
开始写自己的组件 然后拼装组件
然后在查看项目 没问题了
在通过webpack打包到生产环境中
然后提交到公司git服务器上
然后链条测试
上线
react生命周期及相关用法
react生命周期分为mount阶段、update阶段、unmount阶段。
(1) mount阶段:
componentWillMount:实例挂载之前。进行初始化数据的交互。
Render:渲染组件
componentDidMount:实例挂载完成。在这个函数中,实现前后端数据交互。
(2) update阶段:
componentWillReceiveProps:父组件改变时调用。
sholudComponentUpdate:是否重新渲染组件,一般在这个函数中做组件的性能优化。
componentWillUpdate:组件数据更新前调用
componentDidUpdate:组件数据更新完成时调用
(3) unmount阶段:
componentWillUnmount:一般用来销毁不用的变量或者是解除无用定时器以及解绑无用事件。防止内存泄漏问题。
对前后state浅层比较
react如何避免重复渲染
React 官方提供了 PureRenderMixin 插件,它的功能就是在不需要重新渲染的情况下让shouldComponentUpdate 返回 false, 使用这个插件就能够减少不必要的重新渲染,性能得到也得到一些提升。
但是在 React 的新版本里面,提供了 React.PureComponent,而不需要使用这个插件。 所以说一个较大的组件决定重渲染的时候,我们可以在每一个子组件中绑定(新的)shouldComponentUpdate方法,这样可以减少子组件重新渲染的次数。
无状态组件和有状态组件有什么区别
无状态组件
无状态组件的创建形式使代码的可读性更好,而且减少了大量冗余的代码,以至于只有一个render方法。
组件不会被实例化
组件不能访问this对象,也不能访问生命周期方法
无状态组件只能访问输入的props ,同样的props渲染同样的结果,而且没有副作用。
有状态组件
React.Component创建的组件,其成员函数不会自动绑定this,如果我们没有手动绑定this,就不能获取当前组件实例对象。
React.Component创建的组件,其状态state是在constructor中像初始化组件属性一样去声明。
补充:React.Component有三种手动绑定方法
1》constructor(props) {
super(props);
this.handleClick = this.handleClick.bind(this); //构造函数中绑定
}
2》<div onClick={this.handleClick.bind(this)}></div> //使用bind来绑定
3》<div onClick={()=>this.handleClick()}></div> //使用arrow function来绑定
如何选择哪种方式创建组件
只要有可能,尽量使用无状态组件。
如果需要state、生命周期方法等,使用class的创建组件
react在哪个生命周期做优化?
可以在shouldComponentUpdate这个方法进行优化,用来判断是否调用 render 方法重绘 dom。
因为 dom 的重绘非常消耗性能,所以可以在这个方法中去做dom的diff算法的优化,这样就可以极大的提高性能。
但对于我们中级工程师来说,一般我不会去修改shouldComponentUpdate这个方法。而是直接去使用。True/false
react组件间传值。(组件间通信方式)
(1)props传值,父组件通过props向子组件传值,子组件通过回调函数向父组件传值
(2)redux跨级通信。
(3)通过prop-types的context实现跨级通信
跨级组件间双向通信:使用 context 对象,根组件和其他所有子孙通信,
不太适合组件间通信(可以实现,不好维护)
(4)使用事件订阅实现非嵌套组件间通信,也可以实现跨级组件间通信
porps和state的区别?
props:一般用于父组件向子组件通信,在组件之间通信使用。
state:一般用于组件内部的状态维护,更新组件内部的数据状态,更新子组件的props等。
在react如何阻止冒泡事件?
阻止冒泡事件分两种情况
A、 阻止合成事件间的冒泡,用e.stopPropagation();
B、 阻止js原生事件的冒泡,用e.nativeEvent.stopPropagation();
补充:如何阻止事件冒泡、阻止默认动作?
阻止事件冒泡:
e.stopPropagation(IE9+及其他浏览器),
window.e.cancelBubble = true(IE678)
阻止默认事件:
e.preventDefault()-->IE9+及其他浏览器
window.e.returnValue = false IE678
jQuery:
阻止事件冒泡:e.stopPropagation()
阻止默认事件:epreventDefault()
同时阻止事件冒泡和默认事件: return false
对react中事件机制的理解
Reac事件是合成事件,不是原生事件。
合成事件和原生事件的区别:
(1) 写法不同:合成事件是camal命名法,原生事件是全部小写
(2) 绑定位置不同:合成事件全部委派到document上,原生事件绑定到真实dom上。所以一般是在componentDidMount中或者ref回调函数中绑定,在componentWillUnmount阶段进行解绑,防止内存泄漏。
(3) 执行顺序不同:先执行原生事件,事件冒泡至document上,再执行合成事件。
react怎么从虚拟dom中拿出真实dom?
在React中如何获取真实dom?
通过refs获得 DOM 元素或者某个组件实例。
我们可以为元素添加 ref 属性,在回调函数中接收该DOM元素,该DOM元素会作为回调函数的第一个参数返回。
或者可以给ref传字符串。通过this.refs获取dom。
例如:<input ref=((input)=>{return this.name=input}) />, this.name.value取值
或者 <input ref="name" />,this.refs.name取值。
为什么虚拟DOM可以提高性能?
当数据变化的时候,无需整体的重新渲染,而是局部刷新。虚拟DOM它是以js的形式存在,计算性能会比较好。而且由于减少对真实DOM的操作次数。性能会有很大提升。
diff算法原理 / 什么是diff算法(diff算法的理解)
对新旧两棵DOM树进行同层比较。
给每层元素添加唯一的 key 值。提高diff算法效率。
React 只会匹配相同组件名字
调用组件setState 方法的时候, React 将它标记为 dirty.到每一个事件循环结束, React 检查所有标记 dirty 的组件 重新渲染.这样就实现了局部刷新的效果。
react 中 keys 的作用是什么?
在开发过程中,我们需要保证某个元素的 key 在其同级元素中具有唯一性。在 React Diff 算法中 React 会借助元素的 Key 值来判断该元素是新近创建的还是被移动而来的元素,从而减少不必要的元素重渲染。此外,React 还需要借助 Key 值来判断元素与本地状态的关联关系,因此我们绝不可忽视转换函数中 Key 的重要性。