redux与mobx的区别?
两者对⽐:
- redux将数据保留在单⼀的store中,mobx将数据保留在扩散的多个store中
- redux使⽤plain object保留数据,须要⼿动解决变动后的操作;mobx适⽤observable保留数据,数据变动后⾃动解决响应的操作
- redux使⽤不可变状态,这意味着状态是只读的,不能间接去批改它,⽽是应该返回⼀个新的状态,同时使⽤纯函数;mobx中的状态是可变的,能够间接对其进⾏批改
mobx相对来说⽐较简略,在其中有很多的形象,mobx更多的使⽤⾯向对象的编程思维;redux会⽐较简单,因为其中的函数式编程思维把握起来不是那么容易,同时须要借助⼀系列的中间件来解决异步和副作⽤
- mobx中有更多的形象和封装,调试会⽐较艰难,同时后果也难以预测;⽽redux提供可能进⾏工夫回溯的开发⼯具,同时其纯函数以及更少的形象,让调试变得更加的容易
场景辨析:
- 基于以上区别,咱们能够简略得剖析⼀下两者的不同使⽤场景。
- mobx更适宜数据不简单的应⽤:mobx难以调试,很多状态⽆法回溯,⾯对复杂度⾼的应⽤时,往往⼒不从⼼。
- redux适宜有回溯需要的应⽤:⽐如⼀个画板应⽤、⼀个表格应⽤,很多时候须要撤销、重做等操作,因为redux不可变的个性,人造⽀持这些操作。
- mobx适宜短平快的项⽬:mobx上⼿简略,样板代码少,能够很⼤水平上提⾼开发效率。
- 当然mobx和redux也并不⼀定是⾮此即彼的关系,你也能够在项⽬中⽤redux作为全局状态治理,⽤mobx作为组件部分状态管理器来⽤。
什么是 prop drilling,如何防止?
在构建 React 应用程序时,在多层嵌套组件来应用另一个嵌套组件提供的数据。最简略的办法是将一个 prop
从每个组件一层层的传递上来,从源组件传递到深层嵌套组件,这叫做prop drilling。prop drilling
的次要毛病是本来不须要数据的组件变得不必要地简单,并且难以保护。
为了防止prop drilling
,一种罕用的办法是应用React Context。通过定义提供数据的Provider
组件,并容许嵌套的组件通过Consumer
组件或useContext
Hook 应用上下文数据。
这段代码有什么问题吗?
这段代码有什么问题:
this.setState((prevState, props) => { return { streak: prevState.streak + props.count, };});
答案:
没有什么问题。这种形式很少被应用,咱们能够将一个函数传递给setState
,该函数接管上一个 state
的值和以后的props
,并返回一个新的状态,如果咱们须要依据以前的状态从新设置状态,举荐应用这种形式。
diff算法是怎么运作
每一种节点类型有本人的属性,也就是prop,每次进行diff的时候,react会先比拟该节点类型,如果节点类型不一样,那么react会间接删除该节点,而后间接创立新的节点插入到其中,如果节点类型一样,那么会比拟prop是否有更新,如果有prop不一样,那么react会断定该节点有更新,那么重渲染该节点,而后在对其子节点进行比拟,一层一层往下,直到没有子节点
React 的生命周期办法有哪些?
componentWillMount
:在渲染之前执行,用于根组件中的 App 级配置。componentDidMount
:在第一次渲染之后执行,能够在这里做AJAX申请,DOM 的操作或状态更新以及设置事件监听器。componentWillReceiveProps
:在初始化render
的时候不会执行,它会在组件承受到新的状态(Props)时被触发,个别用于父组件状态更新时子组件的从新渲染shouldComponentUpdate
:确定是否更新组件。默认状况下,它返回true
。如果确定在state
或props
更新后组件不须要在从新渲染,则能够返回false
,这是一个进步性能的办法。componentWillUpdate
:在shouldComponentUpdate
返回true
确定要更新组件之前件之前执行。componentDidUpdate
:它次要用于更新DOM以响应props
或state
更改。componentWillUnmount
:它用于勾销任何的网络申请,或删除与组件关联的所有事件监听器。
应用 React Hooks 益处是啥?
首先,Hooks 通常反对提取和重用跨多个组件通用的有状态逻辑,而无需承当高阶组件或渲染 props
的累赘。Hooks
能够轻松地操作函数组件的状态,而不须要将它们转换为类组件。
Hooks 在类中不起作用,通过应用它们,咱们能够完全避免应用生命周期办法,例如 componentDidMount
、componentDidUpdate
、componentWillUnmount
。相同,应用像useEffect
这样的内置钩子。
参考 前端进阶面试题具体解答
什么状况下应用异步组件
- 进步页面加载速度,应用
reloadable
把各个页面别离独自打包,按需加载
Dva工作原理
集成redux+redux-saga
工作原理
扭转产生通常是通过用户交互行为或者浏览器行为(如路由跳转等)触发的,当此类行为会扭转数据的时候能够通过dispatch
发动一个action
,如果是同步行为会间接通过Reducers
扭转State
,如果是异步行为(副作用)会先触发Effects
而后流向Reducers
最终扭转State
React 中 refs 干嘛用的?
Refs
提供了一种拜访在render
办法中创立的 DOM 节点或者 React 元素的办法。在典型的数据流中,props
是父子组件交互的惟一形式,想要批改子组件,须要应用新的pros
从新渲染它。凡事有例外,某些状况下咱们须要在典型数据流外,强制批改子代,这个时候能够应用 Refs
。
咱们能够在组件增加一个 ref
属性来应用,该属性的值是一个回调函数,接管作为其第一个参数的底层 DOM 元素或组件的挂载实例。
class UnControlledForm extends Component { handleSubmit = () => { console.log("Input Value: ", this.input.value); }; render() { return ( <form onSubmit={this.handleSubmit}> <input type="text" ref={(input) => (this.input = input)} /> <button type="submit">Submit</button> </form> ); }}
请留神,input
元素有一个ref
属性,它的值是一个函数。该函数接管输出的理论 DOM 元素,而后将其放在实例上,这样就能够在 handleSubmit
函数外部拜访它。
常常被误会的只有在类组件中能力应用 refs
,然而refs
也能够通过利用 JS 中的闭包与函数组件一起应用。
function CustomForm({ handleSubmit }) { let inputElement; return ( <form onSubmit={() => handleSubmit(inputElement.value)}> <input type="text" ref={(input) => (inputElement = input)} /> <button type="submit">Submit</button> </form> );}
为什么类办法须要绑定到类实例?
在 JS 中,this
值会依据以后上下文变动。在 React 类组件办法中,开发人员通常心愿 this
援用组件的以后实例,因而有必要将这些办法绑定到实例。通常这是在构造函数中实现的:
class SubmitButton extends React.Component { constructor(props) { super(props); this.state = { isFormSubmitted: false, }; this.handleSubmit = this.handleSubmit.bind(this); } handleSubmit() { this.setState({ isFormSubmitted: true, }); } render() { return <button onClick={this.handleSubmit}>Submit</button>; }}
形容 Flux 与 MVC?
传统的 MVC 模式在拆散数据(Model)、UI(View和逻辑(Controller)方面工作得很好,然而 MVC 架构常常遇到两个次要问题:
数据流不够清晰:跨视图产生的级联更新经常会导致凌乱的事件网络,难于调试。
不足数据完整性:模型数据能够在任何中央产生渐变,从而在整个UI中产生不可预测的后果。
应用 Flux 模式的简单用户界面不再蒙受级联更新,任何给定的React 组件都可能依据 store
提供的数据重建其状态。Flux 模式还通过限度对共享数据的间接拜访来增强数据完整性。
state 和 props 共同点和区别
共同点
- state 和props的扭转都会触发render函数(界面会产生扭转)
不同点
- props 是readonly(只读),然而state是可读可写
- props 来自父组件,state是组件外部的数据对象
如何有条件地向 React 组件增加属性?
对于某些属性,React 十分聪慧,如果传递给它的值是虚值,能够省略该属性。例如:
var InputComponent = React.createClass({ render: function () { var required = true; var disabled = false; return <input type="text" disabled={disabled} required={required} />; },});
渲染后果:
<input type="text" required>
另一种可能的办法是:
var condition = true;var component = <div value="foo" {...(condition && { disabled: true })} />;
redux异步中间件之间的优劣?
redux-thunk长处:
- 体积⼩:redux-thunk的实现⽅式很简略,只有不到20⾏代码;
- 使⽤简略:redux-thunk没有引⼊像redux-saga或者redux-observable额定的范式,上⼿简略。
redux-thunk缺点:
- 样板代码过多:与redux自身⼀样,通常⼀个申请须要⼤量的代码,⽽且很多都是反复性质的;
- 耦合重大:异步操作与redux的action偶合在⼀起,不⽅便治理;
- 性能孱弱:有⼀些理论开发中常⽤的性能须要⾃⼰进⾏封装。
redux-saga长处:
- 异步解耦:异步操作被被转移到独自saga.js中,不再是掺杂在action.js或component.js中;
- action解脱thunk function: dispatch的参数仍然是⼀个纯正的 action (FSA),⽽不是充斥 “⿊魔法” thunk function;
- 异样解决:受害于 generator function 的saga实现,代码异样/申请失败都能够间接通过try/catch语法间接捕捉解决;
- 性能强⼤:redux-saga提供了⼤量的Saga辅助函数和Effect创立器供开发者使⽤,开发者⽆须封装或者简略封装即可使⽤;
- 灵便:redux-saga能够将多个Saga能够串⾏/并⾏组合起来,造成⼀个⾮常实⽤的异步flow;
- 易测试,提供了各种case的测试⽅案,包含mock task,分⽀笼罩等等。
redux-saga缺点:
- 额定的学习老本:redux-saga不仅在使⽤难以了解的generator function,⽽且无数⼗个API,学习老本远超reduxthunk,最重要的是你的额定学习老本是只服务于这个库的,与redux-observable不同,redux-observable尽管也有额定学习老本然而背地是rxjs和⼀整套思维;
- 体积庞⼤:体积略⼤,代码近2000⾏,min版25KB左右;
- 性能过剩:实际上并发管制等性能很难⽤到,然而咱们仍然须要引⼊这些代码;
- ts⽀持不敌对:yield⽆法返回TS类型。
redux-observable长处:
- 性能最强:因为背靠rxjs这个强⼤的响应式编程的库,借助rxjs的操作符,你能够⼏乎做任何你能想到的异步解决;
- 背靠rxjs:因为有rxjs的加持,如果你曾经学习了rxjs,redux-observable的学习老本并不⾼,⽽且随着rxjs的降级reduxobservable也会变得更强⼤。
redux-observable缺点:
- 学习老本奇⾼:如果你不会rxjs,则须要额定学习两个简单的库;
- 社区⼀般:redux-observable的下载量只有redux-saga的1/5,社区也不够沉闷,在简单异步流中间件这个层⾯reduxsaga仍处于领导位置。
react的全家桶有哪些
- react:外围
redux:相当于数据,次要存储数据状态
react-redux能够实现数据订阅
redux-thunk能够实现异步的action
redux-logger是redux的日志中间件
react-router 专门为react提供路由解决方案,它利用HTML5 的history API,来操作浏览器的 session history (会话历史)
react-router:提供外围的路由组件与函数
react-router-config:用来配置动态路由(还在开发中)
react-router-native:
react-router-dom:
- axios:是基于promise的用于浏览器和服务端进行数据交互的技术
- antd:Ant Degisn是个很好的React UI库
React 性能优化
- shouldCompoentUpdate
- pureComponent 自带shouldCompoentUpdate的浅比拟优化
- 联合Immutable.js达到最优
如何通知 React 它应该编译生产环境版
通常状况下咱们会应用Webpack
的DefinePlugin
办法来将NODE_ENV
变量值设置为production
。编译版本中React
会疏忽propType
验证以及其余的告警信息,同时还会升高代码库的大小,React
应用了Uglify
插件来移除生产环境下不必要的正文等信息
React- Router有几种模式?
有以下几种模式。
HashRouter,通过散列实现,路由要带#。
BrowerRouter,利用HTML5中 history API实现,须要服务器端反对,兼容性不是很好。
react-router4的外围
- 路由变成了组件
- 扩散到各个页面,不须要配置 比方
<link> <route></route>
简述flux 思维
Flux
的最大特点,就是数据的"单向流动"。
- 用户拜访
View
View
收回用户的Action
Dispatcher
收到Action
,要求Store
进行相应的更新Store
更新后,收回一个"change"
事件View
收到"change"
事件后,更新页面