关于项目
自从2018开年开始,我就开启了懒人模式,天天迷上打游戏,而新公司压力又不大所以划水到现在。前段时间想了想了这样下去不行,再这样下去就不能当上CEO,走上人生巅峰了😁。于是就又了这个项目。
这个项目是慕课网的一个react课程,项目比较小,用的版本也比较低。 所以按教程一葫芦画瓢,肯定学不到什么东西,也没挑战。所以就想着用最新的react技术栈来学习这个项目,并用上了TypeScript。
TypeScript
TypeScript 是微软推出的强类型javascript的超集,最重要的特点就是类型检查。之前在做Vue项目的时候,很想用到项目里,后面因为Vue对TS的支持和上手难度的问题不了了之了。而react对TS比较好,社区里也有很多成熟的使用例子,所有就上了TS。
技术栈
- create-react-app
- React
- TypeScript
- Less
开发过程
1、 create-react-app
create-react-app创建TypeScript项目模板
1 | # 全局安装creat-react-app |
接下来配置Less,因为creat-react-app创建的项目是免配置的所以先要开启配置模式,暴露配置文件。
1 | npm run eject # 暴露配置文件 |
开启配置后项目目录就多了好几个文件夹
1 | + /config |
在以下文件修改配置:
/config/webpack.config.dev.js
/config/webpack.config.prod.js
1 | { |
环境准备好了,接下来就可以编码了,首先先写app.tsx
基础结构
1 | <!-- 结构 --> |
通过结构可以看到其中有两个子组件,stage容器通过ref获取真实DOM以便后续获取dom的一些属性,其中ref回调中的node是一个dom元素并定义了类型为HTMLElement,后续当我们用this.stageDom的时候就可以享受到TS带来的智能感应的福利,如下图。
ref
ref 不仅可以获取真实DOM也可以获取React组件的实例,需要注意的是要获取的组件必须是类组件,因为函数组件是没有生命周期的。
1 | class App extends React.Component { |
以上js逻辑部分,其中rearrange是最重要的一个函数,用来计算各个图片的位置信息的,详细了解可以通过慕课视频。
public & private
在class声明内部变量和函数需要显式声明并且要用public 和 private区分是公私属性,并且声明类型。声明函数后尽量用jsdoc注释来解释函数的,后续在你调用的时候也有很友好的提示。
接口
在TypeScript中定义复杂形式的数据的时候可以用接口(interface)来实现
1 | // 定义一个接口 |
定义接口的时候命名尽量用大写的I开始命名,接口里面非必传参数可以加问号
其他组件
ControllerUnit.tsx
1 | import * as React from 'react'; |
ImgFigure.tsx
1 | import * as React from "react"; |
pros使用的注意
在ImgFigure组件中,props传入了一个对象arrange,一开始我直接把this.props.arrange.pos赋值给styles变量了,因为styles在render里面每次都会改变,导致后面操作图片的时候报错了.这是因为pos是个对象,直接赋值给styles相当于内存引用,而styles改变的时候,也会去尝试改变this.props.arrange. 因为props是只读的,所以会发生报错.这里的解决方法是对this.props.arrange.pos用Object.assign浅拷贝就好..
不足的地方
1、因为刚开始用ts,对一些简单的数据类型定义起来比较简单,但复杂的类型或涉及到react的类型就没有经验所以好多地方写了any类型。下次要对ts文档通读一遍。
2、在许多地方都按照视频内容写的,没有深刻的思考原理。
要做的计划
后续还会优化这个项目:
引入网络请求获取图片
引入redux管理状态
编写单元测试