getInitialProps 使用经历

303 阅读3分钟

打开了编辑界面,突然发现不知道怎么写文章(局促)。。。。。 然后,这个内容纯粹自己写代码遇到问题,然后总结出来的。如果有什么问题或者建议欢迎大佬们指出并回复,感谢(鞠躬)。 前些天跟客户那边商量好了要把现在pdp页面header部分从jsp改成react(单独给pdp定制,因为其他页面还是全部都是jsp的,pdp内容部分之前就已经用的react),需求呢,是header需要保持之前jsp时的seo,由于之前pdp的内容已经是使用了getServerSideProps(是node server 端代码,无法在其中直接请求内部 API,因为会找不到地址(外部 API 可以请求,认为是这段代码是独立的 node 端代码就行了)。),考虑到以后 header 组件是会全部页面使用的,所以决定使用 getInitialProps,由于官方文档是这样写的,如下图:

image.png

我猜想,这个案例可能是巧合才写在了page上,于是我灵机一动(不是)说想试试写在子组件里面应该也能行(根本没有想到总入口从是_app.tsx然后路由访问page,然后page里面慢慢到子组件),结果就瓜起了,发现,写在子组件里,这货debug都不会进去啊(抠脑壳)。于是,我开始上网搜索,结果得到的结论都是,这货不能子组件使用。。。。

然后,我就乖乖的把这个还是写回了pdp的page.tsx里面,结果发现又又报错了(之前pdp的内容是使用了getServerSideProps):

image.png

然后我又又去看了一下文档,如下图是这样说的(感情 getServerSideProps 是 getInitialProps 这货的升级版本,只能选一个用):

image.png

考虑再三,最后觉得在page上使用的话,每次请求不同页面都得要后端返回header的数据,最后决定放弃在page使用,试试在 _app.tsx 中使用 getInitialProps 获取数据,然后用redux将返回的数据存储在store里,利用 useSelector 在需要使用的组件里面取值,哇卡卡卡,还真的成功了,可以接着写 header 啦。

image.png

可惜,天不遂人愿,高兴了没多久,又被一个问题拦住了,之前jsp写header左边的menu部分是用display: none/block的方式将所有的menu link都放在了页面上,此时seo能够抓到所有的link。但是,现在换成了使用antd的Drawer(抽屉)来展开menu,drawer的Dom会随着展开被关闭同时被移除,并且初始化(没展开)的时候Dom根本就木有,经大佬提点,说有个这个forceRender属性,可以预渲染,于是开开心心加上了这个属性,以为可以高枕无忧了,结果,还是不得行(这个是在客户端render的,都过了初始构造的时间了),wuwuwu...

image.png

最后的最后,我只能另辟蹊径,把menu link内容给存在其他的地方,给它隐藏起来,然后再放一份显示的在drawer里面作为内容,这样,不管展开关闭drawer都可以,就seo就能一直抓到link了。事情告一段落,但是还是希望有别的方法,希望大佬们帮忙给点意见建议,写完啦,谢谢大家观看。另外,也祝大家新年快乐,大吉大利!!!

参考文档: www.nextjs.cn/docs/api-re… juejin.cn/post/715253…