11import Image from 'next/image'
22import { useRouter } from 'next/router'
33import { NextSeo } from 'next-seo'
4+ import { useMemo } from 'react'
45import { ReactColorIcon } from 'ui'
56
67import Benefits from '~/components/careers/Benefits'
78import { EngineerHiringProcess } from '~/components/careers/HiringProcess'
89import { useCareersLayoutConfig } from '~/components/layouts/CareersLayout'
910
10- import SlackCloneImage from '~/assets/Slack Clone 1 .png'
11+ import ExampleImage from '~/assets/react-interview-example .png'
1112
1213export default function ReactInterviewPageInChina ( ) {
1314 const { query } = useRouter ( )
@@ -19,6 +20,14 @@ export default function ReactInterviewPageInChina() {
1920 title,
2021 } )
2122
23+ const branchName = useMemo (
24+ ( ) =>
25+ `interview/${ new Date ( ) . getMonth ( ) + 1 } -${ new Date ( ) . getDate ( ) } ${
26+ candidate ? '_' + candidate : ''
27+ } `,
28+ [ candidate ]
29+ )
30+
2231 return (
2332 < >
2433 < NextSeo title = { title } />
@@ -31,74 +40,99 @@ export default function ReactInterviewPageInChina() {
3140 { isRemote ? (
3241 < >
3342 < h2 > 准备事项</ h2 >
34- < p > 首先你可以从以下两种方案中选择一条:</ p >
3543 < ol >
3644 < li >
37- 使用我们提供的在线IDE环境,在线编辑代码,并< b > 在线</ b > 提交代码;
45+ 在本地克隆我们的{ ' ' }
46+ < a href = "https://github.com/zolplay-cn/react-interview" >
47+ GitHub仓库
48+ </ a >
3849 < blockquote >
39- 在线Replit IDE:
40- < a
41- href = "https://replit.com/join/rkfkrflilu-zolplay"
42- target = "_blank"
43- rel = "noreferrer"
44- >
45- 加入链接
46- </ a >
50+ < code >
51+ git clone https://github.com/zolplay-cn/react-interview.git
52+ </ code >
4753 </ blockquote >
54+ ;
4855 </ li >
4956 < li >
50- 使用自己的电脑环境与代码编辑器,分享屏幕,并在< b > 本地</ b >
51- 提交代码;
52- < blockquote >
53- 在本地建立一个Git仓库,并新建一个React项目(脚手架自选)
54- </ blockquote >
57+ 基于 < code > main</ code > 分支,创建一个新的分支名叫{ ' ' }
58+ < code > { branchName } </ code > ,并切换到该分支;
59+ </ li >
60+ < li > 使用你喜爱的代码编辑器/IDE打开文件夹项目;</ li >
61+ < li > 在文件夹项目根目录下,使用pnpm安装依赖(或npm/yarn);</ li >
62+ < li >
63+ 运行 < code > pnpm/npm/yarn run dev</ code > 命令,启动项目
5564 </ li >
5665 </ ol >
5766 </ >
5867 ) : (
5968 < >
6069 < h2 > 准备事项</ h2 >
61- < p >
62- 首先你需要在项目文件目录中开启一个新的Git分支,起名叫做 { ' ' }
63- < code >
64- interview/
65- { ` ${ new Date ( ) . getMonth ( ) + 1 } - ${ new Date ( ) . getDate ( ) } ${
66- candidate ? '_' + candidate : ''
67- } ` }
68- </ code >
69- </ p >
70+ < ol >
71+ < li >
72+ 在项目目录中开启一个新的Git分支名为 < code > { branchName } </ code >
73+ ,并切换到该分支;
74+ </ li >
75+ < li >
76+ 运行 < code > pnpm dev </ code > 命令,启动项目;
77+ </ li >
78+ </ ol >
7079 </ >
7180 ) }
7281
73- < h2 > 面试测试题流程 </ h2 >
82+ < h2 > 面试测试题要求 </ h2 >
7483
75- < p > 现在有一个设计稿UI图如下:</ p >
84+ < p >
85+ 我们为你准备了一个类似Spotlight的搜索器界面,可以先查阅现有的项目代码并熟悉一下项目的结构。
86+ </ p >
7687
7788 < section className = "-mx-[10vw] rounded-2xl border-2 border-sky-300/20 shadow-2xl shadow-indigo-500/20" >
7889 < Image
79- src = { SlackCloneImage }
90+ src = { ExampleImage }
8091 placeholder = "blur"
81- alt = "Slack Clone "
92+ alt = "Example "
8293 className = "rounded-2xl"
8394 layout = "responsive"
8495 />
8596 </ section >
8697
87- < p > 请使用React Hooks形式的函数组件来实现界面布局,并最大程度上地还原UI</ p >
88- < p > (不限制任何框架、第三方库的使用)</ p >
98+ < p > 熟悉完之后我们就可以投入到测试题开发当中,你需要完成以下几个要求:</ p >
99+
100+ < ul >
101+ < li >
102+ 当搜索输入框的值发生改变的时候,应该触发一个搜索请求,请求的URL为
103+ < code > /api/search?q=QUERY</ code > ;
104+ </ li >
105+ < li >
106+ 将返回的搜索结果替换在列表中显示,并传真实数据到{ ' ' }
107+ < code > <RepositoryOption /></ code >
108+ 组件中,并对该组件进行封装能够动态渲染仓库信息;
109+ </ li >
110+ < li >
111+ 当搜索结果为空时,应该显示一个提示信息,提示信息的内容为:
112+ < code > 暂无 QUERY 的相关仓库信息</ code > ;
113+ </ li >
114+ < li >
115+ 确保每次发出的搜索请求间隔 < b > 大于等于500ms</ b > ;
116+ </ li >
117+ </ ul >
89118
90119 < h2 > 加分项</ h2 >
91- < p > 下列加分项并非必须,但是可以为你的题目完成增加一些额外的分数 :</ p >
120+ < p > 在时间允许的前提下,可以选择性完成任意一个/多个加分任务 :</ p >
92121 < ul >
122+ < li > 优化搜索结果的渲染,使其可以更加高效的渲染,提高用户体验;</ li >
123+ < li > 给UI添加动画效果,增加用户体验;</ li >
93124 < li >
94- Semantic 语义化的 HTML5 标签使用,而不是滥用{ ' ' }
95- < code > <div /></ code >
125+ 当选中仓库信息的时候,应该在浏览器中打开仓库的链接,并且查看仓库的详细信息。
126+ </ li >
127+ < li >
128+ 增加一个搜索历史记录,用户可以在搜索框中输入关键字,并且可以查看历史记录。
96129 </ li >
97- < li > 添加合理的交互动画,让UI更加生动;</ li >
98- < li > 组件化代码,让代码更加简洁;</ li >
99- < li > 使用TypeScript完成代码;</ li >
100130 </ ul >
101131
132+ < br />
133+ < p > ======= 分割线 =======</ p >
134+ < br />
135+
102136 < h2 > 福利待遇</ h2 >
103137 < Benefits />
104138
0 commit comments