reactjs(reactjs 官网)
一、react.js有哪些设计缺陷
比vue好多了
二、如何用js实现一个简单的react
谢谢邀请!
写一个react应用,可以分为以下几步:
1、写组件
组件分为类组件和函数式组件,类组件需要继承react的Component基类,有自己的生命周期钩子函数
2、状态管理
数据由props传入,类组件内部可以通过state控制组件自身的状态变化(setState)
3、调用入口函数
ReactDOM.render
4、通过webpack(babel处理jsx)打包编译即可生成react应用
在react中有一个虚拟dom的概念,那么虚拟dom是什么呢?其实它是一个对象,如下图:
它就是对jsx的描述,jsx并不能当做真正的dom插入页面中,需要做进一步的转化,babel会把jsx转化为一堆由createElement组成的执行函数,如下:
再由createElement返回的数据拼装成上面所说的虚拟dom。
那么要实现一个react,需要实现createElement、render和Component三个部分!
1、createElement函数
第一个参数type是类型,可能是类、函数、dom的tagName,第二个参数props就是定义在jsx中标签的属性包括自定义属性和自定义事件
2、render
render索要完成的事情就是将虚拟dom渲染成真实的dom,并且可以更新!办法就是遍历这个虚拟dom树。
遇见dom标签,生成dom节点,从props中拿出属性和事件(事件的key都是以on开头),完成绑定,append进父元素中。
遇见类组件,直接new出一个实例,运行实例的render方法,生成组件的虚拟dom,展开递归,遇见dom标签就加入父元素中,在这个阶段是可以运行生命周期中各个钩子函数的。
遇见函数,直接执行,生成组件的虚拟dom,展开递归,遇见dom标签就加入父元素中。
3、diff(插入一点)
如何做到diff呢?其实就是在内存中保留上一次的虚拟dom树,待生成新的虚拟dom树后,就可以逐层做diff,这就是为什么在写react的state时候需要生成新的对象断开引用,为的就是不能影响diff。react是在属性、类型等改变时有一套规则,diff规则可以自己定,不一定要沿用react的。
之前出去面试,别人问我如果有一千个一万个节点如何对比,递归下去依然性能很差,被问的垭口无语!读者可以自己思考一下!4、Component
这个基类比较简单,就是实现一个setSate方法,在方法中调用更新逻辑。
综上,实现这个几个功能基本就能实现一个react了,不过还是比较复杂的,特别是递归那块!
喜欢我的回答就关注我吧,有问题可以发表评论,我们一起学习,共同成长!
三、react是什么语言
React是用于构建用户界面的JavaScript库,起源于Facebook的内部项目,该公司对市场上所有JavaScriptMVC框架都不满意,决定自行开发一套,用于架设Instagram的网站。
React主要用于构建UI。你可以在React里传递多种类型的参数,如声明代码,帮助你渲染出UI、也可以是静态的HTMLDOM元素、也可以传递动态变量、甚至是可交互的应用组件。