首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

我们编写 React 组件的最佳实践

刚接触 的时候,在一个又一个的教程上面看到很多种编写组件的方法,尽管那时候 框架已经相当成熟,但是并没有一个固定的规则去规范我们去写代码。

在过去的一年里,我们在不断的完善我们的做法,直到满意为止。

本文会列出我们自己在使用的最佳实践,不管你是刚入门的新手还是很有经验的开发者,我们都希望本文对你有所帮助。

开始之前,先列几条:

我们使用ES6/ES7

如果你无法区分页面组件和容器组件,推荐阅读 这篇文章

如果有更好的意见或建议,请在评论区告诉我,谢谢

基于 Class 的组件

基于 Class 的组件是有状态的,不管它包不包含函数,我们都会尽量少用。但是它也有它的用处。

现在来一行一行的编写我们的组件:

导入 CSS

我喜欢 ,但是这个概念还比较新,现在也并没有成熟的解决方案,所以我们在每个组件里面去引用 CSS

初始化 State

当然你也可以选择在构造函数里面去初始化,但是我们觉得这种方式更加清晰。

当然也会保证 Class 是默认导出的。

propTypes 和 defaultProps

propTypes 和 defaultProps 是静态属性,尽可能的把它们写在组件的最上方,以便其他开发者阅读。

如果使用 或更高的版本,使用 prop-types 代替

所有的组件都必须声明 propTypes

函数

使用基于 Class 的组件时,当你传递函数给子组件的时候,要确保他们有正确的 ,通常用这种形式实现

但是如果你使用箭头函数,就不需要

为 setState 传递函数

上面的例子中我们是这么做的:

这里有个 setState 的小知识 —— 它是异步的,为了保证性能, 会分批修改 state,所以 state 不会在调用 setState 之后立即改变

这意味着你不能依赖当前的状态,因为你不知道当前的状态是什么状态

这里有个解决方案 —— 传递函数给 setState, 会把上一个状态 传递给你

解构 Props

像上面的例子一样,每个 prop 都独占一行

装饰器(Decorators)

如果你使用了类似 mobx 的库,你可以这样去装饰你的 Class 组件

修改函数式组件使用 decorators 很灵活并且可读

如果你不想使用装饰器,可以这么做:

闭包

避免像下面注释的地方一样传递新的闭包给子组件:

这种方式的好处是每次render,不会重新创建一个函数,没有额外的性能损失。

这里是完整的组件:

函数式组件

这些组件没有状态和函数,他们很纯,非常容易阅读,尽量多的使用他们。

propTypes

这里我们把 propTypes 写在最前面,他会被组件立即可见,这要归功于JavaScript的

解构 Props 和 defaultProps

我们的组件是一个函数,我们获取他的 props 就是在获取函数的参数值,我们可以直接用 的解构:

我们也可以使用默认参数值去设置 ,就像上面的

避免使用下面的 ES6 语法:

看起来很先(逼)进(格),但这个函数是匿名的。

如果你的Babel设置正确,这个匿名函数不会成为一个问题 —— 但是如果不是的话,任何错误都会显示在 中,这对于调试来说是非常糟糕的。

Wrapping

函数式组件中不能使用 ,你只需把它作为参数传递给过去

这里是完整的组件:

JSX 中的条件判断

你可能会有很复杂的条件判断语句,但是你要避免下面的写法:

嵌套的三元表达式不是一个好的方法,太难阅读了

有一些库可以解决这个问题(jsx-control-statements),但是我们没有引入其他的库,我们是这么解决的:

我们使用了 立即执行函数 把条件语句写在里面,虽然这样可能会导致性能下降,但是在大多数情况下,它带来的负面影响还是小于糟糕的可读性。

当然如果组件分的足够细,你可能不会用到这么复杂的条件判断。

此外,如果你只在一个表达式里面去渲染组件,避免这么做:

你可以使用短路语法:

总结

这篇文章对你有帮助吗?请在评论区给出你的意见和建议,感谢阅读!

文章来源:https://blog.catwen.cn/2018/01/18/best-practices-for-writing-react-components/

广告内容

关注我们

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180122B0WJBE00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券