随着 React.js 的不断进化,现在的它已经成为 Web 组件中最受欢迎的视图库之一。但是你手中的它,是否真的能够正常工作呢?本文将主要描述 5 个关于React 组件的最佳实践,希望对正在关注 React 组件的你有所帮助。

我自己是一名从事了多年开发的web前端老程序员,目前辞职在做自己的web前端私人定制课程,今年年初我花了一个月整理了一份最适合2019年学习的web前端学习干货,各种框架都有整理,送给每一位前端小伙伴,想要获取的可以关注我的头条号并在后台私信我:前端,即可免费获取。

问 题

React.js 已成为 Web 组件中最受欢迎的视图库。一路进化下来,它发展出了众多特性,如今已成为创建优秀的 Web 应用程序的一套完整工具。

它的社区经历了爆发式增长,尤其在过去的 2-3 年中,网络上出现了成千上万有关这项技术的教程。

因此,每位初学者在开始学习 React 时都应该做一件事情,那就是阅读其文档或教程进而创建他们的第一个组件,就像我在 Codeworks 上开始我的学习旅途一样:

https://codeworks.me/?utm_source=medium&utm_medium=organic&utm_campaign=marco_ghiani_hackernoon_how_to_write_clean_react_components

但我的问题是:你能肯定你的 React 组件遵循了最佳实践吗?简单来说,它们是不是正常工作呢?

脏组件长什么样

为了更好地说明我的观点,让我们来看看下面的 React 组件:

import React from 'react';import './Listcomponent.css';class Listcomponent extends React.Component { constructor(props) { super(props); this.state = { lastClickedButton: '' }; } render() { return ( 
The last clicked button is {this.state.lastClickedButton} { this.setState({ lastClickedButton: 'Create' }); this.props.createSomething(); }} className="my-button"> Create { this.setState({ lastClickedButton: 'Read' }); this.props.readSomething(); }} className="my-button"> Read { this.setState({ lastClickedButton: 'Update' }); this.props.updateSomething(); }} className="my-button"> Update { this.setState({ lastClickedButton: 'Destroy' }); this.props.destroySomething(); }} className="my-button"> Destroy

); }}

一个肮脏的 React 组件

这是一个完全正常工作的 React 组件,可以在整个应用程序中多次使用。它渲染了一个按钮列表,这些按钮会触发某个事件,组件还会显示最近被点击的是哪个按钮。总之很简单。

你可能会想:“好吧……如果能用,那就没什么问题!”

但如果有人告诉你,现在这个用 62 行代码写成的组件其实用少得多的代码也能做出来呢?所以我们开始做扫除吧!

1. 优先使用 React Hooks 实现函数组件

随着 React 16.8 引入 Hooks,我们就可以在类声明中使用函数组件来构成有状态组件(如果我们需要处理任何逻辑)了。

在本文中,我们不会深入讨论类与函数组件或 React Hooks。但在 React 社区中众所周知的是,最好优先创建函数组件,尤其是现在我们有了 Hooks 这么好用的工具。

Hooks 允许你复用状态逻辑,而无需更改组件层次结构。

接下来让我们看一下第一次重构后组件的样子:

import React, { useState } from 'react';import './ListComponent.css';const ListComponent = props => { const [lastClickedButton, setLastClickedButton] = useState(''); return ( 
The last clicked button is {lastClickedButton} { setLastClickedButton('Create'); props.createSomething(); }} className="my-button"> Create { setLastClickedButton('Read'); props.ReadSomething(); }} className="my-button"> Read { setLastClickedButton('Update'); props.updateSomething(); }} className="my-button"> Update { setLastClickedButton('Destroy'); props.DestroySomething(); }} className="my-button"> Destroy

);};

用 React Hooks 重构成函数组件很好,我们的组件已经短一些了,我们还删除了 语法,但仍然需要做许多优化工作。

2. 利用好它!

我们可以在这个组件中找到什么模式吗?看一下代码,似乎我们每次都渲染一个相似的 button 元素,每个元素都接受一些相似的 props,所以非常适合把这个长组件切成许多小块。

因此我们可以进一步重构这个组件,创建另一个小的函数组件来渲染按钮,并传递一些属性,如 action、setClicked 和 title:

import React, { useState } from 'react';import './ListComponent.css';const ListItemComponent = props => { return { 

{ props.setClicked(props.title); props.action(); }} className="my-button"> {props.title} );};const ListComponent = props => { const [lastClickedButton, setLastClickedButton] = useState(''); return

The last clicked button is {lastClickedButton}

);};

好的,我们的组件开始变好看了,但是仍有改进的余地,让我们继续吧!

3. 正确命名和 props 解构

setLastClickedButton 是 setter 函数的描述性名称,但我们需要保持代码的可读性和简洁,因此请务必起一个最短、最精炼的名字,这是很重要的。我们将其重命名为 setClicked。

同样,只要有可能,从 props 对象解构出来你需要的东西就可以避免多次重复使用 props 这个词。在 ListItem 组件中,我们现在按解构后的函数参数中的名称—— {action, title, setClicked}来访问 props。

下面看看这两个变化:

import React, { useState } from 'react';import './List.css';const ListItem = ({ action, title, setClicked }) => { return { 

{ setclicked(title); action(); }} className="my-button"> {title} );};const List = ({ create, read, update, destroy }) => { const [clicked, setClicked] = useState(''); return (

The last clicked button is {clicked}

);};

太好了,我们大大减少了组件声明的长度,但是我们仍然可以做得更好!

4. 愿 PropTypes 与你同在!

经过清理之后,该是用到编写组件时最棒的实践的时候了!使用 PropTypes,我们可以验证接收到的 props,以避免由于不同数据类型而导致的错误。例如,接收字符串“0”并尝试将其与数字 0 严格对比(“0” === 0-> FALSE!!!):

import React, { useState } from 'react';import PropTypes from 'prop-types';const ListItem = ({ action, title, setClicked }) => { return ( 

{ setClicked(title); action(); }} className="my-button"> {title} );};ListItem.propTypes = { action: PropTypes.func, setClicked: PropTypes.func, title: PropTypes.string};const List = ({ create, read, update, destroy }) => { const [clicked, setClicked] = useState(''); return (

The last clicked button is {clicked}

);};List.propTypes = { create: PropTypes.func, read: PropTypes.func, update: PropTypes.func, destroy: PropTypes.func,};export default List;

PropTypes 验证

5. 切成小块

想不到吧——我们现在的组件与初始版本差不多一样长,但请仔细观察我们现在手上的代码。

我们看到了两个不同的组件,可以将它们划分为两个模块,从而使它们在整个应用程序中都能复用。

import React, { useState } from 'react';import PropTypes from 'prop-types';import ListItem from './ListItem.js'const List = ({ create, read, update, destroy }) => { const [clicked, setClicked] = useState(''); return ( 
The last clicked button is {clicked}

);};};List.propTypes = { create: PropTypes.func, read: PropTypes.func, update: PropTypes.func, destroy: PropTypes.func,};export default List;

List.js

import React, { useState } from 'react';import PropTypes from 'prop-types';const ListItem = ({ action, title, setClicked }) => { return ( 

{ setClicked(title); action(); }} className="my-button"> {title} );};ListItem.propTypes = { action: PropTypes.func, setClicked: PropTypes.func, title: PropTypes.string};export default ListItem;

ListItem.js

小 结

当你开始研究 React 组件时,本文对初始组件的这些清理工作提供了一些值得参考的优秀实践。

当然,我们可以针对这个最终结果执行其他很多优化操作,但路要一步一步走,这五个优秀实践是很好的起点。

原文链接:https://mp.weixin.qq.com/s/s90qbKR51lJl7p0ZkuFNbg

作者: 前端之巅

react项目中的参数解构_重构复杂的React组件:编写高效且可读组件的5个最佳实践...相关推荐

  1. react项目中的参数解构_一天入门React学习心得

    一天入门React学习心得 阅读前必读 本文写的仓促,算是一个学习笔记吧,算是一个入门级的学习文章.如果你刚刚入门,那么可能一些入门的视频可能更加适合你.但如果具备一些知识,比如Vue,那么视频就不适 ...

  2. 如何优雅地在React项目中使用Redux

    前言 或许你当前的项目还没有到应用Redux的程度,但提前了解一下也没有坏处,本文不会安利大家使用Redux 概念 首先我们会用到哪些框架和工具呢? React UI框架 Redux 状态管理工具,与 ...

  3. 优雅的在React项目中使用Redux

    概念 首先我们会用到哪些框架和工具呢? React UI框架 Redux 状态管理工具,与React没有任何关系,其他UI框架也可以使用Redux react-redux React插件,作用:方便在 ...

  4. react 使用 leaflet 百度地图_【React】react项目中应用百度地图添加起始点绘制路线...

    如图:项目中百度地图的应用添加起始点.终点并绘制路线 在展示代码的时候首先展示一下后台返回给我的接口 { 其中position_list参数代表的是用户的行驶点, area参数代表的是服务区的坐标点, ...

  5. python函数定义中参数列表里的参数是_python-函数(def)参数 及参数解构 变量 知识整理...

    函数 python 函数 由若干语句组成的语句块.函数名称.参数列表构成,他是组织代码的最小单元 完成一定的功能 函数的作用: 结构化编程对代码的最基本的封装,一般按照功能组织一段代码 封装的目的是为 ...

  6. react本地储存_如何在React项目中利用本地存储

    react本地储存 以及为什么要这么做. 本地存储是现代Web浏览器固有的Web API. 它允许网站/应用程序在浏览器中存储数据(简单和有限),从而使数据在以后的浏览器会话中可用. 在开始学习本教程 ...

  7. 中使用js修改变量值_谈一谈css-in-js在React项目中的使用

    一.什么是css-in-js 参考:[css in js 简介] 简单来说,传统的前端方案推崇"关注点分离"原则,HTML.CSS.JavaScript 应该各司其职,进行分离. ...

  8. react前端显示图片_如何在react项目中引用图片?

    如何在react项目中引用图片?本文码云笔记将为大家整理在react项目中插入图片以及背景图片的方法,希望对需要的小伙伴提供一些参考. 在react项目中插入图片以及背景图片的方法共有2种: 1.im ...

  9. 前端React项目中实现萤石云ezuikit摄像头的播放与控制

    最近要在react项目中使用萤石云提供的ezuikit库来接入萤石云摄像头,实现远程播放.控制移动.放大缩小等功能,首先百度搜类似的需求,搜不到,只能自己采坑,登萤石云官网,看对应文档. 一.登录萤石 ...

最新文章

  1. uva 315 (poj 1144 求割点)
  2. Android 蓝牙启动流程(以及设置蓝牙为作为sink模式 接收端模式)
  3. Vmware vSphere 5.0安装和配置
  4. 【项目管理】CMMI内容整理
  5. 【ZOJ - 4019】Schrödinger's Knapsack (dp,背包,贪心,组内贪心组间dp)
  6. Oracle数据库ORA-12514错误的解决办法
  7. 从Git的下载到使用github详细教程
  8. JS删除数组里的某一个元素
  9. 冗余链路中STP协议的工作过程以及二期STP收敛速度优化方案介绍
  10. Parallels Desktop的windows虚拟机无法打开iso文件
  11. networks.XXX.ipam.config value Additional properties are not allowed (‘gateway‘ was unexpected) 解决办法
  12. 云出阿里见月明(上)
  13. 中大计算机保研复试,过来人分享:平凡的我如何成功保研中山大学?
  14. 深入分析小程序与H5的区别
  15. 【PHP】小额话费充值接口开发_接入1元话费、2元话费等
  16. JavaWeb——grid布局
  17. c语言招生信息查询系统,《C语言程序设计》课程设计报-招生信息查询系统.docx...
  18. 太极计算机的销售模式,“人类周易太极八卦计算机”与“宇宙太极计算机”新模式...
  19. 英国工人手机上网欠巨债 收到2.7万英镑帐单
  20. 认识SQL并学习数据库的基本操作

热门文章

  1. Linux使用vi/vim打开文档/文件报错E325:ATTENTION Found a swap file by the name
  2. php安装mem+cache扩展,安装memcached及php扩展
  3. matlab 由移相角如何产生移相脉冲,整流电路控制角移相范围是怎么确定的?
  4. java开发原则_java开发中,大家处理异常的原则是什么,是如何处理的?
  5. mysql sql in or 替换_sql IN 的用法一例--替换 mysql longtext字段中某些内容的用法
  6. xbox虚拟服务器,Xbox One平台真相:原生Win8/虚拟化运行
  7. python实现简单的名字管理系统_python列表使用实现名字管理系统
  8. gitlab ci 配置 java_GitLab CI/CD 配置
  9. 通俗易懂的SpringBoot教程---day2---Springboot配置文件
  10. redis学习与入门~~~