前端基础之React(一)

2023-12-11  本文已影响0人  若雨千寻

React

1.1 虚拟dom和真实dom

什么是虚拟dom?

虚拟 dom 相当于在 js 和真实 dom 中间加了一个缓存,利用 dom diff 算法避免了没有必要的 dom操作,从而 提高性能。

  1. 用 JavaScript 对象结构表示 DOM 树的结构
  2. 用这个树构建一个真正的 DOM 树,插到文档当中当状态变更的时候,重新构造一棵新的对象树。
  3. 用新的树和旧的树进行比较,记录两棵树差异把 2 所记录的差异应用到步骤 1 所构建的真正的DOM 树上,视图就更新了。

虚拟dom和real dom区别 性能差异

减少DOM的操作:虚拟dom可以将多次操作合并为一次操作,减少DOM操作的次数

Real DOM Virtual DOM
更新缓慢 更新更快
可以直接更新 HTML 无法直接更新 HTML
如果元素更新,则创建新DOM 如果元素更新,则更新 JSX
DOM操作代价很高 DOM 操作非常简单
消耗的内存较多 很少的内存消耗

1.2 react组件间通信

1.3 redux的原理

Redux:Redux 是当今最热门的前端开发库之一。它是 JavaScript 程序的可预测状态容器,用于整个应用的状态管理。使用 Redux 开发的应用易于测试,可以在不同环境中运行,并显示一致的行为

数据流

  1. 首先,用户(通过View)发出Action,发出方式就用到了dispatch方法

  2. 然后,Store自动调用Reducer,并且传入两个参数:当前State和收到的Action,Reducer会返回新的State

  3. State一旦有变化,Store就会调用监听函数,来更新View

Redux遵循的三个原则是什么

  1. 单一事实来源:整个应用的状态存储在单个 store 中的对象/状态树里。单一状态树可以更容易地跟踪随时间的变化,并调试或检查应用程序。

  2. 状态是只读的:改变状态的唯一方法是去触发一个动作。动作是描述变化的普通 JS 对象。就像state 是数据的最小表示一样,该操作是对数据更改的最小表示。

  3. 使用纯函数进行更改:为了指定状态树如何通过操作进行转换,你需要纯函数。纯函数是那些返回值仅取决于其参数值的函数。

单一事实来源怎么理解?

Redux 使用 “Store” 将程序的整个状态存储在同一个地方。因此所有组件的状态都存储在 Store 中,并且它们从 Store 本身接收更新。单一状态树可以更容易地跟踪随时间的变化,并调试或检查程序。

组件组成

  1. Action – 这是一个用来描述发生了什么事情的对象
  2. Reducer – 这是一个确定状态将如何变化的地方
  3. Store – 整个程序的状态/对象树保存在Store中
  4. View – 只显示 Store 提供的数据

如何在 Redux 中定义 Action?

React 中的 Action 必须具有 type 属性,该属性指示正在执行的 ACTION 的类型。必须将它们定义为字符串常量,并且还可以向其添加更多的属性。在 Redux 中,action 被名为 Action Creators 的函数所创建

解释 Reducer 的作用

Reducers 是纯函数,它规定应用程序的状态怎样因响应 ACTION 而改变。Reducers 通过接受先前的状态和 action 来工作,然后它返回一个新的状态。它根据操作的类型确定需要执行哪种更新,然后返回新的值。如果不需要完成任务,它会返回原来的状态。

Store Redux 中的意义是什么?

Store 是一个 JavaScript 对象,它可以保存程序的状态,并提供一些方法来访问状态、调度操作和注册侦听器。应用程序的整个状态/对象树保存在单一存储中。因此,Redux 非常简单且是可预测的。我们可以将中间件传递到 store 来处理数据,并记录改变存储状态的各种操作。所有操作都通过 reducer 返回一个新状态。

Redux 有哪些优点?

1.4 React组件生命周期的阶段是什么?

  1. 初始渲染阶段:这是组件即将开始其生命之旅并进入 DOM 的阶段。

  2. 更新阶段:一旦组件被添加到 DOM,它只有在 prop 或状态发生变化时才可能更新和重新渲染。这些只发生在这个阶段。

  3. 卸载阶段:这是组件生命周期的最后阶段,组件被销毁并从 DOM 中删除。

1.5 详细解释React 组件的生命周期方法

挂载阶段:

更新阶段:

卸载阶段:

扩展:

React 16之后有三个生命周期被废弃(但并未删除)

官方计划在17版本完全删除这三个函数,只保留UNSAVE_前缀的三个函数,目的是为了向下兼容,但是对于开发者而言应该尽量避免使用他们,而是使用新增的生命周期函数替代它们

1.6 router

  1. 什么是React 路由?

React 路由是一个构建在 React 之上的强大的路由库,它有助于向应用程序添加新的屏幕和流。这使 URL 与网页上显示的数据保持同步。它负责维护标准化的结构和行为,并用于开发单页 Web 应用。 React 路由有一个简单的API。

  1. 为什么需要 React 中的路由?

Router 用于定义多个路由,当用户定义特定的 URL 时,如果此 URL 与 Router 内定义的任何 “路

由” 的路径匹配,则用户将重定向到该特定路由。所以基本上我们需要在自己的应用中添加一个

Router 库,允许创建多个路由,每个路由都会向我们提供一个独特的视图

  1. 为什么React Router v4中使用 switch 关键字 ?

虽然 <div> 用于封装 Router 中的多个路由,当你想要仅显示要在多个定义的路线中呈现的单个路

线时,可以使用 “switch” 关键字。使用时, <switch> 标记会按顺序将已定义的 URL 与已定义的

路由进行匹配。找到第一个匹配项后,它将渲染指定的路径。从而绕过其它路线。

  1. 列出 React Router 的优点

    4.1 就像 React 基于组件一样,在 React Router v4 中,API 是 'All About Components'。可以将Router 可视化为单个根组件(),其中我们将特定的子路由()包起来。

    4.2 无需手动设置历史值:在 React Router v4 中,我们要做的就是将路由包装在 组件中。

    4.3 包是分开的:共有三个包,分别用于 Web、Native 和 Core。这使我们应用更加紧凑。基于类似的编码风格很容易进行切换。

1.7 React refs 有什么了解?

Refs 是 React 中引用的简写。它是一个有助于存储对特定的 React 元素或组件的引用的属性,它将由组件渲染配置函数返回。用于对 render() 返回的特定元素或组件的引用。当需要进行 DOM 测量或向组件添加方法时,它们会派上用场。

class ReferenceDemo extends React.Component{
    display() {
        const name = this.inputDemo.value;
        document.getElementById('disp').innerHTML = name;
    }
    render() {
        return(
            <div>
            Name: <input type="text" ref={input => this.inputDemo = input} />
            <button name="Click" onClick={this.display}>Click</button>
            <h2>Hello <span id="disp"></span> !!!</h2>
            </div>
        );
    }
}

1.8 列出一些应该使用 Refs 的情况

React并不是将click事件绑在该div的真实DOM上,而是在document处监听所有支持的事件,当事件发生并冒泡至document处时,React将事件内容封装并交由真正的处理函数运行。这样的方式不仅减少了内存消耗,还能在组件挂载销毁时统一订阅和移除事件。

另外冒泡到 document 上的事件也不是原生浏览器事件,而是 React 自己实现的合成事件(SyntheticEvent)。因此我们如果不想要事件冒泡的话,调用 event.stopPropagation 是无效的,而应该调用event.preventDefault

1.9 redux-saga和mobx的比较

  1. 状态管理
  1. 设计思想
  1. 主要特点
  1. 数据可变性
  1. 写法难易度
  1. 使用场景

1.10 简述一下 React 的源码实现

  1. React 的实现主要分为 Component 和 Element ;

  2. Component 属于 React 实例,在创建实例的过程中会在实例中注册 state 和 props 属性,还会依次调用内置的生命周期函数;

  3. Component 中有一个 render 函数, render 函数要求返回一个 Element 对象(或 null );

  4. Element 对象分为原生 Element 对象和组件式对象,原生 Element + 组件式对象会被一起解析成虚拟 DOM 树,并且内部使用的 state 和 props 也以 AST 的形式注入到这棵虚拟 DOM 树之中;

  5. 在渲染虚拟 DOM 树的前后,会触发 React Component 的一些生命周期钩子函数,比如componentWillMount 和 componentDidMount ,在虚拟 DOM 树解析完成后将被渲染成真实DOM 树;

  6. 调用 setState 时,会调用更新函数更新 Component 的 state ,并且触发内部的一个updater ,调用 render 生成新的虚拟 DOM 树,利用 diff 算法与旧的虚拟 DOM 树进行比对,比对以后利用最优的方案进行 DOM 节点的更新,这也是 React 单向数据流的原理(与 Vue 的MVVM 不同之处)。

上一篇下一篇

猜你喜欢

热点阅读