react面试
<p dangerouslySetInnerHTML={{ __html: rowHtml }}>
事件 bind(this) this是undefined
静态方法来定义不需要 bind: handle = () => { }
event参数
event.target 指向当前元素,表示绑定在哪里
event.currentTarget 输出也是当前元素, 但是是假象
不是原声的event 是SyntheticEvent 组合
nativeEvent 获取原生的
nativeEvent.currentTarget 是document
所有的事件都是挂载到 document 上 和Vue是不同的
react17 绑定到 root 上,可以多个版本并存,例如微前端
最后一个参数是 event
1 List.propTypes = { 2 list: PropTypes.arrayOf(PropTypes.object).isRequired 3 }
数据提升:数据和操作都放在 外层,子组件只负责渲染
setState 为什么必须返回一个新对象
不可变值
数组的:concat / slice / filter
push pop splice不行,不能影响到原来的值 SCU方法来判断是否更新
对象 assign / 扩展运算符
可能是异步更新
在setTimeout中 setState是同步的
自定义的DOM事件中,setState是同步的
传入函数也是 异步的,但不合并
可能会被合并
调用3次,结果是 1,如果是函数 结果为 3, 合并方式和 vue不同
setState传入函数不会被合并
生命周期函数
渲染: 父构造函数 => 父render =>. 子构造函数 => 子render => 子didMount => 父didMount
更新: 父render => 子render => 子 didUpdate => 父didUpdate
受控组件 / 非受控组件
非受控组件: ref手动操作DOM元素 + defaultValue 比如:上传文件和富文本编辑器 就需要ref
Portals 类似teleport:渲染到父组件以外 createPortal(JSX, DOM节点)
场景:父组件 overflow:hidden, z-index太小
fixed组件需要放在 body 层
context 传递给每个子组件,类似 Provider
const ctx = createContext
异步组件. import(). /. Lazy / Suspense
const Demo = lazy(() => import(' ... '))
<Suspense><Demo />
性能优化:SCU
shouldCompoentUpdate(nextProps, nextState) 默认返回 true
父组件更新,子组件也会默认更新
SCU 必须配合不可变值才能有效, 不建议深度比较,所以在设计 数据的时候,层级不要定义太深
PureComponent / memo 根据 浅比较
immutable.js基于共享数据 不是深拷贝,速度更好
逻辑抽离
高阶组件: HOC(接受一个组件返回一个组件) 类似于 工厂或者 装饰器
render props: 将 render函数作为参数传递给子组件,然后在子组件中 生成有用的数据
redux使用
单项数据流 dispatch(action) => reducer产生新的state => subscribe 触发通知
store / action / reducer
react-redux:connect(mapStateToProps mapDispatchToProps)( Component )
异步action 需要 redux-thunk来实现 const add = text => ({ type: 'add', id: 3 }) const asyncAdd = text => { return dispatch => { dispatch(action) } } 或者 redux-promise / redux-saga
原理是修改 dispatch
BFC触发的条件
- float的值不是none
- position的值不是static或者relative
- display的值是inline-block、table-cell、flex、table-caption或者inline-flex
- overflow的值不是visible