组件设计模式:聪明组件还是傻瓜组件?

React的本质

react的本质思想是认为,数据和渲染是分离的,而react做的事情就是:

fn=render(data)

组件的本质

当一个组件除了渲染还有逻辑时,就必然的会有逻辑放在哪里的问题。

如果逻辑放在这个组件内部,就是复杂组件。而如果放在外部,组件本身只负责渲染,那么就是傻瓜组件。

以这个思维去分析,那么ui库,其中的组件基本都可以定义为傻瓜组件,而业务组件,在没有拆分的前提下,都是聪明组件。

所以一般这两个组件还有别的称谓:

容器组件还是展示组件

有状态组件还是无状态组件

胖组件还是瘦组件

一些实际编程心智

1 分为容器和展示

容器负责逻辑,展示负责渲染。这里的逻辑指的是需要从外部获的数据或者逻辑,而展示组件除了渲染本身,还会负责一些和ui渲染直接相关的变量维护。当然有些变量,可能会允许外部传入。

2 分为逻辑hook和展示函数组件

不依赖于某个容器组件,而是将可能的可复用的逻辑放在hook中,这个也是现在官方主推的方式。

依赖的心智:

逻辑可复用;变化的数据会导致组件重新渲染;hook使用的前提是函数组件,函数和组件两者缺一不可。

3 分为工具函数和展示组件

与上者不同的是,逻辑共用的范围。上者是函数逻辑只能用在函数组件内,而工具函数可以用在任何位置,可以是函数组件,可以是函数,可以是类组,也可以是任何上下文中。

4 分为store dispatch 和 展示组件

当我们把某个逻辑放在store中,就增加了数据的属性,我们可以使用数据来完成更多的数据管理以及分发的期望。

第一个直接结果就是,任何组件都可以按需获取对应的数据。

第二个直接结果就是,任何组件都可以直接使用这个函数,并在后续的上下文中,跨组件的消费。

还有一个可能不是我们想要的结果,就是数据可能会被不了解store的人发生滥用的行为,导致本该用作特殊场景的数据被污染。

拓展

1 在使用傻瓜组件时,不可避免的会被属性影响重新渲染。

做好组件的性能提升是必要的,可以使用memo来提升基本的渲染性能。

2 当我们需要抽离一段逻辑时,一定要想清楚,这个的使用范围,包括是在应用全局还是部分,是在函数组件还是可能也有纯函数

3 当发现一个组件代码量或者逻辑部分复杂时,建议使用一些傻瓜组件的模式,把渲染以及渲染相关的逻辑单独抽离为傻瓜组件。

4 使用useState 时,要注意使用边界,不需要引发重新渲染的,不要过度使用,尤其在一个组件内包含太多数据或者需要外部传递太多数据,或者外部传入的是一个复杂对象时。

更多

余杭子曰的花园

相关推荐
程序员小郭83几秒前
Spring Ai 05 ChatClient Advisor 实战(日志、提示词增强、内容安全)
java·开发语言·前端
m0_502724951 分钟前
腾讯地图tlbs-multi-marker动态更新marker图标
前端·javascript·vue.js·地图
IT_陈寒5 分钟前
SpringBoot 项目启动慢?这5个优化技巧让你的应用快50%
前端·人工智能·后端
GISer_Jing15 分钟前
React核心语法:组件化与声明式编程
前端·react.js·前端框架
DJ斯特拉15 分钟前
文件上传(UUID防止重名文件&&阿里云实现云端上传&&MultipartFile接收前端文件)
前端
Alan Lu Pop20 分钟前
React 表单提交关键词意外触发刷新
前端·javascript·react.js
掘金安东尼23 分钟前
企业级Claw落地避坑指南:70%项目失败的真实原因
前端·面试·github
这儿有一堆花23 分钟前
从技术标准到营销概念:深度解析 HTML5 与 H5 的演变与区别
前端·html·html5
我命由我1234523 分钟前
React - 创建 React 项目、React 项目结构、React 简单案例、TodoList 案例
前端·javascript·react.js·前端框架·ecmascript·html5·js
SuperEugene25 分钟前
Vue3 Pinia 状态管理规范:何时用 Pinia 何时用本地状态|状态管理与路由规范篇
开发语言·前端·javascript·vue.js·前端框架