Geekiter / geekiter.github.io

0 stars 0 forks source link

240305Note: fe - React #19

Open Geekiter opened 7 months ago

Geekiter commented 7 months ago

React

一、组件基础

1. React 事件机制

<div
    onClick={this.handleClick.bind(this)}
>
    点我
</div>

react并不是将click事件绑定到div真实的dom上,而是在document处监听了所有的事件。当事件发生并且冒泡在document处时,react将事件内容封装并交给真正的处理函数处理,这样的方式不仅仅减少了内存的消耗,还能在挂件在销毁时统一订阅和移除事件。 除此之外,冒泡到document上的事件也不是原生的浏览器事件,而是由react自己实现的合成事件。因此不想事件冒泡,应该调用event.preventDefault()方法,而不是调用event.stopPropagation()方法。 So,

9. React 高阶组件是什么,和普通组件有什么区别,适用什么场景

const BlogPostWithSubscription = hoc(BlogPost, (DataSource, props)=>DataSource.getBlogPost(props.id));

//普通组件 import React, {Component} from "react";

class MyCompoent extends Component{ render(){ return

...
}

}

function MyCompoent(props) { return

...

}


#### 11. 哪些方法会触发 React 重新渲染?重新渲染 render 会做些什么?
- 哪些方法
    - State
    - Props
    - force update
    - 生命周期方法
    - Context变化
- 会做些什么
    - 调用render生成虚拟dom
    - 用Diff算法对新旧虚拟DOM节点进行对比
        - 对新旧两棵树进行深度优先遍历,进行标记对比。更具差异类型和对应的规则更新变化部分的虚拟DOM节点
    - 生命周期调用

#### 14. 对有状态组件和无状态组件的理解及使用场景

无状态一般是纯展示性的组件,简单UI。
有状态适用于复杂UI和处理用户交互的组件。

#### 23. React中什么是受控组件和非控组件?

- 受控组件
    - 受到state控制
    - 用户与组件交互时,通常会触发事件来处理函数,更新组件state
- 非受控组件
    - 不受state控制
    - 由DOM元素本身管理
    - 在非受控组件中,可以使用ref来获取输入框的值
#### 28. 类组件与函数组件有什么异同?
- 不同
    - 生命周期
        - 在react16.8之前,函数组件没有生命周期
    - 代码量,函数更轻量
    - 性能,函数更快,但是微不足道
    - 初始化状态,类组件在构造函数中进行,函数组件在useState hook来初始化状态

- 共同
    - 用途,都是为了构建用户界面和定义组件行为
    - 组件特性,都可以接受输入props
    - 组件嵌套,都可以嵌套成组件树

23
## 数据管理

#### 1. React setState 调用的原理
- 首先调用setState入口函数,根据输入参数不同,分发到不同功能函数中去
```js
ReactComponent.prototype.setState = function(partialState, callback){
    this.updater.enqueueSetState(this, partialState);
    if (callback) {
        this.updater.enqueueCallback(this, callback, "setState");
    }
}

2. React setState 调用之后发生了什么?是同步还是异步?

在代码中调用setState,React会将传入的参数对象与组件当前的状态合并,然后触发调和过程,经过调和过程。React会以相对高效的方式根据新的状态React元素树并且着手重新渲染整个UI界面。 React得到元素树之后,React会自动计算出新的树和老树的节点差异,然后根据差异对界面进行最小化重新渲染。在差异计算算法中,React能够精确地知道哪些位置发生了改变以及如何改变,这就保证了按需更新,而不是重新渲染。如果短时间频繁setState,React会将state的改变压入栈,在合适的时机,批量更新state和视图,达到提高性能的效果。

9. React组件的state和props有什么区别?

三、生命周期

1. React的生命周期有哪些?

四、组件通信

1. 父子组件的通信方式?

class Parent extends Component { callback(msg){ console.log(msg) } render(){ return }

}

#### 2. 跨级组件的通信方式?

父组件向子组件的子组件通信,向更深层子组件通信:

- props
- context
```js
const BatteryContext = createContext();
// 子组件的子组件
class GrandChild extends Component {
    render(){
        return (
            <BatteryContext.Consumer>
                {
                    color => <h1
    style={{"color": color}}我是红色的:{color}></h1>
                }
            </BatteryContext.Consumer>

        )
    }
}

// 子组件
const Child = () => {
    return (
        <GrandChild/>
    )
}

// 父组件
class Parent extends Component {
    state = {
        color: "red"
    }
    render(){
        const {color} = this.state;
        return (
            <BatteryContext.Provider value={color}>
                <Child></Child>
            </BatteryContext.Provider>
        )
    }

}

3. 非嵌套关系组件的通信方式?

5. 组件通信的方式有哪些

五、路由

1. React-Router的实现原理是什么?

7. React-Router的路由有几种模式?

六、Redux

1. 对 Redux 的理解,主要解决什么问题

react是视图层框架,redux是一个用来管理数据状态和UI状态的js应用工具。随着js单页应用变得复杂,js需要更多状态,redux就是为了降低管理难度的。 在redux中,提供了一个叫store的统一仓储库,组件通过dispatch将state直接传入store,不用通过其他组件。并且组件通过subscribe从store获取到state的改变,使用了redux,所有的组件都可以从store获取到所需的state,他们也能从store获取到state的改变。 解决的问题:react-redux的作用是将redux的状态机和react的ui绑定在一起,当你dispatch action改变state的时候,会自动更新页面。

2. Redux 原理及工作流程

工作流程

  1. view通过dispatch发出action
  2. store调用reducer,传入state、action,reduce返回新的state
  3. state有了变化,store调用监听函数,更新view

9. Redux 和 Vuex 有什么区别,它们的共同思想

1. 对 React Hook 的理解,它的实现原理是什么

hook让组件实现变得更加简洁。 闭包

2. 为什么 useState 要使用数组而不是对象

3. React Hooks 解决了哪些问题?

八、虚拟DOM

1. 对虚拟 DOM 的理解?虚拟 DOM 主要做了什么?虚拟 DOM 本身是什么?

虚拟DOM是一个React的优化手段,通过在内存中维护一份轻量的DOM副本,实现更高效的渲染和更新机制。 工作流程:

2. React diff 算法的原理是什么?

diff算法是为了找出新旧虚拟DOM之间的差异,以最小化对实际DOM的操作。 算法的核心:

九、其他

5. 对 React 和 Vue 的理解,它们的异同

12. 在React中遍历的方法有哪些?

遍历数组,map&&forEach

arr.map((item, index) => {

})

arr.forEach((item, index) => {

})

遍历对象,map for in

for(const key in obj){
    if(obj.hasOwnProperty(key){
        const value = obj[key]
        domArr.push(...)
    })
}

Object.entries(obj).map(([key, value], index)=>{

})

19. 对React SSR的理解

服务端渲染是数据与模板组成的html,即html=数据+模板。将组件或页面通过服务器生成html字符串,再发送到浏览器,最后将静态标记混合为客户端上完全交互的应用程序。页面没使用服务渲染,当请求页面时,返回的body为空,之后执行js将html结构注入到body里,结合css显示出来

react并没有强制使用jsx,jsx类似一种语法糖,代码更为简洁和清晰。