面经
聊聊虚拟DOM和diff
用全局组件可以减少代码体积,但是有什么危害 :命名冲突、性能开销、维护困难
react hooks 的if判断
如果if语句去调hook 会将整个结构打断,返回的状态值变化,导致状态和索引不对应
对于批处理想要将对应的action和hook绑定是通过index来指定,如果被包在if等语句中,不能保证index++
其机制类似于Vue && React的为标签添加key,用于识别组件与元素,实现高效的diff && VDOM更新
为什么会有react-router、redux、redux-saga,最后还有dva出现?
本质上都是解决了不同发展阶段的问题,封装成了技术产品,就像瓶装水->纯净水->矿泉水->饮料->运动饮料,每个阶段解决不同的问题
React本身仅对DOM进行了抽象,对于路由、数据通信、异步处理等没有进行进一步的功能实现
ReactRouter对标路由管理
Redux对标组件通信、数据流通信
Redux-saga对标异步管理
dva对以上进行了整合,实现了类似于轻量级的自动档框架
踩坑
关于Key的传递
map时,传递的key应该直接传递给组件,封装了的组件不需要通过间接传递到组件内部
<Grid container spacing={2}>
{loading
? new Array(8).fill(0).map((item, index) => (
<GridItem key={"skeleton-" + index}>
<RepocardSkeleton />
</GridItem>
))
: repoFeatured.map((item, index) => (
<GridItem key={"featured-" + index}>
<RepoCard item={item} />
</GridItem>
))}
</Grid>
相关数据包
- prop-types 检测props数据
- react-jss react css
- axios && qs 网络传输
- blueimp-md5 加密
- fastclick 移动端click事件
- http-proxy-middleware CORS
- lib-flexible 移动端响应式
- postcss-pxtorem 移动端响应式
- cross env 设置env
- 弹出框:Ebay NiceModal
- 加密密码:js-md5
命令
脚手架: npm-create-react-app -g 版本: create-react-app --version 创建 create-react-app xxx (React规范:小写字母+数字+_)
版本差别
- 渲染
- 16: React.render()
- 18: root=React.createRoot(...); root.render()
- setState任务队列
- 16: 合成事件 && hooks为异步, 其它为同步
- 18: 均为异步
- SyntheticEvent 事件缓冲池: get-操作-clean
- 16: 基于事件缓存池(通过e.persist()可缓存事件对象; 防止重新创建新的合成对象) 事件委托给document, 只对冒泡实现事件委托
- 18: 无事件缓存池(无事件对象信息清空的问题); 委托给#root, 拆分捕获和冒泡两个阶段, 均实现
React Cook Book
创建应用程序
1 经典
npx create-react-app --template typescript xxx
yarn
cd yarn
yarn start
yarn build
yarn eject
2 Gatsby
内容丰富;生成静态网页版本;高相应速度
Ts支持;自动路由获取;插件丰富;
离线缓存;渐进式Web应用 PWA
SEO友好
npx gatsby new xxx
cd xxx
yarn dev
yarn build
引入动态内容
- Headless CMS 无界面内容管理系统
- GraphQL
- 静态数据源
3 Razzle
通用应用程序——既可以在服务器也可以在客户端上执行;快速构建demo,推迟对构建和部署应用的决定;
可配置插件构成,适应性强;扩展性强;
npx create-razzle-app xxx
同时构建客户端和服务器段代码
yarn start:pord
yarn build
构建应用程序时需要考虑的东西
- 要创建SFC吗
- 性能关键吗
- 是否用SSR呢
- 需要用哪种部署平台呢
- 使用js还是ts呢
4 next
全栈框架;默认路由约定;无需管理路由配置
少量配置提升交付速度;低服务端需求友好;
*打包后不包括服务端api
npx create-next-app xxx
cd xxx
yarn dev
生成静态版本
node_modules/.bin/next export
5 preact / inferno
轻量级react;(notools方式下)核心preact不支持jsx,babel——不支持高级语法;
- 当作notools方式,在页面中当作独立的库使用
- 当作一个框架构建整个应用程序
npx preact-cli create default xxx
cd xxx
yarn dev
yarn build
6 nwb组件库
组件库可以保证风格一致;构建组件项目;
yarn add -g nwb
创建单独组件
nwb new react-component xxx
创建完整应用
nwb new react-app/preact-app/inferno-app/vanilla-app xxx
*7 webpacker给rails添加react
rails
- 传统开发模型
- 小型服务器框架
- 快速开发,适用于小型项目
- 缺乏交互
*8 preact自定义HTML标签
9 组件开发中使用 StoryBook
检查组件运行情况;单独集中战士组件;提供组件属性示例;
可视化单元测试;
周边生态 add-ons
- 检查可访问性;
- 添加交互式属性设置控件
- 包含每个story内联文档
- 记录HTML快照,测试程序更改产生的影响
10 Cypress测试
浏览器运行;无需外部驱动;通过网络接口直接与浏览器通信;Jest格式
react项目普遍的测试库
- @testing-library/react
- Preact_Enzyme
而更好的做法是在浏览器中直接测试