react并不是将click事件绑定到div真实的dom上,而是在document处监听了所有的事件。当事件发生并且冒泡在document处时,react将事件内容封装并交给真正的处理函数处理,这样的方式不仅仅减少了内存的消耗,还能在挂件在销毁时统一订阅和移除事件。
除此之外,冒泡到document上的事件也不是原生的浏览器事件,而是由react自己实现的合成事件。因此不想事件冒泡,应该调用event.preventDefault()方法,而不是调用event.stopPropagation()方法。
So,
React
一、组件基础
1. React 事件机制
react并不是将click事件绑定到div真实的dom上,而是在document处监听了所有的事件。当事件发生并且冒泡在document处时,react将事件内容封装并交给真正的处理函数处理,这样的方式不仅仅减少了内存的消耗,还能在挂件在销毁时统一订阅和移除事件。 除此之外,冒泡到document上的事件也不是原生的浏览器事件,而是由react自己实现的合成事件。因此不想事件冒泡,应该调用event.preventDefault()方法,而不是调用event.stopPropagation()方法。 So,
react在document处监听了所有事件,当事件发生并冒泡到document,将事件内容封装成合成事件并交给真正的处理函数处理
4. React 高阶组件、Render props、hooks 有什么区别,为什么要不断迭代
高阶组件HOC是react用于复用组件逻辑的一种高级技巧。HOC自身不是React API的一部分,他是基于React的组合特性而形成的设计模式。具体而言,高阶组件是参数为组件,返回值为新组件的函数。HOC接受一个组件和额外的参数(如果需要),返回一个新的组件。
render props是一种在React组件之间使用一个值为函数的prop共享代码的简单技术。render prop是一个用于告知组件需要渲染什么内容的函数prop
通常,render props和高阶组件只渲染一个子节点。让Hook来服务这个使用场景更简单,Hook可以帮助减少桥套。
hoc、render props、hook都是为了解决代码复用的问题。
hoc接收一个组件和一个可选的参数,返回一个组件。通过包装现有的组件来添加新的行为和功能
render props接收一个返回react函数,将render的渲染注入到组件内部。父组件通过一个函数prop将渲染逻辑传给子组件,子组件通过函数获取渲染要渲染的内容。
hook是react16.8的新特性,可以使用状态useState、生命周期useEffect、上下文useContext
5. 对React-Fiber的理解,它解决了什么问题?
React 15在渲染是会递归对比虚拟Dom树,再出需要变动的节点,然后同步更新他们,一气呵成。这个过程React会占据浏览器资源,会导致用户触发的事件得不到响应,导致用户感觉卡顿。
React通过fiber架构让渲染过程可中断,让浏览器及时响应用户交互。
此外fiber还可以分批延时对DOM进行操作,避免一次性操作大量的DOM节点
9. React 高阶组件是什么,和普通组件有什么区别,适用什么场景
普通组件
render(){ return <WrappedComponent data={this.state.data} {...this.props}/>; } }
const BlogPostWithSubscription = hoc(BlogPost, (DataSource, props)=>DataSource.getBlogPost(props.id));
//普通组件 import React, {Component} from "react";
class MyCompoent extends Component{ render(){ return
}
function MyCompoent(props) { return
}
enqueueSetState将新的state放进组件的状态队列,调用enqueeUpdate来处理将要更新的实例
在enqueueUpdate方法引出一个关键的对象batchingStrategy,该对象所具备的isBatchingUpdates属性直接决定了当下是要走更新流程,还是应该排队等待;如果轮到执行,就调用batchUpdates方法发起更新流程。由此可以推测,batchingStrategy或许正是React内部专用于批量更新的对象
setState
enqueueSetState:将新的状态放入组件的状态队列,调用enqueueUpdate来处理要更新的视力
enqueueUpdate
isBatchingUpdates,是否批量创建/更新组件
2. React setState 调用之后发生了什么?是同步还是异步?
在代码中调用setState,React会将传入的参数对象与组件当前的状态合并,然后触发调和过程,经过调和过程。React会以相对高效的方式根据新的状态React元素树并且着手重新渲染整个UI界面。 React得到元素树之后,React会自动计算出新的树和老树的节点差异,然后根据差异对界面进行最小化重新渲染。在差异计算算法中,React能够精确地知道哪些位置发生了改变以及如何改变,这就保证了按需更新,而不是重新渲染。如果短时间频繁setState,React会将state的改变压入栈,在合适的时机,批量更新state和视图,达到提高性能的效果。
7. 在React中组件的this.state和setState有什么区别?
this.state通常是用来初始化state,setState是用来修改state值的。如果直接修改state页面是不会更新的。
9. React组件的state和props有什么区别?
三、生命周期
1. React的生命周期有哪些?
四、组件通信
1. 父子组件的通信方式?
class Parent extends Component { callback(msg){ console.log(msg) } render(){ return
}
}
3. 非嵌套关系组件的通信方式?
5. 组件通信的方式有哪些
五、路由
1. React-Router的实现原理是什么?
7. React-Router的路由有几种模式?
六、Redux
1. 对 Redux 的理解,主要解决什么问题
react是视图层框架,redux是一个用来管理数据状态和UI状态的js应用工具。随着js单页应用变得复杂,js需要更多状态,redux就是为了降低管理难度的。 在redux中,提供了一个叫store的统一仓储库,组件通过dispatch将state直接传入store,不用通过其他组件。并且组件通过subscribe从store获取到state的改变,使用了redux,所有的组件都可以从store获取到所需的state,他们也能从store获取到state的改变。 解决的问题:react-redux的作用是将redux的状态机和react的ui绑定在一起,当你dispatch action改变state的时候,会自动更新页面。
2. Redux 原理及工作流程
工作流程
9. Redux 和 Vuex 有什么区别,它们的共同思想
七、Hooks
1. 对 React Hook 的理解,它的实现原理是什么
hook让组件实现变得更加简洁。 闭包
2. 为什么 useState 要使用数组而不是对象
3. React Hooks 解决了哪些问题?
八、虚拟DOM
1. 对虚拟 DOM 的理解?虚拟 DOM 主要做了什么?虚拟 DOM 本身是什么?
虚拟DOM是一个React的优化手段,通过在内存中维护一份轻量的DOM副本,实现更高效的渲染和更新机制。 工作流程:
2. React diff 算法的原理是什么?
diff算法是为了找出新旧虚拟DOM之间的差异,以最小化对实际DOM的操作。 算法的核心:
九、其他
5. 对 React 和 Vue 的理解,它们的异同
12. 在React中遍历的方法有哪些?
遍历数组,map&&forEach
遍历对象,map for in
19. 对React SSR的理解
服务端渲染是数据与模板组成的html,即html=数据+模板。将组件或页面通过服务器生成html字符串,再发送到浏览器,最后将静态标记混合为客户端上完全交互的应用程序。页面没使用服务渲染,当请求页面时,返回的body为空,之后执行js将html结构注入到body里,结合css显示出来
20. 为什么 React 要用 JSX?
react并没有强制使用jsx,jsx类似一种语法糖,代码更为简洁和清晰。