1. 结合项目,说下你对react响应式数据,配置数据,私有数据,共享数据,父子通信,跨组件通信,深层组件通信的理解。
2. 描述常用的hooks,并说明自己的理解。
Hook 是 React的新增特性。它可以让你在不编写 class 的情况下使用 state 以及其他的 React 特性,因此,现在的函数组件也可以是有状态的组件,内部也可以维护自身的状态以及做一些逻辑方面的处理;
最常见的hooks有:useState、useEffect
useState:在 React 函数组件中添加 state (组件内部状态)
变量 函数 和usestate(初始值)
申明:const [count, setCount] = useState(0);
调用:()=> setCount(新的值) 传入后封装的组件会重新渲染
useEffect:可以让你在组件中执行副作用操作
什么是副作用呢,就是除了状态相关的逻辑,比如网络请求,监听事件,查找 dom
useEffect 看做 react生命周期:componentDidMount
,componentDidUpdate
和 componentWillUnmount
这三个函数的组合。
无需清除的操作:发送网络请求,手动变更 DOM,记录日志
需要清除的 effect:订阅外部数据源 影响:防止引起内存泄露
如果你的 effect 返回一个函数,React 将会在执行清除操作时调用它:
return function cleanup() {}
hooks使用规则:只在最顶层中使用,不要在循环,条件或嵌套函数中调用 Hook;只能在react函数中使用
hooks的出现,使函数组件的功能得到了扩充,拥有了类组件相似的功能;
3. 描述ref引用的具体作用和具体使用场景。
useRef
返回一个可变的 ref 对象,其 .current
属性被初始化为传入的参数,,很方便地保存任何可变值,useImperativeHandle
可以让你在使用 ref
时自定义暴露给父组件的实例值,使用场景:父组件接受子组件的可变值
.描述useRef引用的作用和使用场景,ref保存的值与useState保存的值有什么区别。
需求: useRef使用场景:跨渲染取到状态值 ,用于共享state状态
useState的局限:不同渲染之间无法共享state状态值
采用useRef,作为组件实例的变量,保证获取到的数据肯定是最新的。怎么理解呢,
ref更改不会re-render(重新渲染)
let like = useRef(0) like.current = like.current + 1 有个current属性
4. 什么时候应该拆分组件,如何拆分组件?如何理解“解耦和复用需要适度”这句话。
when:代码量大,所有内容集中在一起,相同组件无法复用
why:提高可读性、可维护性 how:把相关联的东西放一起(按功能、业务)
5. Model解决什么问题,需要如何正确使用。
6. 什么时候使用自定义hook,自定义hook与config里面的函数有什么不同。
当有几个组件有相同的处理逻辑时,可以用自定义hook把组件逻辑提取出来封装一个函数,函数参数时需要传给其他组件的需要的值,自定义组件名称必须时"use"开头,
自定义hook不会共享state,调用方不会互相影响
7. "函数式风格"的代码有什么特点,请结合具体代码分析。
8. 辅助库lodash与ahooks有什么区别,分别在什么场景使用。
Lodash 是前端开发中很常用的一个工具库,里面封装了涉及数组、字符串、函数、对象等数据类型的处理方法。
ahooks,发音 [eɪ hʊks],是一套高质量可靠的 React Hooks 库。
9. 请说明Yapi和mock的作用和区别。
何为Mock?
Mock是一种根据约定规则进行数据模拟的技术,通过mock我们可以在不修改既有代码的情况下,拦截ajax请求,返回模拟的响应数据。
YApi的Mock服务 为什么选用YApi的mock呢?
-
YApi是公司主推的接口管理工具,支持swagger(是一个用于描述文档的RESTful API项目)导入;
-
不用再自己写mock规则,Yapi自带mock服务,能够根据接口的数据结构生成随机数据;
-
每一个接口都对应一个mock地址,而且地址的规则是固定的
${yapi-host}/mock/${appid}/${api-path}
,前端可以在不修改既有代码的情况下,通过反向代理调用mock服务;
10. 请描述什么是自描述的目录结构,什么是“按领域拆分模块”。
11. 请描述项目初始化时,发生了什么(app)。
12. 如何操作初始化的系统状态,获取,更新,刷新等。
13. 描述useRequest的配置和使用。
14. 描述Form组件的使用。
15. 说明umi的配置及其作用。
15. 说明umi的常用插件及其作用。
16. 说明umi的运行时配置及第一次进入页面会做什么。
17. 说明Typescript的作用,结合代码说明其特性。
说明Typescript的作用,为什么要使用Typescript
作用:添加静态类型,有点:避免经典的错误 'undefined' is not a function.易于重构和阅读,适用于大型项目,可以检测类型和编译的错误,
说明Typescript常用特性,如什么是断言,什么是类型保护
类型断言:允许你覆盖它的推断,并且能以你任何你想要的方式分析它
let foo: any; let bar = <string>foo; // 现在 bar 的类型是 'string' (常用尖括号)
类型保护:允许你使用更小范围下的对象类型
实现一:typeof
function doSome(x: number | string) {
if (typeof x === 'string') {
// 在这个块中,TypeScript 知道 `x` 的类型必须是 `string`
console.log(x.substr(1)); // ok
}
x.substr(1); // Error: 无法保证 `x` 是 `string` 类型
}
Typescript如何声明一个对象和函数的类型:
Interface方法,项目用到的大部分是echart表中
18. 描述配置列表,配置函数的使用及其类型声明,为什么有些配置需要写成函数。
19. 结合代码说明如何封装和复用代码,是否服装复用越高越好。
20. 说明组件通信的几种方式和什么情况使用哪种方式。
21.描述useMemo和useCallback的作用,区别,useMemo如何替代useCallback。
useMemo和useCallback都是reactHook提供的两个API,用于缓存数据,优化性能;两者接收的参数都是一样的,第一个参数表示一个回调函数,第二个表示依赖的数据。
共同点:在依赖数据发生变化的时候,才会调用传进去的回调函数去重新计算结果,起到一个缓存的作用
两者的区别
useMemo 缓存的结果是回调函数中return回来的值,主要用于缓存计算结果的值,应用场景如需要计算的状态
useCallback 缓存的结果是函数,主要用于缓存函数,应用场景如需要缓存的函数,因为函数式组件每次任何一个state发生变化,会触发整个组件更新,一些函数是没有必要更新的,此时就应该缓存起来,提高性能,减少对资源的浪费;另外还需要注意的是,useCallback应该和React.memo配套使用,缺了一个都可能导致性能不升反而下降。
3. 描述常用的hooks及hook使用规范,说明自己的理解。
5. 什么时候使用自定义hook,自定义hook与config里面的函数有什么不同。
6. 描述useMemo和useCallback的作用,区别,useMemo如何替代useCallback。
7. 描述useRef引用的作用和使用场景,ref保存的值与useState保存的值有什么区别。
8. 说明Typescript的作用,为什么要使用Typescript。
9. 说明Typescript常用特性,如什么是断言,什么是类型保护。
10. 说明Typescript如何声明一个对象和函数的类型。
11. 什么时候应该拆分组件,如何拆分组件,如何适度的解耦和复用。
13. 描述redux的流程和特性,为什么要使用redux。
14. Model解决什么问题,需要如何正确使用。
15. 描述Form表单的使用,onValuesChange和onFinish的区别, form.setFieldsValue和getFieldsValue的用法。
16. 描述useRequest的用法及其配置。
what:一个强大的异步数据请求特殊函数。
常见用法举例: 分自动触发和手动触发
useRequest 第一个参数是一个异步函数,就是我们封装在services的请求函数
自动触发的场景:一般为get请求,初始化页面的时候自动触发,有点像vue的created;
手动触发的场景:一般认为相当于post的请求,有run属性,常见的有手动传参刷新
17. 辅助库lodash与ahooks有什么区别,分别在什么场景使用。
18. 请描述项目初始化时,App文件做了什么。
19. "函数式编程风格"的代码有什么特点,请结合具体代码分析。
20. 如何获取和操作页面初始化的状态(initialState)。
21. 请说明Yapi和Mock的作用和区别。
22. 说明该项目中umi的插件及其作用。