课程为极客时间小课《winter 手把手带你实现 ToyReact框架》 实现react的最基础的功能
react = 组件化 + jsx + vdom
目标:
- 通过React理解组件的基本概念
- 学习vdom的实现思路
- 编写突破自我的困难代码
- 创建项目,初始化项目,并配置webpack环境
- webpack的loader的配置
- babel是用来将高级js语法转换为普通语法
- plugin来处理jsx语法,pragma配置来选择使用的语法,默认为React.createElement
- 添加ToyReact的空结构,添加createElement的空方法,设置pramga为 ToyReact.createElement
- jsx语法传入小写则会被作为字符串传入,大写开始则传入类型
- 在jsx中添加子元素的效果
- 在 ToyReact 的 createElement 中生成一个实Dom ,添加了attribute、children以及内部文本块的处理
- 为了模式统一,添加一个
ToyReact.render
来进行渲染 - 设计一个mountTo方法,使得 vdom 内部处理渲染
- 【没太明白】MyComponent的render(),这个地方不能再是一个虚dom的行为,所以需要这个地方需要在createElement里面添加一个Wrapper统一操作,
- Wrapper没有render,到了wrapper已经是一个真实的dom元素了
- 将 MyComponent 中通用部分提取出来,在ToyReact中创建一个 Component 类
- 解答:Wrapper 的目的是让我们的Component的行为和原生的DOM行为一致。
- 自定义组件中添加子元素会报错,原因:
Component
里面没有appendChild
方法 {this.children}
webpack 默认不会展开这个, 在ElementWrapper的方法里面,vchild是一个数组,需要递归处理- 自定义组件内部可以传js对象,最好是在child里面toString进行兜底操作,判断类型,对于不认识的类型,强制转换为String
- 我们所有的组件都是为了处理:
setAttribute
,mountTo
,appendChild
三个方法
P.S. 开课吧 - 《前段会客厅》,免费的。
- 上节课的版本,仅仅一次渲染,不能更新。
- 参考 React的tutorial,我们要用我们的代码实现react框架支撑tutorial的部分
- Tic Tac Toe
- 上节课没有涉及的部分:
props
onClick
setState
reRender
- 添加Square和Board
- 框架需要添加props的处理
- Object.create(null), 创造出来的对象比较干净
- 添加onClick事件
- 处理onClick有两个思路:一个是在ToyReact.createElement的setAttribute中,addEventListener;第二个是在Component中setAttribute中处理,【实际是在Wrapper中的setAttribute】
- 在Wrapper中的setAttribute中添加了对事件的处理。
- 对className进行特殊处理,使css可以正常工作
- 添加Square的constructor,onClick修改为setState
- Component中实现setState,实现state的merge
- range是html里面的一个范围,有了range可以按这个范围操作html元素。相关资料
- 在update中deleteContents()会导致节点range的start/end变化,会产生一个奇怪的bug,目前暂时用一个placeholder来占位,暂时解决这个问题
- 这一步核心思想:传一个range进来,range中的内容删除掉,vdom重新进行render,再由vdom重新mountTo(range)。range中的都是实dom。
- 生命周期,参考react,willUpdate,didUpdate在update的开始和结束,willMount和didMount在mountTo的开始和结束
- 将React版本的Tic Tak Toe代码main.js部分全部复制到项目中
- 我们暂时不支持函数式的用法,需要将Square修改为Class声明的
- ToyReact在insertChildren时,对null没做特殊处理,添加child不为空和undefined的判断
- js中的坑,null也是object!
- mergeState时,数组也做一下特殊处理。newState为array时,将oldState更新为array
- 开始Vdom的改造
- 在ElementWrapper中,不在构造的时候创建dom元素,而在渲染的时候创建dom元素
- vdom比较,仅同层比较
- 添加了sameNode和sameTree比较
- 添加了replace方法,在方法中进行比较,若相同就不更新,replace不同的情况
- 最后还是通过placeholder解决渲染问题