试了下 React 的 FC 式写法...

2020-09-01 · 周二一般阵雨

一直在研究如何解决我 React 后台右上角功能菜单该如何设计,这个东西涉及到跨组件操作,最终实现是在“列表页”显示“新增”,在“编辑页”显示“添加草稿”这样的菜单项。

想要实现这个操作,我总不可能封装一个组件,每切换一个页面就重新渲染一个上去吧!这个菜单目前是放在了 Header 里面,和下面的路由组件基本上是同等关系。

<Aside> 侧边栏
<Header> 页面头部
<Route> 渲染页面内容

一开始想过使用 Redux 实现,感觉有点小题大做。而 @Innei 之前告诉过我 React 有个叫做 Context 的东西,我看了半天,也试着写了进去,都没效果,真是头疼!

正当此时,我想起自己之前封装的 Fetcher 组件 - 基于 Fetch 封装的一个破玩意儿。它有一个“额外附加”的功能,可以让网页登录完成后的所有请求都带上指定的 Header。那就说明任何页面「import」之后,其实都是指向同一个组件的。鉴于这个特点,我就搞了一个专门堆数据的“存储组件”,并在需要它的页面上直接 map 遍历... 虽然 DOM 的刷新貌似有延迟,但是在功能上貌似是完全没问题!最起码可以点击操作!

import {data as theData} from '../utils/data';
...
theData.side_menu.map((item, key) => {})

操作菜单项的内容是没问题了,但是我之前的“登出”菜单项还是不行,点完之后报错。因为没有拿到 React-Router 的 History 对象,无法「push」跳转回登录界面。翻了半天文档,只发现 这个 名为 useHistory 的 Hooks API 貌似可行,但是我写的还是 HOC,并非 FC,无法使用 Hooks,那该怎么搞啊!

最终决定,直接更换 FC 式写法!因为这个 Header 组件里面没有太多涉及到生命周期的东西,于是就直接研究起了 FC 了!

import React, {useState} from "react";
import {data as theData} from '../utils/data';
import {Link, useHistory} from 'react-router-dom';

function Header(props) {
  const [menu, setMenu] = useState(false);

  // 切换菜单
  const toggle = () => setMenu(!menu);

  // 注销
  const history = useHistory();
  const logout = () => {
    sessionStorage.removeItem("paul-token");
    history.push("/");
  }

  return (
    <header>
        ...
    </header>
  );
}

写完测试了一下,一切功能基本正常。可让我没想到的是,其实 React-Router 也是有 HOC 写法的,那个东西叫做 withRouter!@Innei 一眼就看到了,而我翻了半天压根就没留意到这个东西!他说 HOC 写法其实就是套娃,确实有这种感觉,多了层东西就更臃肿了。

class ShowTheLocation extends React.Component {
  static propTypes = {
    match: PropTypes.object.isRequired,
    location: PropTypes.object.isRequired,
    history: PropTypes.object.isRequired
  };

  render() {
    const { match, location, history } = this.props;

    return <div>You are now at {location.pathname}</div>;
  }
}

const ShowTheLocationWithRouter = withRouter(ShowTheLocation);

除了讨论技术,我还和 @Innei 讨论了有关目前就业的问题。他希望我跑跑上海北京这样的城市,可我却始终保守,担心在那边生活的严峻。毕竟很少出过远门,对当地的生活物价等等完全没有认识。再一个就是我对自己的技术仍然没有特别的自信,我不知道去那里会不会被 HR 吊打,压低底薪什么的!虽然都说年轻人就是得多闯闯,但我始终拿不出信心。可回想起之前在金山的苦逼实习经历,瞬间觉得我当时的举措是非常正确的...

欢迎你去看看他的想法:活在危机中

流光

流光

羽翼深蓝Wings
Paul

Paul

特立独行的一只前端菜狗。这篇日记编写大概耗时了 0 分钟,内容均为个人原创,并采用 CC BY-NC-SA 4.0 授权协议,转载请注明来源,谢谢!如本站内容对你有所帮助的话,不妨 捐助支持 一下?

近期评论

鲍小螺: 前辈多多指教!ahu: 后生可畏寻梦xunm: 真不错,板子很好看。timochan: 太惨了( ,更新暴毙,如果恢复没成功,数据也 dump 不出来鲍小螺: 在这部分对话中,广树和保罗继续讨论生活的不同方面。保罗提到了技术更新和国内的优秀 IT 技术。广树解释了在国内积累的经验如何在日本产生穿越的感觉,并表达了对于日本生活节奏的喜爱。他还提到了医疗水平的差异和对于生活方式的感受。保罗表示,通过动漫和现实的对比,艺术来源于现实,日本生活的确有着独特之处。他们讨论了国内的生活节奏和就医等方面的压力,以及个人选择的自由。最后,他们也谈到了不结婚不买房的选择和对于房价的困扰。鲍小螺: 该对话进一步讨论了房地产和税收的问题。保罗提到了国内的房地产税和增值税以及日本的固定资产税。广树解释了日本房地产税的收取方式,以及房产税对于国内房产的影响。他认为,与国内相比,日本的房子质量和服务更好。保罗提出疑问,为什么自己拥有的地也要交税。广树解释了类似增值税的原理,并指出在日本拥有房产是稳定安全的。最后,保罗表示从广树的角度来看,情况确实是如此。鲍小螺: 这篇文章的聊天记录也尝试过用 GPT 总结,结果并不是太好,不知道是不是 Prompt 的问题,实际出来的内容过于简练了,于是又耗费了半小时写完,呼~
奇趣音乐盒技术源于 Kico Player
Emmm,这里是歌词君