加入收藏 | 设为首页 | 会员中心 | 我要投稿 核心网 (https://www.hxwgxz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 移动互联 > 正文

重构复杂的React组件:编写高效且可读组件的5个优秀实践

发布时间:2019-10-30 16:03:33 所属栏目:移动互联 来源:王强
导读:问题 React.js 已成为 Web 组件中很受欢迎的视图库。一路进化下来,它发展出了众多特性,如今已成为创建优秀的 Web 应用程序的一套完整工具。 它的社区经历了爆发式增长,尤其在过去的 2-3 年中,网络上出现了成千上万有关这项技术的教程。 因此,每位初学

下面看看这两个变化:

  1. import React, { useState } from 'react'; 
  2. import './List.css'; 
  3. const ListItem = ({ action, title, setClicked }) => { 
  4.  return { 
  5.  <li> 
  6.  <button 
  7.  onClick={() => { 
  8.  setclicked(title); 
  9.  action(); 
  10.  }} 
  11.  className="my-button"> 
  12.  {title} 
  13.  </button> 
  14.  </li> 
  15.  ); 
  16. }; 
  17. const List = ({ create, read, update, destroy }) => { 
  18.  const [clicked, setClicked] = useState(''); 
  19.  return ( 
  20.  <div> 
  21.  <hl>The last clicked button is {clicked}</hl> 
  22.  <ul> 
  23.  <ListItem title="Create" action={create} setClicked={setClicked} /> 
  24.  <ListItem title="Read" action={read} setClicked={setClicked} /> 
  25.  <ListItem title="Update" action={update} setClicked={setClicked} /> 
  26.  <ListItem title ="Destroy" action={destroy} setClicked={setClicked} /> 
  27.  </ul> 
  28.  </div> 
  29.  ); 
  30. }; 

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

4. 愿 PropTypes 与你同在!

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

  1. import React, { useState } from 'react'; 
  2. import PropTypes from 'prop-types'; 
  3. const ListItem = ({ action, title, setClicked }) => { 
  4.  return ( 
  5.  <li> 
  6.  <button 
  7.  onClick={() => { 
  8.  setClicked(title); 
  9.  action(); 
  10.  }} 
  11.  className="my-button"> 
  12.  {title} 
  13.  </button> 
  14.  </li> 
  15.  ); 
  16. }; 
  17. ListItem.propTypes = { 
  18.  action: PropTypes.func, 
  19.  setClicked: PropTypes.func, 
  20.  title: PropTypes.string 
  21. }; 
  22. const List = ({ create, read, update, destroy }) => { 
  23.  const [clicked, setClicked] = useState(''); 
  24.  return ( 
  25.  <div> 
  26.  <hl>The last clicked button is {clicked}</hl> 
  27.  <ul> 
  28.  <ListItem title="Create" action={create} setClicked={setClicked} /> 
  29.  <ListItem title="Read" action={read} setClicked={setClicked} /> 
  30.  <ListItem title="Update" action={update} setClicked={setClicked} /> 
  31.  <ListItem title ="Destroy" action={destroy} setClicked={setClicked} /> 
  32.  </ul> 
  33.  </div> 
  34.  ); 
  35. }; 
  36. List.propTypes = { 
  37.  create: PropTypes.func, 
  38.  read: PropTypes.func, 
  39.  update: PropTypes.func, 
  40.  destroy: PropTypes.func, 
  41. }; 
  42. export default List; 

PropTypes 验证

5. 切成小块

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

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

  1. import React, { useState } from 'react'; 
  2. import PropTypes from 'prop-types'; 
  3. import ListItem from './ListItem.js' 
  4. const List = ({ create, read, update, destroy }) => { 
  5.  const [clicked, setClicked] = useState(''); 
  6.  return ( 
  7.  <div> 
  8.  <hl>The last clicked button is {clicked}</hl> 
  9.  <ul> 
  10.  <ListItem title="Create" action={create} setClicked={setClicked} /> 
  11.  <ListItem title="Read" action={read} setClicked={setClicked} /> 
  12.  <ListItem title="Update" action={update} setClicked={setclicked} /> 
  13.  <ListItem title ="Destroy" action={destroy} setClicked={setclicked} /> 
  14.  </ul> 
  15.  </div> 
  16.  ); 
  17. }; 
  18. }; 
  19. List.propTypes = { 
  20.  create: PropTypes.func, 
  21.  read: PropTypes.func, 
  22.  update: PropTypes.func, 
  23.  destroy: PropTypes.func, 
  24. }; 
  25. export default List; 

(编辑:核心网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读