react常见问题整理(一)
第一部分:react部分
1.react中不同组件之间如何做到数据交互?组件通信
2.react生命周期函数?
3.react性能优化是哪个周期函数?
4.react中 虚拟 dom 会提高性能?
5.react中 diff 算法原理?
6.react中refs的作用是什么?
7.react中key的作用是什么?
8.React组件中props和state有什么区别?
9.react中setstate之后做了什么?
10.高阶组件(higher order component)
11.react性能优化方案
12.redux介绍一下?
13.redux的缺点?
14.redux中间件?
15.react中组件分为那俩种?
16.react中函数组件和普通组件的区别?
17.react中如何打包上传图片文件?
18.react 按需加载?
19.react-router?
以下未整理:
20.列举重新渲染render的情况
21.组件绑定和js原生绑定事件哪个先执行
22.fetch的延时操作
23.A 组件嵌套 B 组件,生命周期执行顺序
24.新出来两个钩子函数?和砍掉的will系列有啥区别?
25.对单向数据流和双向数据绑定的理解,好处?
26.redux本来是同步的为什么它能执行异步代码(chunk)实现原理是什么 中间件的实现原理是什么
27.
React
一、 有了解过React.js吗?
React.js 只是一个视图库
(1)声明式设计
(2)高效:通过对DOM的模拟,最大限度的减少与DOM的交互。
(3)灵活:可以与已知的框架或库很好的配合。
(4)JSX:是js语法的扩展,不一定使用,但建议用。
(5)组件:构建组件,使代码更容易得到复用,能够很好地应用在大项目的开发中。
(6)单向响应的数据流:React实现了单向响应的数据流,从而减少了重复代码,这也是解释了它为什么比传统数据绑定更简单。
1
####组件通信
父子
父->子 props 通过ref进行标记 就可以将子组件的方法挂载到父组件上 调用子组件的更改方法
子->父 子组件通过props 获得父组件的修改方法 调用父组件的更改方法 类似于自定义事件
兄弟
亲兄弟 进行结合
1.子组件a调用父组件的方法修改父组件的state 子组件2通过props 获取父组件修改的状态值
2.子组件a调用父组件的方法 子组件b通过ref 将修改自己state的方法挂载父组件上 由 子组件a进行调用
2
? 初始化阶段:
? getDefaultProps:获取实例的默认属性
? getInitialState:获取每个实例的初始化状态
? componentWillMount:组件即将被装载、渲染到页面上
? render:组件在这里生成虚拟的 DOM 节点
? componentDidMount:组件真正在被装载之后
? 运行中状态:
? componentWillReceiveProps:组件将要接收到属性的时候调用
? shouldComponentUpdate:组件接受到新属性或者新状态的时候(可以返回 false,接收数据后不更新,阻止 render 调用,后面的函数不会被继续执行了)
? componentWillUpdate:组件即将更新不能修改属性和状态
? render:组件重新描绘
? componentDidUpdate:组件已经更新
? 销毁阶段:
? componentWillUnmount:组件即将销毁
?
3.
shouldComponentUpdate这个方法用来判断是否需要调用render方法重新描绘dom。因为dom的描绘非常消耗性能,如果我们能在shouldComponentUpdate方法中能够写出更优化的dom diff算法,可以极大的提高性能。
用 JavaScript 对象结构表示 DOM 树的结构;然后用这个树构建一个真正的 DOM 树,插到文档当中当状态变更的时候,重新构造一棵新的对象树。然后用新的树和旧的树进行比较,记录两棵树差异把 2 所记录的差异应用到步骤 1 所构建的真正的 DOM 树上,视图就更新了。
5.
? 把树形结构按照层级分解,只比较同级元素。
? 给列表结构的每个单元添加唯一的 key 属性,方便比较。
? React 只会匹配相同 class 的 component(这里面的 class 指的是组件的名字)
? 合并操作,调用 component 的 setState 方法的时候, React 将其标记为 dirty.到每一个事件循环结束, React 检查所有标记 dirty 的 component 重新绘制.
? 选择性子树渲染。开发人员可以重写 shouldComponentUpdate 提高 diff 的性能。
6.
Refs 是 React 提供给我们的安全访问 DOM 元素或者某个组件实例的句柄。我们可以为元素添加 ref 属性然后在回调函数中接受该元素在 DOM 树中的句柄,该值会作为回调函数的第一个参数返回:
class CustomForm extends Component {
handleSubmit = () => {
console.log("Input Value: ", this.input.value)
}
render () {
return (
type=‘text’
ref={(input) => this.input = input} />
Submit
)
}
}
上述代码中的 input 域包含了一个 ref 属性,该属性声明的回调函数会接收 input 对应的 DOM 元素,我们将其绑定到 this 指针以便在其他的类函数中使用。另外值得一提的是,refs 并不是类组件的专属,函数式组件同样能够利用闭包暂存其值:
function CustomForm ({handleSubmit}) {
let inputElement
return (