# React组件之间如何通讯
父子组件props
自定义事件
Redux和Context
# JSX本质是什么
JSX解析出来后就是一个createElement函数,执行会返回一个vnode
# Context是什么,如何应用
父组件向其下所有子孙组件传递信息,如一些简单的公共信息:主题色、语言等。复杂的公共信息请用redux
# shouldComponentUpdate的用途
性能优化
配合不可变值一起使用,否则会出错
# redux单向数据流
# setState场景题
componentDidMount() {
this.setState({ count: this.state.count + 1 })
console.log('1', this.state.count) // 0
this.setState({ count: this.state.count + 1 })
console.log('2', this.state.count) // 0
setTimeout(() => {
this.setState({ count: this.state.count + 1 })
console.log('3', this.state.count) // 2
})
setTimeout(() => {
this.setState({ count: this.state.count + 1 })
console.log('4', this.state.count) // 3
})
}
上面这道题考察了setState异步、合并和setTimeout中是同步的
# 什么是纯函数
返回一个新值,没有副作用,不会修改其他值,重点是不可变值
# React组件生命周期
单组件生命周期
父子组件生命周期
生命周期中注意SCU
# React发起ajax应该放在哪个生命周期
应该放在componentDidMount这个生命周期上,放在一个DOM已经渲染完的生命周期上
# 列表渲染为什么要用key
diff算法中通过tag和key来判断,是否是相通的DOM节点,用key可以减少渲染次数,提升渲染性能
# 函数组件和class组件的区别
纯函数输入props输出JSX
没有实例没有生命周期没有state
不能扩展其他方法
# 什么是受控组件
表单值的要受state控制,需要自行监听onChange更新state
对比非受控组件回答
# 何时时候异步组件
加载大组件
路由懒加载
# 多个组件有公共逻辑,如何抽离
高阶组件HOC
Render Props
# redux如何进行异步请求
使用异步action,如redux-thunk
同步action会直接返回一个action对象,异步action是在异步中dispatch一个action
# react-router如何配置懒加载
import { BrowserRouter as Router, Route, Switch } from 'react-router-dom'
import React, { Suspense, lazy } from 'react'
const Home = lazy(()=>import('./routes/Home'))
const App = () => {
<Router>
<Suspense>
<Switch>
<Route exact path="/" component={Home}></Route>
</Switch>
</Suspense>
</Router>
}
# PureComponent有何区别
实现了浅比较的shouldComponentUpdate,目的是性能优化,但要结合不可变值来使用
# React事件和DOM事件的区别
所有事件都挂载到document上,event不是原生的,是SyntheticEvent合成事件对象,以及它还有个dispatchEvent机制
# React性能优化
渲染列表时使用key
自定义事件、DOM事件及时销毁
合理使用异步组件
减少函数bind this的次数
合理使用SCU、PurComponent、memo
合理使用Immutable.js
前端通用性能优化,如图片懒加载
webpack方面的优化
# React和Vue的区别
都支持组件化
都是数据驱动视图
都是使用vdom操作DOM
React使用JSX拥抱JS,Vue使用模板拥抱html
React是函数式编程,Vue是声明式编程
React更多需要自立更生,Vue把想要的都给你
← Hooks梳理