小知识点总结

目录

ajax与axios

前台项目整合axios的方法

生成主键的方法

uuid

雪花算法

vue中的ref和reactive的区别


 

ajax与axios

 

AJAX(Asynchronous JavaScript and XML)是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术。它使用JavaScript在后台与服务器进行数据交换,使得网页可以动态地从服务器获取数据并局部刷新页面,为用户提供更流畅、更快的交互体验。

AJAX的工作原理主要涉及以下几个步骤:
1. **创建XMLHttpRequest对象**:这是实现AJAX的核心,用于发送HTTP请求和接收响应。
2. **发送HTTP请求**:通过XMLHttpRequest对象向服务器发送请求,可以是GET或POST等方法。
3. **处理服务器响应**:当服务器处理完请求后,会返回数据,通常为JSON、XML或其他格式的数据。
4. **更新DOM**:根据从服务器返回的数据,使用JavaScript更新页面的部分内容,而不需要重新加载整个页面。

AJAX技术使得Web应用程序能够实现类似于桌面应用的用户体验,比如实时聊天、自动补全搜索建议、动态加载评论等场景。不过,需要注意的是,AJAX虽然增强了网页的交互性,但同时也带来了诸如SEO(搜索引擎优化)和无障碍访问等问题,因为这些操作发生在客户端,可能不会被搜索引擎爬虫完全抓取到。

Axios 是一个基于 Promise 的 HTTP 客户端,用于浏览器和 Node.js 环境中执行异步 HTTP 请求。以下是一些关于 Axios 的关键点:

1. **Promise 基础**:Axios 使用 Promise 模式,这使得处理异步操作更加简洁和优雅,相比于传统的回调函数,可以避免回调地狱(callback hell)问题,并提供更好的错误处理机制。

2. **浏览器和 Node.js 兼容**:Axios 是 isomorphic(同构)的,意味着你可以在浏览器和 Node.js 环境中使用相同的代码进行 HTTP 请求。在浏览器中,它使用 XMLHttpRequest,而在 Node.js 中,它使用原生的 http 模块。

3. **丰富的功能**:Axios 支持所有标准的 HTTP 方法(GET, POST, PUT, DELETE 等),并且能够自动转换 JSON 数据,拦截请求和响应,以及取消请求等功能。

4. **请求和响应拦截器**:你可以注册拦截器来修改请求配置或响应数据,这对于添加统一的错误处理、身份验证令牌或日志记录非常有用。

5. **链式调用**:Axios 支持链式调用,使得多个请求的组合和嵌套变得容易实现。

6. **取消请求**:Axios 提供了取消请求的能力,这对于需要根据某些条件中断请求的场景非常有用。

7. **XSRF 保护**:在客户端,Axios 提供了防止跨站请求伪造(CSRF/XSRF)攻击的功能。

8. **轻量级**:Axios 相较于一些包含更多功能的库而言较为轻量,适合现代 Web 开发中对速度和性能有较高要求的项目。

由于其易用性和功能丰富,Axios 成为了许多前端框架如 Vue.js 和 React.js 的首选 HTTP 客户端库。在使用前,你需要通过 pnpm 或 yarn 在项目中安装 Axios。

前台项目整合axios的方法

 

在 Vue 3 环境中整合 Axios ,考虑到 Vue 3 引入了 Composition API 和其它一些新特性,下面是如何在 Vue 3 的项目中使用 Axios 的详细步骤:

### 1. 安装 Axios

使用 pnpm 或 npm 或 yarn 安装 Axios:

```bash
pnpm install axios
# 或者

pnpm install axios


yarn add axios
```

### 2. 在 `main.js` 或 `main.ts` 中配置 Axios

你可以在项目的入口文件中配置 Axios 的默认设置,这样在组件中使用时就不用每次都指定相同的配置。例如:

import { createApp } from 'vue';
import App from './App.vue';
import axios from 'axios';

axios.defaults.baseURL = 'https://api.example.com';
axios.defaults.headers.common['Authorization'] = `Bearer ${localStorage.getItem('token')}`;

const app = createApp(App);
app.config.globalProperties.$axios = axios; // 将 axios 注册为全局属性
app.mount('#app');

### 3. 在 Vue 组件中使用 Axios

现在你可以在 Vue 组件中直接使用 `$axios` 来发起请求:

<template>
  <div>
    <!-- 组件模板 -->
  </div>
</template>

<script setup>
import { ref, onMounted } from 'vue';

const data = ref(null);

onMounted(async () => {
  try {
    const response = await $axios.get('/users');
    data.value = response.data;
  } catch (error) {
    console.error('Error fetching data:', error);
  }
});
</script>

### 4. 使用 Composition API 进行模块化

在 Vue 3 中,你可以使用 Composition API 来封装 Axios 请求,创建可复用的组合函数:

import axios from 'axios';

export const useApi = () => {
  const fetchUsers = async () => {
    try {
      const response = await axios.get('/users');
      return response.data;
    } catch (error) {
      throw new Error('Failed to fetch users');
    }
  };

  return { fetchUsers };
};

然后在组件中导入并使用这个组合函数:

<template>
  <div>
    <!-- 组件模板 -->
  </div>
</template>

<script setup>
import { onMounted, ref } from 'vue';
import { useApi } from './useApi';

const { fetchUsers } = useApi();
const data = ref([]);

onMounted(async () => {
  try {
    data.value = await fetchUsers();
  } catch (error) {
    console.error('Error fetching data:', error);
  }
});
</script>

### 5. 使用 Axios 实例

如果你需要更复杂的配置,可以创建一个 Axios 实例并在组件中使用:

import axios from 'axios';

const apiClient = axios.create({
  baseURL: 'https://api.example.com',
  timeout: 10000,
});

export default apiClient;

然后在组件中导入并使用这个实例:

<template>
  <div>
    <!-- 组件模板 -->
  </div>
</template>

<script setup>
import apiClient from './apiClient';

const data = ref(null);

onMounted(async () => {
  try {
    const response = await apiClient.get('/users');
    data.value = response.data;
  } catch (error) {
    console.error('Error fetching data:', error);
  }
});
</script>

通过上述步骤,你就可以在 Vue 3 的项目中有效地使用 Axios 来处理 HTTP 请求了。

生成主键的方法

 

  1. 自增ID(Auto-Increment)

    • 大多数关系型数据库都支持自增字段。当插入新记录时不显式指定该字段的值,数据库会自动为其分配下一个可用的整数值。例如,在MySQL中,你可以使用AUTO_INCREMENT关键字定义这样的字段。
  2. UUID(Universally Unique Identifier)

    • UUID 是一种确保全局唯一性的标识符,通常由32个十六进制数字组成,包含连字符。后端可以通过内置函数或第三方库生成UUID,如Python中的uuid库。
  3. 序列(Sequence)

    • 在某些数据库如PostgreSQL中,可以使用序列(Sequence)来生成连续的唯一整数。序列通常与触发器结合使用,当插入新行时触发器会从序列中获取下一个值作为主键。
  4. GUID(Globally Unique Identifier)

    • GUID 类似于UUID,但在某些上下文中可能有所区别,特别是在.NET框架中。GUID保证了跨系统和跨网络的唯一性。
  5. 基于时间戳的ID

    • 有些系统利用时间戳作为主键的一部分,结合随机数或机器ID来生成唯一ID。例如,Twitter的Snowflake算法就是基于这种思想。
  6. Hash ID

    • 可以使用哈希函数将其他字段的值转换成唯一的字符串或整数,但这种方法可能会遇到哈希冲突的问题。
  7. 组合主键

    • 使用多个字段组合成复合主键,这在不需要单一字段就能唯一标识记录的情况下使用,但这种方式不适用于所有场景,因为可能不便于索引和性能优化。
  8. 分布式ID生成器

    • 在分布式系统中,可能需要专门的服务来生成全局唯一的ID,如使用Zookeeper或Etcd等配置中心来协调ID生成。
  9. 美团的 Leaf算法

                1.Leaf 是美团点评(Meituan-Dianping)推出的一个分布式ID生成服务,旨在为大规模分布式系统提供高性能、高可用的唯一ID生成解决方案。Leaf的设计目标是在满足全局唯一性的前提下,提高ID生成效率,减少对数据库的依赖,降低系统延迟。 

    10.百度的 UidGenerator 算法

                1.UidGenerator 是百度(Baidu)开源的一个基于Java实现的分布式唯一ID生成器,其核心思想也是基于雪花算法,但在原有基础上进行了若干优化和改进。 

uuid

**UUID (Universally Unique Identifier)**,即通用唯一识别码,是一种用于在分布式网络环境中唯一标识信息的标准。UUID是由一组128位数字组成的数字标识符,常被用于生成全局唯一的标识符,尤其是在那些需要跨平台、跨应用、跨网络的系统中。

UUID的格式通常表示为32个十六进制数字,由连字符分隔成5组,形式如下:
```
8F9B11D3-4C9C-4F68-A3A2-EB1E6CDDA2AD
```
其中,连字符的位置通常是固定的,分别在第8、12、16和20个字符之后。

UUID的版本有多种,每种版本使用不同的算法来生成唯一标识符,主要有以下几种版本:

1. **Version 1 (Time-based UUIDs)**
   - 这种版本的UUID包含时间戳和MAC地址,理论上能够保证全球范围内的唯一性。
   - 时间戳部分是自UTC 1582年10月15日以来的100纳秒间隔计数。
   - MAC地址部分用来区分不同的物理设备。

2. **Version 3 and Version 5 (Name-based UUIDs)**
   - 这两个版本的UUID是基于名字空间和名字生成的,使用SHA-1或MD5哈希函数。
   - 名字空间本身也是一个UUID,用于区分不同的命名空间。
   - 生成的UUID是通过哈希函数的结果来确定的,因此对于给定的名字和名字空间,生成的UUID是相同的。

3. **Version 4 (Randomly-generated UUIDs)**
   - 这种版本的UUID是完全随机生成的,通常用于不需要时间戳或硬件地址信息的场景。
   - 虽然理论上可能存在冲突,但由于UUID的长度和随机性,实际冲突的概率极低。

4. **Version 2 (DCE Security UUIDs)**
   - 这个版本与V1相似,但包含了更多关于用户的细节,比如用户ID和组ID,主要用于安全相关的应用。

UUID在各种领域都有广泛的应用,包括但不限于数据库记录的唯一标识、文件系统元数据、网络通信协议中的唯一会话标识、软件开发中的组件标识等。由于其唯一性和全局可识别性,UUID成为跨系统数据交换和管理的重要工具。

 

 

雪花算法

 

雪花算法(Snowflake Algorithm)是由Twitter开发的一种分布式ID生成算法,它能够生成全局唯一且有序递增的64位整数ID。这个算法的设计目的是为了在分布式系统中快速生成不重复的ID,并且这些ID在大多数情况下是递增的,这有助于优化数据库的写入性能。

雪花算法生成的64位ID的结构如下:

- 最高位(第64位)是符号位,始终为0,表示正数。
- 接下来的10位(第54到45位)用来表示工作机器ID,其中包含5位数据中心ID和5位工作节点ID,这样最多可以部署1024个节点。
- 接下来12位(第44到33位)是序列号,用来解决同一毫秒内同一机器生成多个ID的情况。
- 剩下的41位(第32到1位)是时间戳部分,以毫秒为单位,减去一个固定的起始时间(通常是某个历史时间点),这样可以确保ID的时间部分始终递增。

雪花算法的生成过程可以简单概括为:
1. 获取当前毫秒级时间戳,并减去起始时间戳。
2. 将得到的时间戳左移42位。
3. 将数据中心ID左移17位。
4. 将工作节点ID左移12位。
5. 将序列号与上述结果进行按位或运算,得到最终的64位ID。

在实际应用中,为了避免同一毫秒内生成的ID相同,可以使用原子操作增加序列号,如果序列号溢出,则等待下一个毫秒再生成新的ID。

雪花算法的优点包括:
- 全局唯一性。
- 时间有序性,方便排序。
- 可以离线生成,不需要依赖于数据库或其他服务。
- 可以在多台机器上并行生成,适用于分布式环境。

缺点主要是:
- 需要维护数据中心ID和工作节点ID,避免ID冲突。
- 如果没有合理规划,可能会出现时间戳回拨导致的ID生成问题。

由于雪花算法的高效和可靠性,它在很多大型互联网公司和分布式系统中得到了广泛的应用。当然,除了雪花算法,还有许多类似的分布式ID生成方案,比如美团的Leaf、百度的UidGenerator等,它们各有特点,可以根据具体需求进行选择。

vue中的ref和reactive的区别

 

在Vue 3中,`ref` 和 `reactive` 都是用来创建响应式数据的方法,但它们之间有一些关键的区别:

### ref
`ref` 是一个函数,它接受一个值作为参数,并返回一个包装后的引用对象。这个引用对象具有一个 `.value` 属性,通过这个属性可以访问和修改原始值。当 `ref` 包装的值发生变化时,任何依赖于这个值的组件都会重新渲染。#### 使用示例:
 

import { ref } from 'vue';

const count = ref(0); // 创建一个响应式的引用,初始值为0

// 访问和修改count的值
console.log(count.value); // 输出:0
count.value++; // 修改值

### reactive
`reactive` 是一个函数,它接受一个普通的对象或数组作为参数,并返回一个新的响应式代理对象。这个代理对象可以像普通对象一样直接操作,不需要通过 `.value` 属性。#### 使用示例:

import { reactive } from 'vue';

const state = reactive({ count: 0 }); // 创建一个响应式的对象

// 直接访问和修改state对象的属性
console.log(state.count); // 输出:0
state.count++; // 修改值

### 主要区别
1. **类型和使用方式**:
   - `ref` 主要用于基本数据类型(如字符串、数字、布尔值),以及单个值的包装。如果需要使用模板语法(如 `{{ count }}` 或 `<div v-if="show"></div>`)中的表达式,`ref` 可以直接在模板中使用。
   - `reactive` 则用于复杂的数据结构,如对象和数组。在模板语法中,你可以直接使用 `reactive` 对象的属性而无需额外的 `.value`。

2. **内部实现**:
   - `ref` 实际上是创建了一个引用类型,其值通过 `.value` 访问,这使得它可以很好地处理在计算属性和条件渲染中可能遇到的类型不一致问题。
   - `reactive` 提供了对整个对象的响应式代理,这使得它在处理复杂的对象结构时更加直观和方便。

3. **性能考量**:
   - 在某些情况下,`ref` 的 `.value` 访问可能会导致额外的性能开销,尤其是当它在循环中大量使用时。相比之下,`reactive` 对象的直接访问可能更高效。

选择使用 `ref` 还是 `reactive` 取决于你的具体需求。如果你只需要跟踪单个值的变化,或者需要在模板语法中使用,那么 `ref` 更加合适。如果你正在处理复杂的对象结构,那么 `reactive` 将是一个更好的选择。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值