前言:
想零碎学习前端面试题,强烈推荐浏览 在线电子书(反对手机版,不断更新) 。
本书特点:零碎全面(涵盖前端核心技术点),简洁,针对性强(针对面试场景设计)。
欢送在github上留言反馈
react 如何实现keep-alive?
Keep-alive是缓存路由应用的,保留之前路由的状态
实现办法:
应用npm库:
- react-router-cache-router
- React-activation
react错误处理?
次要的api(生命周期):
- componentDidCatch(error,errorInfo): 同样能够将谬误日志上报给服务器
- getDerivedStateFromError(error):更新state使下一次渲染可能显示降级后的UI
注意事项:
- 仅可捕捉其子组件的谬误,无奈捕捉其本身的谬误
你有应用过suspense组件吗?
动静加载(异步组件)加载时会有提早,在提早期间能够将一些内容展现给用户,比方:loading
(react16.6新增的API)
const resource = fetchProfileData();function ProfilePage() { return ( <Suspense fallback={<h1>Loading profile...</h1>}> <ProfileDetails /> <Suspense fallback={<h1>Loading posts...</h1>}> <ProfileTimeline /> </Suspense> </Suspense> );}function ProfileDetails() { // 尝试读取用户信息,只管该数据可能尚未加载 const user = resource.user.read(); return <h1>{user.name}</h1>;}function ProfileTimeline() { // 尝试读取博文信息,只管该局部数据可能尚未加载 const posts = resource.posts.read(); return ( <ul> {posts.map(post => ( <li key={post.id}>{post.text}</li> ))} </ul> );}
参考资料:
何为 Suspense?
怎么动静导入组件,按需加载,代码宰割?
只有当组件被加载时,对应的资源才会导入
- react-loadable: npm 库 按需加载
- react.lazy: 原生反对(新版本16.6),配合suspense一起应用,还要webpack code splitting
- require(component) : 在特定条件下,动静引入
react Context介绍?
次要api:
- react.createContext : 创立store
- [store].Provider: 包裹组件,并通过value 字段传递参数
- [store].Consumer: 获取包裹组件内容
创立过程:
- 【创立store】:通过 React.createContext 创立 AppContext 实例
- 【包裹整个组件】:应用AppContext.Provider组件
- 【注入全局变量】,在AppContext.provider组件上
- 【引入全局变量】: 通过 AppContext.Consumer组件 ,子组件的回调,获取store中的内容和办法
为什么react并不举荐咱们优先思考应用context?
- 【实验性】context目前还处于试验阶段,可能会在前期有大扭转,防止给将来降级带来麻烦
- 【稳定性】context的更新须要通过 setState触发,然而这并不是牢靠的。context劫持跨组件拜访,然而,如果两头子组件通过一些办法不响应更新,比方 shouldComponentUpdate返回false,那么不能保障 context的更新肯定达应用context的子组件。因而,context的可靠性须要关注 。不过是更新的问题,在新版的APP中得以解决
只有你能确保 context是可控的,正当应用,能够给react组件开发带来弱小体验
render函数中return如果没用应用()会用什么问题吗?
论断:如果换行就有问题
起因:babel会将jsx语法编译成js,同时会在每行主动增加分号(;), 如果 return 换行了,那么就变成了return; 就会导致报错
//这样会报错,react class App extends React.Component{ render(){ return <div>111</div> } }
介绍下渲染属性render props?
性能:给纯函数组件加上state,响应react的生命周期
长处:hoc的毛病render prop 都能够解决
- 扩展性限度:hoc无奈从内部拜访子组件的state,因而无奈通过shouldComponentUpdate 过滤掉不必要的更新,react在反对es6 class之后提供了react.PureComponnet来解决这个问题
- ref传递问题:ref被隔断,起初的react.forwardRef来解决这个问题
- Wrapper Hell(多层包裹):多层包裹,形象减少了复杂度和了解老本
- 命名抵触:屡次嵌套,容易笼罩老属性
- 不可见性:hoc相当于黑盒
毛病:
- 应用繁琐:hoc复用只需借助装璜器语法(decorator)一行代码进行复用,render props无奈做到如此简略
- 嵌套过深:render props 尽管解脱了组件多层嵌套的问题,然而转化为了函数回调的嵌
参考资料:
React 中的 Render Props
React如何进行组件/逻辑复用?
- HOC(高阶组件)
- 属性代理
- 反向继承
- 渲染属性(render props)
- react-hooks
- Mixin (已废除,不探讨)
PureComponent组件介绍?
当props/states扭转时,PureComponent会对它们进行浅比拟,起到性能优化的作用;相当于在component组件的shouldComponentUpdate办法中进行了比拟才渲染
特地阐明 :
- 援用对象的数据倡议不要应用PureComponnet组件,否则会有坑
JSX实质是什么?
JSX 应用js的模式来写html代码
jsx自身是语法糖,无奈间接被浏览器解析,须要通过babel或者typescript来转换成 js。
许多蕴含预配置的工具,例如:create- react app 和 next.js 在其外部也引入了jsx转换。
旧的 JSX转换会把jsx 转换为 React.createElement调用。
jsx调用js自身的个性来动态创建UI,与于传统模式下的模板语法不同
react中组件通信的几种形式?
react组件之前通信次要要四种形式
- 父子组件:props,props回调
- 兄弟组件:独特父级,再由父节点转发props,props回调
- 跨级组件:context对象,注入全局变量:getChildContext; 获取全局变量:this.context.color;
- 非嵌套组件:应用事件订阅,向事件对象增加监听器,和触发事件来实现组件之间的通信,通过引入event模块实现
- 全局状态管理工具:Redux,Mobox保护全局store
react UI组件和容器组件的区别与利用?
容器组件:领有本人的状态,生命周期
UI组件:只负责页面UI渲染,不具备任何逻辑,性能繁多,通常是无状态组件,没有本人的state,生命周期。
react生命周期?
react 生命周期支流的次要有2个大的版本;
一个是 v16.3之前的:
一个是v16.3之后的;
v16.3之前 的生命周期次要分为4个阶段,8个生命周期:
- 初始化值阶段 initialization: getDefaultProps,getInitialState;
- 初始阶段 mount: componentWillMount,componentDidMount;
- 更新阶段 update:componetWillReceiveProps ,shouldComponetUpdate ,componentWillUpdate,
- 销毁阶段 unmount:componetWillUnmount;
v16.3之后的生命周期:
新引入了两个生命周期:
- getDerivedStateFromProps
- getSnapshotBeforeUpdate
提醒3个不平安的生命周期(在v17中要被删除)
- componentWillMount
- componentWillReceiveProps
- componetWillUpdate
新的命令周期:
React的申请放在componentWillMount有什么问题?
错误观念:componentWillMount中能够提前进行异步申请,防止白屏工夫;
剖析:componentWillMount比 componentDidMount相差不了多少微秒;
问题
- 在SSR(服务端渲染)中,componentWillMount生命周期会执行两次,导致多余申请
- 在react16进行fiber重写后,componentWillMount 可能在一次渲染中屡次调用
- react17版本后要删除componentWillMount生命周期
目前官网举荐异步申请在 componentDidMount中
create-react-app有什么长处和毛病?
长处:
疾速生成架手架
毛病:
- 默认不引入polyfill,须要在入口引入babel-polyfill
- 默认只反对css热加载,不反对html,js热加载(举荐应用:react-hot-loader)
介绍下Immutable?
Immutable是一种不同变的数据类型,数据一旦被创立,就不能更改的数据,每当对它进行批改,就会返回新的immutable对象,在做对象比拟时,能晋升性能;
实现原理:
immutable实现原理是长久化数据结构,构造共享,防止对数据对象进行深拷贝;
react、vue有什么区别?
区别 | react | vue |
---|---|---|
模板引擎 | JSX,更多灵便,纯js语法(能够通过babel插件实现模板引擎) | vue template,指令,更加简略 (vue也能够应用jsx语法) |
复用 | Mixin->Hoc->render props->hook | Mixin-> slot->Hoc(比拟用,模板套模板,奇怪做法)-> vue3.0 function baseed APi |
性能优化形式 | 手动优化:PureComponent/shouldComponentUpdate | 主动优化:准确监听数据变动 |
监听数据变动的实现原理 | 手动:通过比拟援用的形式(diff) | 主动:getter/setter以及一些函数的劫持(当state特地多的时候,当watcher也会很多,导致卡顿) |
数据流 | 数据不可变,单向数据流,函数式编程思维 | 数据可变,双向数据绑定,(组件和DOM之间的),响应式设计 |
设计思维 | all in js (html->jsx, css->style-component/jss) | html,,css,js写在一个文件中,应用各自的形式 |
性能内置 | 少(交给社区,reactDom,propType) | 多(使用方便) |
长处 | 大型项目更适合 | 兼容老我的项目,上手简略 |
数据流比照:
react 数据更改逻辑:
vue数据更改逻辑:
参考资料:
Vue 和 React 的长处别离是什么?
集体了解Vue和React区别
Vue与React的区别之我见
让react反对vue的template语法如何实现?
基于形象语法树AST,实现解析模板指令的插件(应该是实现一个babel插件,因为jsx解析成js语法,是通过babel解析的)
对react的认识,它的优缺点?
长处:
- 提供了申明式的编程思维
- 提供了组件化的开发思维,大大提高前端开发的效率
- 引入了虚构dom的概念,使得react能够跨端进行类各界面开发,react native,react vr,ssr;
- 引入了diff算法,进步了渲染效率
有余:
- 侵入性强,对老代码只能重做,不能局部集成(比方vue);
jsx语法有什么特点相比js?
jsx以js为核心来写html代码
jsx语法特点:
- 反对js+html混写;
- jsx编译更快比html
长处:jsx类型平安的,在编译过程中就能发现错误;
create-react-app 如何实现,蕴含哪些内容,如何自定义一个脚手架?
定义:create-react-app是一个疾速生成react我的项目的脚手架;
长处:
- 无需设置webpack配置
毛病:
- 暗藏了webpack,babel presets的设置,批改起来比拟麻烦
HOC
什么是高阶函数?
如果一个函数,承受一个或多个函数作为参数或者返回一个函数,就可称之为高阶函数
特点:
- 是函数
- 参数是函数
- or 返回是函数
eg: array 对象中的 map,filter,sort办法都是高阶函数
function add(x,y,f){ return f(x)+f(y) } let num=add(2,-2,Math.abs) console.log(num);
什么是高阶组件?
高阶组件就是一个函数(react函数组件),接管一个组件,解决后返回的新组件高阶组件是高阶函数的衍生
外围性能:实现形象和可重用性
它的函数签名能够用相似hashell的伪代码示意
- W(WrappedComponent)被包裹的组件,当传参数传入hoc函数中
- E(EnhancedComponent)返回的新组件
hocFactory:: W: React.Component => E: React.Component
高阶组件,不是真正意义上的组件,其实是一种模式;
能够对逻辑代码进行抽离,或者增加某个共用办法;
高阶组件是装璜器模式在react中的实现
主要用途:
- 代码重用,逻辑和疏导形象
- 渲染劫持
- 状态形象和管制
- Props 管制
参考资料:React 中的高阶组件及其利用场景
hoc存在的问题?
一、静态方法失落
二、refs属性不能透传
三、反向继承不能保障残缺的子组件树被解析
hoc高阶组件应用场景?
react-redux :connect就是一个高阶组件,接管一个component,并返回一个新的componet,解决了监听store和后续的解决 ;
react-router :withrouter 为一个组件注入 history对象;
你在我的项目中怎么应用的高阶组件?
不谈场景的技术都是在耍流氓
权限管制://也能够在history路由切换的时候,加个监听办法,在顶层做监听解决,不过页面会闪一下
- 页面级别:withAdminAuth(Page),withVIPAuth(Page)
- 页面元素级别:
- 组件渲染性能追踪
- 页面复用
- 全局常量(通过接口申请),能过hoc抽离 //也能够通过全局状态治理来获取
- 对以后页面的一些事件的默认执行做阻止(比方:阻止app的默认下拉事件)
参考资料:
React 中的高阶组件及其利用场景
高阶组件和父组件的区别?
高阶组件能够重写传入组件的state,function,props;能够对代码逻辑进行抽离,重写 ;
父组件只是管制子组件的view层;
hook
hooks原理剖析,如何实现?
参考:
[[译] 深刻 React Hook 零碎的原理](https://juejin.cn/post/684490...
hooks与 react 生命周期的关系?
hooks组件有生命周期,函数组件没有生命周期
hooks的生命周期其实就是:
- useState
- useEffect
- useLayoutEffect
//hooks模仿生命周期函数,与class的生命周期有什么区别
react hook优缺点?
react hook是v16.8的新个性;
传统的纯函数组件,
react hooks设计目标,加强版的函数组件,齐全不应用‘类’,就能写出一个全功能的组件,不能蕴含状态,也不反对生命周期), hook在无需批改组件构造的状况下复用状态逻辑;
劣势:
- 简洁:react hooks解决了hoc和render props的嵌套问题,更加简洁 (在不应用class的状况下,应用state及react其余个性(省的把纯函数组件/其余组件改来改去))
- 解耦:react hooks能够更不便地把UI和状态拆散,做到更彻底的解耦
- 组合:hooks 中能够援用另外的hooks 造成新的hooks, 组合变幻无穷
函数敌对:react hooks为函数组件而生,解决了类组件的几大问题
- 解决了this的指向问题
- 让组件更好的复用(老的class组件简短、蕴含本身的状态state)
- 让react编程格调更取向函数式编程格调,应用function代替class
毛病(坑):
- 【useState数组批改】应用useState批改array的值时,不要应用push/pop/splice等间接更改数据对象的办法,否则无奈批改,应该应用解构或其余变量代替
- 【hook执行地位】不要在循环、条件 、嵌套中调有hook,必须始终在react函数顶层应用Hook,这是因为react须要利用调用程序来正确更新相应的状态,以及调用相应的钩子函数,否则会导致调用程序不一致性,从而产生难以预料到的结果
- 响应式的useEffect: 当逻辑较简单时,可触发屡次
- 状态不同步:函数的运行是独立的,每个函数都有一份独立的作用域。函数的变量是保留在运行时的作用域外面,当咱们有异步操作的时候,常常会碰到异步回调的变量援用是之前的,也就是旧的(这里也能够了解成闭包场景可能援用到旧的state、props值),心愿输入最新内容的话,能够应用useRef来保留state
- 毁坏了pureComponent、react.memo 浅比拟的性能优化成果(为了取最新的props和state,每次render都要从新创立事件处函数)
- react.memo 并不能齐全代替 shouldComponentUpdate (因为拿不到 state change ,只针对 props change)
参考资料:
hooks中的坑,以及为什么?
hooks注意事项?
- 不同hook中,不要应用判断(if)
react hook底层是基于链表(Array)实现,每次组件被render时,会按程序执行所有hooks,因为底层是链表,每个hook的next指向下一个hook,所有不能在不同hooks调用中应用判断条件,因为if会导致程序不正确,从而导致报错
//谬误示例function App(){const [name,setName]=useState('xz');//这里不能应用if判断if(configState){ const [age,setAage]=useState('0')}}
react hooks异步操作注意事项?
一、如何在组件加载时发动异步工作
二、如何在组件交互时发动异步工作
三、其余陷阱
参考资料:
React Hooks 异步操作踩坑记
react hooks API有哪些?
hooks(实质是一类非凡的函数,能够为函数式注入一些非凡的性能)的次要api:
根底Hook:
- useState : 状态钩子,为函数组件提供外部状态
- useEffect :副作用钩子,提供了相似于componentDidMount等生命周期钩子的性能
- useContext :共享钩子,在组件之间共享状态,能够解决react逐层通过props传递数据;
额定的Hook:
- useReducer: action钩子,提供了状态治理,其基本原理是通过用户在页面上发动的action,从而通过reduce办法来扭转state,从而实现页面和状态的通信,应用很像redux
- useCallBack:把内联回调函数及依赖项数组作为参数传入 useCallback,它将返回该回调函数的memoized版本,该回调函数仅在某个依赖项扭转时才会更新
- useMemo:把""创立""函数和依赖项数组作为参数传入 useMemo,它仅会在某个依赖项扭转时从新计算, 能够作为性能优化的伎俩。
- useRef:获取组件的实例,返回一个可变的ref对象,返回的ref对象在组件的整个生命周期内放弃不变
- useLayoutEffect: 它会在所有DOM变更后同步调用effect
- useDebugValue
demo:
//useMemo const memoizedValue = useMemo(() => computeExpensiveValue(a, b), [a, b]);//useReducerconst [state, dispatch] = useReducer(reducer, initialArg, init);
参考资料: Hook API 索引
useEffect 介绍?
useEffect能够让你在函数组件中执行副应用(数据获取,设置订阅,手动更改React组件中的DOM)操作
默认状况下每次函数加载完,都会执行(不要在此批改state,防止循环调用),useEffect相当于是class组件中的componentDidMount,componentDidUpdate,componentWillUnMount三个函数的组合
参数阐明:
参数一:
- type:function
- 执行的函数
参数二(可选):监听值
- type:array
要监听的值(当监听值扭转才执行,如果只想执行一次能够传一个[]):如果值没有扭转,就不必执行effect函数,能够传入监听的值
return callBack: 清理函数,执行有两种状况
- componentWillUnmount
- 在每次userEffect执行前(第二次开始)
分类:
一)不须要革除
react更新DOM之后运行的一些额定代码,操作实现即可疏忽
应用场景:
- 手动变更DOM(批改title)
- 记录日志
- 发送埋点申请
二)须要革除
effect返回一个函数,在革除时调用 (相当于class中componentWillUnmount生命周期)
因为增加/删除订阅代码的紧密性,所以useEffect设计在同一个中央,如果effect返回一个函数,react将会在执行革除时调用它
应用场景:
- 订阅内部数据源(避免数据泄露)
- 设置页面题目,返回重置原题目
useEffect和useLayoutEffect区别?
- useEffect相比componentDidMount/componentDidUpdate不同之处在于,应用useEffect调度的effect不会阻塞浏览器更新屏幕,这让利用响应更快,大多数据状况下,effect不须要同步地执行,个别情况下(例如测量布局),有独自的useLayoutEffect hook可应用,其API与useEffect雷同
- useEffect在副应用完结之后,会提早一段时间执行,并非同步执行。遇到dom操作,最好应用userLayoutEffect
- userLayoutEffect 外面的callback函数会在DOM更新实现后立刻执行,然而会在浏览器进行任何绘制前运行实现,阻塞了浏览器的绘制
useContext介绍?
共享状态钩子,在组件之间共享状态,能够解决react 逐层通过props传递数据的问题
应用流程(应用流程和react-redux差不多):
- 创立store:通过 createContext Api
- 包裹整个组件:通过store中的Provider办法
- 注入全局变量,provider组件中
- 引入全局变量: 通过 useContext,传入store的名字,返回一个store对象内容
const { useState, createContext, useContext } = React; function App(){ //创立store const AppContext=createContext({}); function A(){ //从store中取值 const {name}=useContext(AppContext); return <div>A组件Name:{name}</div> } function B(){ //从store中取值 const {name}=useContext(AppContext); return <div>B组件Name:{name}</div> } //在顶层包裹所有元素,注入到每个子组件中 return ( <AppContext.Provider value={{name:'xz'}}> <A/> <B/> </AppContext.Provider> ) } ReactDOM.render( <App />, document.getElementById('app') );
参考资料:
React Hooks 罕用钩子及基本原理
useReducer介绍?
action 钩子,提供了状态治理
实现过程(和redux差不多,但无奈提供中间件等性能 ):
- 用户在页面上发动action (通过dispath办法)
- 从而通过reducer办法来扭转state,从而实现 页面和状态的通信
如何创立本人的hooks?
实现步骤:
- 定义一个 hook函数,并返回一个数组(外部能够调用react其余hooks)
- 从自定义的hook函数中取出对象的数据,做业务逻辑解决即可
useCallBack介绍?
useState介绍?
useState
是一个内置的 React Hook。useState(0)
返回一个元组,其中第一个参数count
是计数器的以后状态,setCounter
提供更新计数器状态的办法。
...const [count, setCounter] = useState(0);const [moreStuff, setMoreStuff] = useState(...);...const setCount = () => { setCounter(count + 1); setMoreStuff(...); ...};
Fiber
什么是Fiber?是为了解决什么问题?
react fiber 是一种基于浏览器的单线程调度算法
react算法的扭转(Fiber实现的原理):
- 16版本之前: reconcilation 算法实际上是递归,想要中断递归是很艰难的
- 16版本之后:开始应用循环来代替之前的递归
fiber: 一种将 recocilation(递归diff),拆分成无数据个小工作的算法;它随时可能进行,复原。进行复原的机会取决于以后的一帧(16ms)内,还有没有足够的工夫容许计算
fiber是react16中新公布的个性;
解决的问题:
react在渲染过程时,从setState开始到渲染实现,两头过程是同步;
如果渲染的组件比拟大,js执行会长工夫占有主线程,会导致页面响应度变差,使得react在动画,手势等利用中成果比拟差;
实现过程及原理(核心理念就是:time slicing):
- 拆分:把渲染过程进行拆分成多个小工作
- 查看:每次执行完一个小工作,就去对列中查看是否有新的响应须要解决
- 继续执行:如果有就执行优化及更高的响应事件,如果没有继续执行后续工作
refs
react的refs有什么用,应用场景?
react 次要提供了一种规范数据流的形式来更新视图;
然而页面某些场景是脱离数据流的,这个时候就能够应用 refs;
react refs 是用来获组件援用的,取后能够调用dom的办法;
应用场景
- 治理焦点、抉择文本或者媒体播放时,获取焦点 this,refs.inputPhone.focus();
- 触发式动画
- 与第三方DOM库整合
refs 注意事项:
不能在无状态组件中应用refs
Virtual DOM
什么是 Virtual DOM,它的长处?
Virtual DOM 是对 DOM的形象,实质是js对象,这个对象就是更加轻量级对DOM的形容
长处:
- 【性能优化】操作实在DOM慢,频繁变动DOM会造成浏览器回流/重绘,虚构DOM形象的这一层,在patch(batching批处理)过程中尽可能地一次性将差别更新到DOM中,升高更新DOM的频率
- 【数据驱动程序】应用数据驱动页面,而不是操作DOM的模式
- 【跨平台】:node层没有DOM,然而react却能够在node层(SSR)运行
能够通过chrome的console面板中的
参考资料:
虚构DOM原理
Virtual DOM 的创立,更新,diff 过程?
虚构DOM的创立
虚构DOM是对实在DOM的形象,依据不同的需要,能够做出不同的形象,比拟 snabbdom.js 的形象形式
根本构造
/* * 虚构DOM 实质是一个JS对象,这个对象是更加轻量级的对DOM的形容 * */ //tagName,props,children const element={ tagName:'ul', props:{ id:'list' }, children: [{ tagName:'li', props:{ class:'item' }, children:['item1'] //item1 只是没有包裹的子节点 }] }
react diff 介绍?
传统的页面更新,是间接操作dom来实现的,比方原生js或者jquery,然而这种形式性能开销比拟大;
react 在初始化的时候会生成一个虚构dom,每次更新视图会比拟前后虚构dom的区别;
这个比拟办法就是diff算法,diff算法很早就曾经呈现了;然而react的diff算法有一个很大区别;
react diff 算法劣势:
传递diff算法:
- 遍历模式:循环递规对节点进行顺次比照
- 工夫算法复杂度: o(n^3)次方,n代表节点数
react diff 算法:
- 遍历模式:采纳逐层比拟的形式(DOM的特点,个别很少呈现跨层级的DOM变更)
- 工夫算法复杂度:O(n)次方;
目前社区里的两个算法库:
- snabbdom.js(双端比拟算法):v2.0借鉴
inferno.js(速度更快): vue3.0借鉴
- 核心思想:利用LIS(最长递增序列)做动静布局,找到最小的挪动次数
react 算法 PK inferno.js
react diff:
- 把 a,b,c挪动到他们相应的地位
- 再+1共三步操作
- inferno: 间接把d挪动到最后面,一步到位
A:[a,b,c,d]B:[d,a,b,c]
同层比拟
参考资料:
diff 算法原理概述
setState
setState之后产生了什么?
- 【数据合并】多个setState会进行数据合拼,筹备批量更新
- 【数据合并到组件的以后状态】生成新的 react tree
- 【更新UI】比拟应用diff算法,比拟新旧 virtual dom,,最小化DOM操作
- 【执行回调函数】setState第二个参数
setState到底是同步还是异步?
论断:有时体现出同步,有时体现出“异步“
体现场景:
- 同步:setTimeout,原生事件;
- 异步:合成事件,钩子函数( 生命周期 );
react异步阐明:
setState 异步并不是说外部代码由异步代码实现,其实自身执行过程和代码都是同步的,只是合成事件和钩子函数的调用程序在更新之前;在异步更新中,屡次setState前面的值会笼罩后面的;
为什么setState不设计成同步的?
- 放弃外部的一致性,和状态的安全性
放弃state,props.refs一致性;
- 性能优化
react会对根据不同的调用源,给不同的 setState调用调配不同的优先级;
调用源包含:事件处理、网络申请、动画 ;
- 更多可能性
异步获取数据后,对立渲染页面;放弃一致性,
react事件
react事件机制?
一、事件注册
- 【组件装载】装载/更新
- 【事件注册与卸载】能过lastProps,nextProps判断是否有新增、删除事件别离调用事件注册、卸载办法
- 【事件存储】能过eventPluginHub, enqueuePutListener 进行事件存储
- 【获取document对象】
- 【事件冒泡/捕捉】依据事件名称(onClick,onCaptureClick)判断
- 【事件监听】:addEventListener,addachEvent(兼容IE)
- 【注册原生事件】给document注册原生事件回调为dispatchEvent (对立的事件散发机制)
二、事件存储
{onClick:{ fn1:()=>{} fn2:()=>{}},onChange:{ fn3:()=>{} fn4:()=>{}}}
三、事件触发/执行
事件执行程序(原生事件与合成事件)
dom child
- dom parent
- react child
- react parent
- dom document
四、合成事件
- 【调用EventPluginHub】 的 extractEvents 办法
- 【遍历所有EventPlugin】 用来解决不同事的工具办法
- 【返回事件池】在每个 EventPlugin 中依据不同的事件类型返回
- 【取出合成事件】从事件池中取出,如为空,则创立
- 【取出回调函数】依据元素nodeid(惟一标识key) 和事件类型 从listenerBink 中取出 回调函数
- 【返回合成事件】返回带有合成事件参数的回调函数
参考资料:
【React深刻】React事件机制
react事件与原生事件的区别?
语法区别:
- 【事件名小驼峰】react事件命令采纳小驼峰式,而不是纯小写
- 【事件办法函数】应用JSX语法时,你须要传入一个函数作为事件处理函数,而不是一个字符串
react事件的长处
- 【兼容性更强】合成事件:react事件对生成事件进行了包装,解决了浏览器兼容性问题(阻止浏览器默认行为,阻止冒泡)
react事件与原生事件的执行程序?
- 原生事件,顺次冒泡执行
- react合成事件,顺次冒泡执行
- document 事件执行
/* * 执行后果: * 1. dom child * 2. dom parent * 3. react child * 4. react parent * 5. dom document * */
react事件与原生事件能够混用吗?
react事件与原生事件最好不要混用
起因:
- 原生事件如果执行
stopProagation
办法,则会导致其余 react 事件生效,因为所有元素的事件将无奈冒泡到 document上
react-router
React-Router怎么设置重定向?
应用 重定向 Api : Redirect