react

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值,方便比较
完全相同不做处理,不相同比较最小差异,进行替换


image.png

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规范化,没有嵌套

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容