1、什么是react元素
React应用的最小单位,他描述了你在屏幕上看到的内容,react元素的本质是一个普通的js对象。
2、react的组件
- 函数式组件就是一个函数,他接受一个属性对象,返回一个react对象
- 类组件就是一个类,需要有一个render方法,render方法需返回并只能返回一个顶级react元素
- 不论是类组件还是函数式组件,首字母必须大写,因为react是用过首字母来区分到底是是自定义组件(大写)还是原生dom组件(小写)
- 受控组件是input框的value值受状态控制,非受控组件是input框的value值不受状态控制
- 组件的状态有两种:1)属性:是父组件给子组件的,不可修改。2)状态,是组件内部初始化的,改变状态的唯一方法是setState
- 函数组件和类组件的优缺点:1)类组件的性能消耗较大,因为类组件需要创建实例,并不能被销毁。2)函数组件性能消耗小,因为函数组件不需要创建实例,渲染的时候执行以下就好得到返回的react元素后直接把中间的变量都销毁了
3、静态属性的优点
- 使用方便,例如通过Person.propTypes就可以调用
- 只有一份节约内存,动态属性每new一个实例都要创建一份,但是静态属性永远只有一份
- 能用静态属性就不要用动态属性
4、关于setState
- 不要直接修改state,直接修改不能刷新页面。setState包含了刷新页面的操作
- setState的更新可能会被合并,老有新有则更新,老没有新有则添加,老有新没有则保持原状
- setState的更新可能是异步的,在react生命周期里和事件处理函数里setState的时候并不会直接修改状态,而是先把partialState放入一个数组缓存起来,等事件执行结束了再统一更新,在setTimeout原生事件是同步的。
5、关于ref(reference 引用)
- refs提供了一种允许我们访问dom元素的方式
- ref允许我们访问dom节点或者在react中创建组件实例
- ref可以是字符串、函数、对象
- 不能再函数组件中使用ref,因为函数组件没有实例
- forwardRef转发ref,ref转发是一项将ref自动的通过组件传递到子组件的技巧,refs转发允许某些组件接受ref并向下传递。
- createRef每次会返回一个新的对象,useRef是在函数里面的,每次返回相同的对象,所以createref浪费性能。
6、为什么三个will生命周期没了
因为在react16里面添加了fiber,fiber的渲染过程是可以被暂停、终止和重新启动的,所以他可能会有很多暂停、重启的阶段,所以可能will的生命周期会触发多次
7、React的domdiff和vue的domdiff有何区别
-
Vue是组件化更新,一个值更新了会引起关联组件的更新,其他组件不受影响。缺点:需要监听watcher,优点:速度快。
-
React是全量比较,从根节点开始全量比较,该更新的更新,不该更新的不更新。所有组件都会涉及到,但他不需要watcher。当页面中组件太多时可以引入fiber,把大的比较任务拆分成多个小任务,可能暂停恢复执行,把任务放在浏览器空闲的时候去执行。在dom对比的时候,只要key一样类型一样,就认为他是一个dom。React元素都是不可变对象,react只会更新必要的部分。如果说新老的虚拟dom是一样的则不作任何操作。
8、 路由有三种渲染方式
-
- Component 它不能加逻辑
-
- Render 属性是一个函数,渲染函数的返回值
-
- Navlink 的child
9、react生命周期(旧版)
1)react初次dom渲染的函数:constructor –> componentWillMount --> render –> componentDidMount
- constructor:阶段可做与数据相关的操作,如:获取sectionstroge、Cookie
localstroge和 请求数据 - componentWillMount:功能与constructor类似
- render:他是一个纯函数,不能调用setstate进行数据改变,不做数据的产生和保存,它的作用是返回数据和dom拼接好的jsx结构
- componentDidMount:dom编译完成,并且渲染到真实dom中。可以做dom处理,可以做具体事件监听,还可以做某些插件实例化。
2)react更新阶段的生命周期函数:componentWillReceiveProps --> shouldComponentUpdate --> componentWillUpdate --> render -->componentDidUpdate
- componentWillReceiveProps:相当于vue的computed计算属性,作用:当父组件出入子组件的数据进行改变是,会执行此函数,可以将props再次赋值给state。也可以说是用来监听props变化的
- shouldComponentUpdate:这是一个优化函数,此处必须有返回值true或者false,返回值为true时才会更新视图,在提高项目渲染性能时用。
- componentWillUpdate:在render之前最后一次可以改变数据的地方
- componentDidUpdate:同componentDidMount一个用法
3)卸载过程
- componentWillUnmount:与dom相关的操作,在组件销毁前,一定在这里做相应的处理,比如事件监听,插件的dom实例化等等
10、jsx的onClick和html的onclick的区别
-
Html onclick的弊端:注册的事件处理函数是全局环境,会污染全局环境。使用onclick的dom元素,如果在dom树中删除时,必须手动注销事件处理器,否则会造成内存泄漏
-
Jsx的onclick:挂载的没一个函数都是组件内部的,而不是全局的,无论多少个onclick都是事件委托的方式,在dom树顶层添加一个事件监听函数,此函数会根据具体组件分配具体的函数
11、react的组件通信
- 父给子传递,props
- 子给父传递,借用callback函数
- 兄弟组件之间的通讯:状态提升(借用公共父组件传值)和 发布者订阅者模式
12、高阶组件
- 高阶组件抛出的是函数而不是组件
- 高阶组件使用时会接收一个组件作为参数传入
- 一般采用state的状态来管理是否到了渲染传入组件的时机
- 如果处理数据,获取数据落其他的业务处理完毕,再渲染传入组件