1.调用setstate后发生了什么?
在代码中调用了setstate函数,就会将react传入的参数与组件当前的状态相结合,然后就会触发调和过程
在经过调和过程,react就会很高效的方式,根据新的状态去构建react元素树并渲染整个UI界面
在react拿到元素树的时候,react就会自动计算出新的树和旧的数的区别,然后根据最小的区别,进行最小化渲染
在差异计算算法中,react就会精确的知道那些位置发生了变化,就保证的是按需更新,不是区别更新
2.react中element和component 的区别
element 是描述屏幕所见的内容的样式结构,对ul对象的表述,就是利用jsx构建的声明代码转化成为createElement
component 就是我们经常说的组件,我们可以接受参数输入并且返回某个函数和类
3.react中的refs
react中支持一种特殊的属性,就是refs,refs可以绑定在render()函数上去输出到组件
使用的方法
<input ref="myInput" />
var input = this.refs.myInput;
var inputValue = input.value;
var inputRect = input.getBoundingClientRect();
react.createRef()
创建refs
class MyComponent extends React.Component {
constructor(props) {
super(props);
this.myRef = React.createRef();
}
render() {
return <div ref={this.myRef} />;
}}
访问ref
当一个ref通过render放入一个元素中,一个对节点的引用可以通过ref的current属性得到;
列如
const node = this.myRef.current;
4.react中key值是干什么??
key值就是绑定一个标识,保证了元素在同级的唯一性,减少不必要的渲染
5.在生命周期,什么时候发起请求合适???
在react中,ajax请求应该放在componentDidmount 应该我们应该在组件挂载完成之后去请求数据,如果挂载之前调用,而且用了setstate添加到组件,然后没有挂载的就会报错
6.如何告诉react编译的是生产环境
在一般的情况下,我们都是使用webpack里面的defineplugin方法将NODE_ENV变量值设置成production
NODE_ENV 就是区分是开发环境还是生产环境(值有两种,produciton,product)
7.react中事件处理机制
在react中,为了解决浏览器的兼容问题,react讲原生事件封装成了合成事件,接口与原生事件是一样的,保证了事件的一致性,在这里,react的合成事件,不是讲事件直接绑定在元素上去,而是通过事件代理,将所有的事件绑定在document上,这样的好处是减少了内存的消耗,而且还可以在组件挂载和消耗的时候统一订阅和移除事件,在我们发送事件的时候,document监听,采用了事件冒泡的原理,冒泡在document元素上去的,冒泡上去的事件也是react的合成事件,不是原生事件
例如:
当用户在为onClick添加函数时,React并没有将Click时间绑定在DOM上面。
而是在document处监听所有支持的事件,当事件发生并冒泡至document处时,React将事件内容封装交给中间层SyntheticEvent(负责所有事件合成)
所以当事件触发的时候,对使用统一的分发函数dispatchEvent将指定函数执行。
8.createElement和cloneElement的区别
cleateElement是创建Element元素的函数,而cloneElement是拷贝某个元素,传入props
9.setState是异步还是同步
在我们的合成事件里面,或者是钩子函数里面就是异步的,(在我们执行异步,不会影响我们接下来的工作)
在我们原生事件,或者在setTimeout里面就是同步
10.react里面state和props的区别
在react中,state,是组件内部的状态,我们可以定义,或者操作数据,只能定义在组件内部,
props:在props,我们用到的是props,父向子传参
11.react的生命周期
constructor:在构造函数里面,我们可以在函数内部去继承父组件的属性,super必须绑定this指向
(严格来说,constructor是es6的一个函数,可以理解为react的初始化阶段)
1.初始化阶段
getDefaultProps 获取实例的默认属性
getinitialState 获取每个实例的初始化状态
componentwillMount 组件挂载之前
render组件的渲染
componentDidMount组件渲染完成
2.运行中
componentWillReceviceProps 在父组件传入的值发送改变触发的周期,接受一个参数
shouldComponentUpdate 组件接受新属性和新状态 返回true和false
componentWillUpdate 组价即将更新
render 组件重新渲染
componentDidMount 组件更新后
3.销毁期
componentWillUnmount 组件即将销毁
componentDidUnMount 组件销毁
12.什么时候用class组件和函数组件
在涉及到组件内部传参数的时候,或者用生命周期的时候,不过现在函数组件有自己的状态,有了hooks,可以保留状态,和模拟生命周期
13.调用setState,第二个参数是干什么的?
在调用setState,可以改变值,第二个参数是一个函数,我们可以在函数执行完成后渲染页面,同时我们在函数内部可以拿到更改之后的值
14.react优化在哪个生命周期?
在react中优化,可以在shoundcomponentupdata,这个方法是来判断是否需要调用render函数重新渲染dom元素,因为重新渲染dom是非常消耗性能的,如果我们可以在shoundcomponentupdata写出更优化的算法,可以极大提高性能
15.什么是diff算法
diff就是讲在虚拟Dom中,找到最小的差异,从而进行最小差异的更新
把树形结构分解开一层一层,只比较同级的元素
给列表结构每一个单元都添加一个key值,方便比较
完全相同不做处理,不相同比较最小差异,进行替换
16虚拟dom
虚拟dom就是模拟真实的dom结点的js对象
虚拟dom的好处
减少真实dom的操作,
虚拟dom可以保留上次状态,进行对比,进行最小化更新,渲染
虚拟dom是一个js的对象,可以应用在服务端渲染,不在局限于浏览器端
17.react性能优化方式
1.在react中我们可以重新写shoundcomponentupdata
2.使用production里面的react.js
3.可以使用key值,来保证最小化更新和渲染
18.原生事件和合成事件的区别
1.在原生时间里面,原生事件的事件名称是小写,而合成事件采用的驼峰命名
2.在原生事件处理的语法里面是字符串,合成事件是函数
3.因为react是自己的合成事件,所以想要阻止冒泡的时候,一个用preventdefault()
4.合成事件兼容所有的浏览器
5.把所有的事件都会放在一个数组里面,就会避免频繁的添加或删除
(js机制,首先会执行原生事件,然后才执行合成事件,在一起使用的时候,一定注意,不要阻止冒泡,会影响合成事件)
19.react的优点
1.专注于视图层
2.虚拟dom,只对虚拟dom更新,不对真实的dom更新,只对dom进行必要的更新,实现重绘的最小化
3.jsx语法
4.活跃的生态圈
5.组件化开发
20.redux篇
1.唯一的数据流,在react中只有一个state的数据源
2.保持状态只读,在视图区,状态只能读取,不能修改
3.数据的更改只能通过纯函数来实现
在reducer函数只会接受值,进行运算,redux中reducer接受参数,接受两个参数,一个是state,一个是action传入的参数,将原始值传入进行计算
action
是store的唯一来源,一般都是通过store.dispatch()将action传入到store
action内必须使用使用一个字符串类型,来表示执行的动作
import axios from "axios"
import {Dispatch} from "redux"
export const getlist = ()=>{
return async(dispatch:Dispatch)=>{
let {data} =await axios.get("/list");
console.log(data);
dispatch({
type:"GET-LIST-DISPATCH",
data
})
}
}
reducer
1.state的设计
尽可能的state规范化,没有嵌套