高性能 高效率 易拓展 低耦合 易测试 少bug 协作开发

我们先从项目最小的一个点开始讲:组件

这里有一个性能关键点, 举个例子

A组件:

const A = ({count}) => {

React.useEffect(() => {

console.log(‘render A’)

});

return 

{count}

}

B组件

const B = () => {

React.useEffect(() => {

console.log(‘render B’)

});

return 

}

把这两个组件拼在一起,每次点击A组件的时候都会让count+1

const App = () = > {

const [count, setCount] = React.useState(0);

React.useEffect(() => {

console.log(‘render App’)

});

return (

<>

setCount(count+1)} >

)

}

想象中的打印结果

render App

render A

真实的打印结果:

render App

render A

render B

打印结果表明:**每一次父组件的state更新,都会导致所有子组件重新渲染。**那这样性能岂不是太差了!

其实这不并不是真正意义上的渲染,react底层会有diff算法,会帮你更新“真正需要更新的组件”。

所以我们要手动控制,赶在diff算法之前不让它“渲染”;其实很简单,React.memo(组件),就这样套住组件就可以了,就可以得到我们想象中的打印结果了;React.memo和React.PureComponent类似,作用:检查Props是不是变了,如果变了才会真正的去更新,但得记住这是一个浅比较。 Ok,正文开始,设计组件。

我们先看一个页面的组成是这个样子的 所以大多数项目的目录结构都会有一个components目录,顾名思义这个目录用来存放公用组件 都知道React是组件化思想。那你真的理解了什么是组件化吗?开发的时候,觉得这个组件是可以抽出来的,就丢到components目录下去了?

这是一个非常糟糕的做法。公用组件意味着无副作用,大胆用放心用。如果只是你觉得可以抽出来做一个组件,放到components目录下,那这个组件如果包含业务代码怎么办?开发人员还要阅读你的这个组件,确保没有副作用,才能使用,降低了效率,严重的话还会产生bug。

React官方建议:多写无状态组件;组件最小粒度化;组件只是数据的管道工! 组件其实是分为两种组件:

无状态组件 (用函数式编程理解:相同输入,相同输出,毫无副作用;这种组件才该放入components目录下) 有状态组件(用函数式编程理解:相同输入,不一定相同输出,还可能修改外部的值) 在React 16.8版本之前,也就是还没有推出hooks之前,可以这样设计组件,就可以非常好的区分

无状态组件:使用function来写组件 有状态组件:使用class来写组件 我们的架构是围绕React/React native新特性,当然得用hook+函数,无class该如何设计组件? 一个页面的视图组成部分应该是这样的 所以我们需要为组件分两个目录

components 无状态组件存放目录 container 有状态组件存放目录 components目录下的无状态组件 核心:组件最小粒度化;组件只是数据的管道工

component必须使用React.memo来控制 component内部不允许改变外部的值(可以这么理解:大多数项目都会使用状态管理,例如redux,mobx等,统称为store,也就是说,不允许引入store和使用store的方法和变量,也就是不允许有业务代码) props必须或尽量是基本类型(例如:string,number,组件保持最小粒度化了开发,所以满足props是基本类型这一点非常简单;其次,基本类型的props,才能发挥React.memo真正的作用) 允许有自己的state,生命周期,也就是hook component伪代码像这样

const ComponentDemo = React.memo((props)=>{

// --------------------------------

//              state 部分

// --------------------------------

// --------------------------------

//              生命周期 部分

// --------------------------------

return (

// 视图

)

})

container目录下的有状态组件 核心:一个container,渲染部分应该尽量使用component进行拼接组成

container同样使用React.memo来控制 container内部允许改变外部的值(允许引入store和使用store的方法和变量) props尽量是基本类型 允许有自己的state,生命周期,也就是hook container伪代码如下

const ContainerDemo = React.memo((props)=>{

// --------------------------------

//              store 部分

// --------------------------------

// --------------------------------

//              state 部分

// --------------------------------

// --------------------------------

//              生命周期 部分

// --------------------------------

// --------------------------------

//              业务逻辑 部分

// --------------------------------

return (

// --------------------------------

//          component 1

// --------------------------------

// --------------------------------

//          component 2

//          …

// --------------------------------

// --------------------------------

//          拼接的代码例如像View

// --------------------------------

)

})

区别显而易见,结论:

component和container的唯一区别就是有无store 最大程度的复用,而且没有副作用。复用也是间接减少bug的,因为你复用的代码是上个版本的,上个版本是经过测试的,我们可以默认它是无bug,稳定的代码。 实现最小粒度更新,完美控制性能 说完组件设计,接下来是逻辑的复用

component和container描述和伪代码,我们可以看到有相同部分

state 生命周期 业务逻辑 依靠hook的特性,只要你觉得抽出去有价值那就抽!这样不光是container还是component都可以复用逻辑,又提高效率了!所以又多出了一个新目录:hooks目录 所以视图部分架构就诞生了! ok,到现在为止就有3个目录了

components 无状态组件 container 有状态组件 自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。 深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前! 因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。 既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化! 由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新 如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java) 最后 这份清华大牛整理的进大厂必备的redis视频、面试题和技术文档 祝大家早日进入大厂,拿到满意的薪资和职级~~~加油!! 感谢大家的支持!! 一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长! 786483)] 既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化! 由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新 如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java) [外链图片转存中…(img-PLJC1pBU-1712662786484)] 最后 这份清华大牛整理的进大厂必备的redis视频、面试题和技术文档 祝大家早日进入大厂,拿到满意的薪资和职级~~~加油!! 感谢大家的支持!! [外链图片转存中…(img-DPXoLlPZ-1712662786484)] 一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长! [外链图片转存中…(img-nHDAgzzs-1712662786485)]

参考阅读

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: