shuangmianxiaoQ / study-note

日常学习或工作笔记
6 stars 1 forks source link

React 相关面试题 #49

Open shuangmianxiaoQ opened 5 years ago

shuangmianxiaoQ commented 5 years ago

虚拟 DOM 和 Diff 算法

虚拟DOM

JS对象的形式来表示的一棵DOM树,本质上就是JS对象

Diff算法

标准的的Diff算法复杂度需要O(n^3),这显然不能满足性能要求,而React中使得算法复杂度降低到了O(n),主要是基于以下几点假设,也就是Diff策略:

  1. Web UI中的DOM节点跨层级移动的操作特别少,可忽略不计
  2. 两个相同组件产生类似的DOM结构,不同的组件产生不同的DOM结构
  3. 对于同一层的一组子节点,可以通过它们唯一的id进行区分

基于以上三个策略,React分别对Tree DiffComponent DiffElementDiff做了算法优化,事实也证明以上策略合理且准确的

Tree Diff

Component Diff

Element Diff

生命周期

lifecycle

新版本React中,产生以上变动的原因也是跟Fiber架构有关,Fiberreconciliationcommit两个阶段,对应的生命周期如下:

在调度阶段进行了任务分隔,涉及到 暂停 和 重启 ,因此可能会导致调度阶段的生命周期函数在一次更新渲染中被多次调用,产生一些意外的错误

setState

高阶组件

高阶组件不是组件,而是一个增强函数,输入一个元组件,返回一个新的增强组件

// 将受控组件转为非受控组件
const WithChangeInput = Input => {
  return class extends Component {
    state = { value: "" };

    handleChange = e => this.setState({ value: e.target.value });

    render() {
      return (
        <Input
          {...this.props}
          value={this.state.value}
          onChange={this.handleChange}
        />
      );
    }
  };
};

const Input = props => <input value="" {...props} />;
const HOCInput = WithChangeInput(Input);

Redux

核心理念

工作流

redux workflow

React-Redux

Redux 中间件

ActionStore之间,对dispatch的增强

redux middleware workflow

React Hooks

使用函数组件来代替类组件

const [count, setCount] = useState(0);

<button onClick={() => setCount(count + 1)}>Click me</button>

函数式编程

函数式编程是一种编程范式,常见的其他编程方式如命令式编程(面向过程),面向对象编程。

理念

函数式编程的好处