当前位置:首页 > 科技  > 软件

从 React 新官网学到的一个优秀实践妙招

来源: 责编: 时间:2024-04-15 18:11:54 341观看
导读在开发过程中,我们常常会遇到这样的场景。有一个列表,但是我们需要根据列表的不同类型查询并显示对应类型的数据。如头图所示。这里有一个很明确的现象就是,不同的类型会对应不同的列表,但是当我们代入抽象思维思考一下就

W5728资讯网——每日最新资讯28at.com

在开发过程中,我们常常会遇到这样的场景。W5728资讯网——每日最新资讯28at.com

有一个列表,但是我们需要根据列表的不同类型查询并显示对应类型的数据。如头图所示。这里有一个很明确的现象就是,不同的类型会对应不同的列表,但是当我们代入抽象思维思考一下就能轻易发现,除了类型不同之外,其他的所有特性都是一样的。W5728资讯网——每日最新资讯28at.com

一样的接口、一样的 UI、一样的类型、一样的交互。因此我们很容易会想到,把多个类型的列表当成同一个列表来处理,当 type 发生变化时去重新请求接口就可以轻松完成这个功能。W5728资讯网——每日最新资讯28at.com

function ListPage() {  const [list, setList] = useState([])  const [loading, setLoading] = useState(true)  const [error, setError] = useState('')  const [type, setType] = useState('all')  useEffect(() => {    setLoading(true)    api.get('xxx/xxx/xxx', type).then(res => {      setList(res.data)      setLoading(false)      setError('')    })  }, [type])  return (    <>      <Tabs type={type} onChange={setType} />      <List        list={list}        loading={loading}        error={error}        renderItem={(item) => (          <div key={item} className={s.item}>{item}</div>        )}      />    </>  )}

这样的处理是有一定合理性的,我相信很多小伙伴也会这样处理。因为他非常符合语义。W5728资讯网——每日最新资讯28at.com

不过 React 新官方文档中,提出了一个更巧妙的方式来解决这个问题。W5728资讯网——每日最新资讯28at.com

首先,我们可以将列表逻辑单独拆分为一个子组件。该子组件接收参数 type 作为一个 propsW5728资讯网——每日最新资讯28at.com

function ListPart({type}) {  const [list, setList] = useState([])  const [loading, setLoading] = useState(true)  const [error, setError] = useState('')  useEffect(() => {    api.get('xxx/xxx/xxx', type).then(res => {      setList(res.data)      setLoading(false)      setError('')    })  }, [])    return (    <List      list={list}      loading={loading}      error={error}      renderItem={(item) => (        <div key={item} className={s.item}>{item}</div>      )}    />  )}

然后这里的重点来了,在 ListPage 组件中,我们在刚才封装好的子组件 ListPart 上,传入一个 key 值。这样,我们就能够在不显示监听 type 变化的情况下,做到跟刚才一样的效果。W5728资讯网——每日最新资讯28at.com

function ListPage() {  const [type, setType] = useState('all')  return (    <div>      <Tabs type={type} onChange={setType} />      <ListPart type={type} key={type} />    </div>  )}

在 React 的 diff 过程中,当一个组件的 key 值发生了变化,那么该组件将会被重新创建。我们也正是巧妙的利用了这个内部逻辑,将代码改进成现在这样。W5728资讯网——每日最新资讯28at.com

在 ListPart 的封装中,我们还可以借助我们之前封装自定义 hook 的思路,进一步简化代码。W5728资讯网——每日最新资讯28at.com

function ListPart({type}) {  const { loading, list = [], error } = useFetch(api, type)    return (    <List      list={list}      loading={loading}      error={error}      renderItem={(item) => (        <div key={item} className={s.item}>{item}</div>      )}    />  )}

这里面由于自定义 hook useFetch 是提前封装好的工具方法,List 是提前封装好的列表组件,当我们在写页面页面时,整个列表的开发工作量将会非常小。W5728资讯网——每日最新资讯28at.com

完整代码如下:W5728资讯网——每日最新资讯28at.com

function ListPage() {  const [type, setType] = useState('all')  return (    <div>      <Tabs type={type} onChange={setType} />      <ListPart type={type} key={type} />    </div>  )}
function ListPart({type}) {  const { loading, list = [], error } = useFetch(api, type)    return (    <List      list={list}      loading={loading}      error={error}      renderItem={(item) => (        <div key={item} className={s.item}>{item}</div>      )}    />  )}

其他案例

给子组件传入 key 值,当 key 值发生变化,子组件会被重置。这样的思路还可以运用到别的类似场景。W5728资讯网——每日最新资讯28at.com

例如,你请求了一个书籍列表,但是某一个区域只能显示选中的书籍的部分信息与几条用户评价,当我们选中别的书籍时,这信息与评论都需要全部更新。W5728资讯网——每日最新资讯28at.com

这里处理起来比较麻烦的是书籍部分信息是从父级传递而来,而评论信息却是需要重新请求获取。W5728资讯网——每日最新资讯28at.com

不过借助这个思路,将会非常容易做到良好的解耦,我们只需要从父级通过 props 把书籍信息传递下来,然后在子组件内部自己去处理评论信息即可。从而断开评论信息与书籍切换的耦合。W5728资讯网——每日最新资讯28at.com

function BookProfile() {  ...  return (    <div>      ...      <CurrentBookPart info={infolist[i]} key={bookid} />    </div>  )}
function CurrentBookPart(props) {  const [comment, setComment] = useState()  ...}

总结

合理运用这个技巧,可以让我们的代码更加高效、低耦合,逻辑更加顺畅。也能够大幅度提高我们的开发效率,快快去重新查看一下你的项目,有没有可以使用这种方式重构的地方吧。W5728资讯网——每日最新资讯28at.com

React 新的官方文档确实写得非常好,提供了许多项目开发最佳实践的思路。这些思路和实用技巧,同样也适用于 Vue,也能够提高我们对 Vue 的使用心得。W5728资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-83618-0.html从 React 新官网学到的一个优秀实践妙招

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: C++中的显式虚函数重载:override与final详解

下一篇: 要么返回错误值,要么输出日志,别两样都做

标签:
  • 热门焦点
  • 影音体验是真的强 简单聊聊iQOO Pad

    大公司的好处就是产品线丰富,非常细分化的东西也能给你做出来,例如早先我们看到了新的vivo Pad2,之后我们又在iQOO Neo8 Pro的发布会上看到了iQOO的首款平板产品iQOO Pad。虽
  • 小米平板5 Pro 12.4简评:多专多能 兼顾影音娱乐的大屏利器

    疫情带来了网课,网课盘活了安卓平板,安卓平板市场虽然中途停滞了几年,但好的一点就是停滞的这几年行业又有了新的发展方向,例如超窄边框、高刷新率、多摄镜头组合等,这就让安卓
  • 5月iOS设备好评榜:iPhone 14仅排第43?

    来到新的一月,安兔兔的各个榜单又重新汇总了数据,像安卓阵营的榜单都有着比较大的变动,不过iOS由于设备的更新换代并没有那么快,所以相对来说变化并不大,特别是iOS好评榜,老款设
  • 腾讯盖楼,字节拆墙

    来源 | 光子星球撰文 | 吴坤谚编辑 | 吴先之&ldquo;想重温暴刷深渊、30+技能搭配暴搓到爽的游戏体验吗?一起上晶核,即刻暴打!&rdquo;曾凭借直播腾讯旗下代理格斗游戏《DNF》一
  • 认真聊聊东方甄选:如何告别低垂的果实

    来源:山核桃作者:财经无忌爆火一年后,俞敏洪和他的东方甄选依旧是颇受外界关心的&ldquo;网红&rdquo;。7月5日至9日,为期5天的东方甄选&ldquo;甘肃行&rdquo;首次在自有App内直播,
  • 小米汽车电池信息疑似曝光:容量101kWh,支持800V高压快充

    7月14日消息,今日一名博主在社交媒体发布了一张疑似小米汽车电池信息的照片,显示该电池包正是宁德时代麒麟电池,容量为101kWh,电压为726.7V,可以预测小
  • 华为HarmonyOS 4.0将于8月4日发布 或搭载AI大模型技术

    华为宣布HarmonyOS4.0将于8月4日正式发布。此前,华为已经针对开发者公布了HarmonyOS4.0,以便于开发者提前进行适配,也因此被曝光出了一些新系统的特性
  • 回归OPPO两年,一加赢了销量,输了品牌

    成为OPPO旗下主打性能的先锋品牌后,一加屡创佳绩。今年618期间,一加手机全渠道销量同比增长362%,凭借一加 11、一加 Ace 2、一加 Ace 2V三款爆品,一加
  • OPPO K11搭载长寿版100W超级闪充:26分钟充满100%

    据此前官方宣布,OPPO将于7月25日也就是今天下午14:30举办新品发布会,届时全新的OPPO K11将正式与大家见面,将主打旗舰影像,和同档位竞品相比,其最大的卖
Top