js高阶-响应式原理

server/2025/1/24 2:50:14/

在JavaScript中,响应式原理通常是指一种编程模式,它允许开发者创建能够自动响应数据变化的系统或应用。这种模式在现代前端框架(如Vue.js、React等)中非常常见,尤其是在数据绑定和UI更新方面。以下是响应式原理的核心概念和实现方式的详细解释:
----
1. 响应式原理的核心概念
响应式编程的核心是数据驱动和自动更新。当数据发生变化时,相关的UI或逻辑会自动更新,而无需手动触发更新操作。这种模式可以大大提高开发效率,减少错误,并使代码更加简洁和可维护。
关键特性:
•  数据绑定:将数据与UI绑定,当数据变化时,UI自动更新。
•  依赖追踪:自动追踪数据的依赖关系,以便在数据变化时能够高效地更新相关部分。
•  懒更新:只有在数据真正被使用时,才会触发更新操作,避免不必要的性能开销。
----
2. Vue.js中的响应式原理
Vue.js是响应式编程的典型代表,它通过数据劫持和依赖追踪实现了响应式系统。
2.1 数据劫持(Object.defineProperty)
Vue.js通过Object.defineProperty方法劫持对象的属性,监听数据的get和set操作。当数据被访问或修改时,Vue可以自动触发更新。
const data = { count: 0 };

Object.defineProperty(data, "count", {
  get() {
    console.log("Getter: count is accessed");
    return data.count;
  },
  set(newVal) {
    console.log(`Setter: count is updated to ${newVal}`);
    data.count = newVal;
  }
});

console.log(data.count); // Getter: count is accessed
data.count = 5; // Setter: count is updated to 5

2.2 依赖追踪
Vue通过Watcher和Dep(依赖)机制来追踪依赖关系。当数据被访问时,Vue会将当前的Watcher添加到依赖列表中;当数据被修改时,Vue会通知所有依赖该数据的Watcher进行更新。
2.3 响应式系统的实现
class Dep {
  constructor() {
    this.subscribers = new Set();
  }

  depend() {
    if (activeWatcher) {
      this.subscribers.add(activeWatcher);
    }
  }

  notify() {
    this.subscribers.forEach((watcher) => watcher.update());
  }
}

class Watcher {
  constructor(source, callback) {
    this.source = source;
    this.callback = callback;
    this.value = this.get();
  }

  get() {
    activeWatcher = this;
    const value = this.source();
    activeWatcher = null;
    return value;
  }

  update() {
    const newValue = this.source();
    if (newValue !== this.value) {
      this.value = newValue;
      this.callback(newValue);
    }
  }
}

const dep = new Dep();

function reactiveGetter() {
  dep.depend();
  return 5;
}

dep.notify = () => {
  console.log("Data changed, updating...");
  dep.subscribers.forEach((watcher) => watcher.update());
};

const watcher = new Watcher(reactiveGetter, (newValue) => {
  console.log(`New value: ${newValue}`);
});

// Simulate data change
dep.notify();

----
3. React中的响应式原理
React的响应式原理与Vue有所不同,它主要通过状态管理和组件重新渲染来实现。
3.1 状态管理(useState)
React通过useState钩子管理状态,当状态发生变化时,React会重新渲染组件。
import React, { useState } from "react";

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

  return (
    <div>
      <p>{count}</p>
      <button onClick={() => setCount(count + 1)}>Increment</button>
    </div>
  );
}

3.2 虚拟DOM与高效更新
React通过虚拟DOM(Virtual DOM)来优化性能。当状态变化时,React会比较新旧虚拟DOM的差异,并只更新必要的部分,而不是重新渲染整个组件。
----
4. 手动实现一个简单的响应式系统
以下是一个简单的响应式系统的实现示例:
class Dep {
  constructor() {
    this.subscribers = new Set();
  }

  depend() {
    if (activeWatcher) {
      this.subscribers.add(activeWatcher);
    }
  }

  notify() {
    this.subscribers.forEach((watcher) => watcher.update());
  }
}

class Watcher {
  constructor(source, callback) {
    this.source = source;
    this.callback = callback;
    this.value = this.get();
  }

  get() {
    activeWatcher = this;
    const value = this.source();
    activeWatcher = null;
    return value;
  }

  update() {
    const newValue = this.source();
    if (newValue !== this.value) {
      this.value = newValue;
      this.callback(newValue);
    }
  }
}

const dep = new Dep();

function reactiveGetter() {
  dep.depend();
  return 5;
}

dep.notify = () => {
  console.log("Data changed, updating...");
  dep.subscribers.forEach((watcher) => watcher.update());
};

let activeWatcher = null;

const watcher = new Watcher(reactiveGetter, (newValue) => {
  console.log(`New value: ${newValue}`);
});

// Simulate data change
dep.notify();

----
5. 总结
•  Vue.js通过数据劫持和依赖追踪实现响应式系统,适合复杂的数据绑定和高效更新。
•  React通过状态管理和虚拟DOM实现响应式更新,适合组件化开发和性能优化。
•  响应式原理的核心是数据驱动和自动更新,通过合理的设计可以大大提高开发效率和用户体验。
希望这些内容对你理解JavaScript中的响应式原理有所帮助!


http://www.ppmy.cn/server/160913.html

相关文章

leetcode刷题记录(七十二)——146. LRU 缓存

&#xff08;一&#xff09;问题描述 146. LRU 缓存 - 力扣&#xff08;LeetCode&#xff09;146. LRU 缓存 - 请你设计并实现一个满足 LRU (最近最少使用) 缓存 [https://baike.baidu.com/item/LRU] 约束的数据结构。实现 LRUCache 类&#xff1a; * LRUCache(int capacity)…

style标签没有写lang=“scss“引发的 bug 和反思

遇到了一个问题&#xff0c;有一个css样式问题&#xff0c;在 chrome 浏览器上和 16.0 版本以上的 safari 浏览器完全没有问题&#xff0c;但是在 15.3 版本的safari浏览器上就完全乱套了。 一查发现是我的某个 vue 文件中的style标签忘记写 lang"scss" 了&#xf…

以太坊深入解析:概念与原理全面剖析

引言 以太坊&#xff08;Ethereum&#xff09;作为区块链技术的代表性项目之一&#xff0c;自2015年发布以来&#xff0c;迅速成为全球区块链行业的核心基础设施。相比比特币&#xff0c;以太坊不仅支持点对点的价值转移&#xff0c;还引入了智能合约&#xff0c;使其能够承载…

FPGA 开发工作需求明确:关键要点与实践方法

FPGA开发工作需求明确&#xff1a;关键要点与实践方法 一、需求明确的重要性 在FPGA开发领域&#xff0c;明确的需求是项目成功的基石。FPGA开发往往涉及复杂的硬件逻辑设计、高速信号处理以及与其他系统的协同工作。若需求不明确&#xff0c;可能导致开发过程中频繁变更设计…

利用R计算一般配合力(GCA)和特殊配合力(SCA)

前记 一般配合力(General Combining Ability, GCA)和特殊配合力(Specific Combining Ability, SCA)是杂交育种中用于评估亲本组合潜力的重要概念,具体定义和区别如下: 一般配合力(GCA) 定义:GCA是指一个自交系与其他多个自交系杂交时,其杂交后代在某一性状(如产量)…

【GitHub】登录时的2FA验证

一、如何进行2FA认证 1.在你的浏览器中下载 Authenticator身份验证插件 2.使用身份验证器添加凭证 2.1 使用身份验证器扫描验证二维码 选择扫描二维码

实践深度学习:构建一个简单的图像分类器

引言 深度学习在图像识别领域取得了巨大的成功。本文将指导你如何使用深度学习框架来构建一个简单的图像分类器&#xff0c;我们将以Python和TensorFlow为例&#xff0c;展示从数据准备到模型训练的完整流程。 环境准备 在开始之前&#xff0c;请确保你的环境中安装了以下工…

【Unity3D实现雨下在窗户上的效果】

系列文章目录 unity工具 文章目录 系列文章目录👉前言👉一、效果展示👉二、原理👉三、使用步骤3-1、shader代码纹理映射数学运算和函数的运用特效算法的实现高效的性能优化👉壁纸分享👉总结👉前言 想要好看的效果肯定是要用shader实现啦,为什么呢? 因为Shade…