电商购物商城

326 阅读13分钟

1、数组方法

① find与findIndex,查找数组中符合条件的元素,返回这个元素或index索引值。
② splice删除(a,b),以索引值为起点删除b个 //改变原数组

2.axios实际上是一个基于Promise的构造函数,axios的实例:通过axios的create方法创建

let instance = axios.create({
// 接口根路径
baseURL: baseURL,
// 请求超时时间
timeout: 20000, //
});

实例对象中有众多属性和方法,.

defaults

defaults 是一个对象,包含了该 axios 实例的默认配置。可以通过它来设置全局配置,包括基础 URL、请求头、超时设置等。这个属性会被所有通过该实例发出的请求所继承。

  • baseURL: 请求的基础 URL(如 'https://api.example.com')。
  • headers: 默认请求头,通常用于设置如 Authorization 等全局 HTTP 头部。
  • 其中defaults.headers还有默认属性common、post、get等,修饰此语句对请求头的限定范围,如common修饰所有,get只修饰get请求
  • timeout: 请求的超时时间,单位为毫秒。

2. interceptors

interceptors 是一个包含请求和响应拦截器的对象,可以对请求或响应进行预处理或后处理。

interceptors中的方法:
request: 用于在请求发送之前修改请求的配置或进行某些操作。
response: 用于在响应到达客户端之前修改响应数据,或者在发生错误时处理响应。

响应拦截器举例

// 添加请求拦截器
instance.interceptors.request.use(
  function (config) {
      do......
      // 在发送请求之前进行操作
      return config;
  },
  function (error) {
      do......
      // 对请求错误进行操作
      return Promise.reject(error);
  }
  
);

方括号表示法

let person = {
    name: 'Alice',
    age: 30 
    };
const a='age'
// 使用字符串作为键名 
console.log(person['name']);    //输出Alice
console.log(person[a])    //输出30

强制类型转换

 let a = '123'
 console.log(Number(a))     ///输出123

Vue获取当前路由url的相关参数

利用useRoute 是这一Vue Router 4 提供的 Composition API 函数,它返回当前的路由对象,包含路径、查询参数、路由参数等信息

const route = useRoute()
console.log(route)    //得到以下对象
{
  path: "/products",
  params: {}, //路由动态传参传入的参数
  query: {
    id: "123" //假设URL:http://example.com/products?id=123,则route.query,id=123,即URL 中查询字符串 ?key=value
  },
  hash: "#details",
  fullPath: "/products?search=shoes&id=123#details",
  name: null // 如果没有指定路由名称
}

js的解构

JavaScript 中的解构(destructuring)是一种方便的语法,它允许你从对象、数组中提取值,并将它们赋给变量

const person = {
  name: "John",
  age: 30,
  city: "New York"
};

// 解构赋值
const { name, age, city } = person;

console.log(name);  // John
console.log(age);   // 30
console.log(city);  // New York
//也可以部分结构
const { data } = person

也可以对变量名进行重新命名

const person = {
  name: "John",
  age: 30,
  city: "New York"
};

// 解构时重新命名
const { name: fullName, age: years, city: location } = person;

console.log(fullName);  // John
console.log(years);     // 30
console.log(location);  // New York

解构数组

const arr = [1, 2, 3];

// 解构数组
const [a, b, c] = arr;

console.log(a);  // 1
console.log(b);  // 2
console.log(c);  // 3

Promise浅析

建议看源码理解,因为实在太复杂了
promise实例在pending状态下,promise.then()仅仅是在宿主环境中保存下来,待到从pending转化为fulfilled状态,再把promise.then()的回调函数推入微任务队列

懒加载及实现方法

懒加载(Lazy Loading),也称为延迟加载,是一种将资源(如图片、组件等)推迟到需要的时候再加载的策略,可以显著提升大型应用的加载速度和性能。

实现方法

const routes = [
  {
    path: '/',
    name: 'Home',
    component: () => import(/* webpackChunkName: "home" */ './views/Home.vue')
  },

import()函数用于异步加载组件。当路由被访问时,才会加载对应的组件文件

template

<template>是一个包装元素,用于在Vue模板中包裹内容,但它本身不会在最终的DOM输出中渲染为实际的HTML标签。常用于条件渲染

v-if和v-else

标签内使用的 v-if 和 v-else 指令是通过它们在模板中的顺序来配对的,必须紧挨使用

v-if与v-show的区别

渲染方式

  1. v-if

    • v-if 是基于条件的“惰性渲染”。这意味着如果条件为假,则相关的组件或元素将不会被渲染到 DOM 中。
    • 当条件为真时,元素会被渲染到 DOM 中,并且如果条件变为假,DOM元素会被销毁,同时它的事件监听器和子组件也会被销毁。
  2. v-show

    • v-show 只是通过 CSS 的 display 属性来控制元素的显示和隐藏。
    • 无论条件为真还是为假,元素都会被渲染到 DOM 中,只是 display 属性会被设置为 none(隐藏)或恢复为原来的值(显示)。
    • 元素的事件监听器和子组件在条件切换时不会被销毁。

使用场景

  • v-if:适用于条件不经常改变的场景,或者在条件为假时需要减少不必要的渲染和内存占用的场景。
  • v-show:适用于需要频繁切换显示状态的场景,或者当元素的渲染开销较大且希望避免重复渲染时。
  • 对于<template>标签,只适用v-if,v-show不适用,因为<template> 本身不会在 DOM 树中渲染为实际的 HTML 元素,因而无法对其应用 v-show控制其css的display属性

CSS中常用的长度单位

1.px(绝对单位)
2.vw: 当前视口的宽度的百分比数,vh: 当前视口的高度的百分比数
3.em:当前D节点的字体大小为1em
4.rem:根DOM元素<html>的字体大小为1rem
5.% 占父级元素的百分比

正则表达式

作用:是一种模式匹配工具,对字符串进行查找

构成:(1)普通字符:能够描述其本身,例如所有的字母和数字
(2)元字符::在正则表达式中具有特殊意义的专用字符,可以用来规定其前导字符(即位于元字符前面的字符)在目标对象中的出现模式
- .:匹配除换行符以外的任意单个字符。

  • ^:匹配字符串的开始位置。
  • $:匹配字符串的结束位置。
  • *:匹配前面的字符零次或多次。
  • +:匹配前面的字符一次或多次。
  • ?:匹配前面的字符零次或一次,或者用于非捕获组匹配
  • {n}:匹配前面的字符恰好 n 次。
  • {n,}:匹配前面的字符至少 n 次。
  • {n,m}:匹配前面的字符至少 n 次,但不超过 m 次。
  • []:匹配括号内的任意一个字符(字符集合)。
  • |:表示逻辑“或”操作,匹配左右两边的表达式之
  • \转义字符。例如\w表示字母数字和下划线中的任意一个,\W表示\w的反义词(即补集),\d表示0-9中的任意一个,\D表示除了数字以外的任意一个字符,\s表示空格,\S表示除空格之外的任意字符,\b表示单词的边界。

vue3生命周期(组合式api)

setup:组件实例未被创建,所以无法调用this,用于设置响应式数据、方法等
onBeforeCreate:和setup功能重叠,也是初始化响应式数据和方法
onCreated:组件已经被实例化,方法,变量均可以被调用拿到,此时已经完成了组件的实例化,即模块被编译完成了,已经存在了render函数(render函数的生成在组件实例化后生成,即组件实例化过程完成了模块的编译和解析),有了render函数即已经生成了虚拟dom树,因为render函数返回值就是虚拟dom树

onBeforeMount:组件被挂载到指定的DOM元素之前。此时组有了虚拟DOM树,但Vue还尚未根据虚拟DOM树创建对应的真实DOM树,因此无法访问真实的DOM元素。
//注释:
①挂载:当虚拟DOM树被构建并准备好后,vue会根据虚拟DOM树构建真实DOM树,vue会将真实DOM树挂载到某个指定的DOM元素上,这个过程通常称为“挂载”(生成真实DOM树再挂载到指定的DOM元素上)
②渲染函数:Vue首先会将其组件模板(可以是HTML字符串或内联模板)编译成一个渲染函数。这个渲染函数是一个纯JavaScript函数,它接收组件的数据作为输入,并返回一个虚拟DOM树(即返回虚拟DOM)

onMounted:在组件挂载到某个指定的DOM元素之后调用,此时组件的真实DOM树已经生成,并将真实DOM树挂载到指定的DOM元素上,可以进行DOM操作,浏览器DOM树和渲染树的依次开始构建,。

onBeforeUpdate:在组件更新之前调用,此时组件模版中的数据已经发生变化,变化后的组件模板已经被重新编译成渲染函数(返回了新的虚拟DOM树,生成了新的虚拟DOM树之后立刻执行diff算法,找出新虚拟DOM树和旧虚拟DOM树的差异信息,把这些差异信息存储到一个patch(补丁)对象),但尚未解析patch对象以更新真实DOM树中。在这个阶段,可以访问到组件模版中的最新的组件数据,但真实DOM树还未更新。

onUpdated:在组件更新之后调用,此时patch对象已经解析为若干具体的DOM操作来更新真实DOM树,组件的数据已经重新渲染到真实DOM树上。在这个阶段,可以对更新后的DOM进行操作。

onBeforeUnmount:在组件卸载之前调用。此时组件仍然是活跃的,可以进行清理操作,如清除定时器、取消事件监听等。

unmounted:在组件卸载并移除DOM后调用。此时组件已经被销毁,无法再访问组件的属性和方法。在这个阶段,可以进行一些清理工作,如释放资源等。

vue的插槽

定义:Vue插槽(Slots)是Vue.js框架中的一种重要机制,它允许父组件向子组件传递内容,并在子组件中指定这些内容的显示位置

使用:以为父组件传递的多个内容可能在子组件的不同位置呈现,所以多用具名插槽

具名插槽
  1. 定义与用途

    • 具名插槽允许在子组件中使用多个插槽,并为每个插槽指定一个名称。
    • 这样,父组件就可以向不同的插槽传递不同的内容,从而实现更复杂的布局和内容组合。
  2. 使用方式

    • 在子组件中,使用<slot>标签定义插槽,并通过name属性指定插槽的名称。
    • 在父组件中,使用<template>标签和v-slot指令(或简写为#)来指定要插入到哪个具名插槽中的内容。
<!-- 子组件 -->
<template>
  <div>
    <header>
      <slot name="header"></slot>
    </header>
      <slot></slot> <!-- 默认插槽 -->
    <footer>
      <slot name="footer"></slot>
    </footer>
  </div>
</template>
 
<!-- 父组件 -->
<template>
  <child-component>
    <template v-slot:header>  //或写成#header
      <h1>这是头部内容</h1>
    </template>
    <p>这是默认插槽的内容</p>
    <template v-slot:footer> //或写成#footer 
      <p>这是底部内容</p>
    </template>
  </child-component>
</template>

watch和watchEffect

1.二者均是vue中响应式的监听数据的API
2. watch:通常需要传入两个参数,第一个参数是说明什么状态应该触发侦听器重新运行(可以是一个 getter 函数、响应式引用、响应式对象或数组等),第二个参数是定义侦听器回调函数的函数,该回调函数可以接受两个参数,分别指向状态变化前后的值。
watchEffect:只接受一个回调函数作为参数,该回调函数会在其依赖的响应式数据变化时重新执行。由于它不需要显式指定依赖项,因此使用起来更加简洁和直观。 3.wacth具有惰性,在页面刚加载时不会触发,只在数据变化时触发进行检测;watchEffect,不具有惰性,在页面加载后立即进行检测

关于css书写方向

margin: 0 auto; 上下、左右 margin:0 auto 0; 上、左右、下 margin:0 0 20px 20px;上、右、下、左

vue3的编译宏

编译宏是一种特殊的代码片段,由编译器在编译阶段预处理,进而转化为其它代码,所以在浏览器环境运行的最终代码不包括编译宏的原始调用。
好处是简化代码,减少重复,因为代码最终不包含宏的原始调用,所以减少运行时的开销

CSS transition过度的时间函数

  • ease:开始时速度较慢,然后加速,最后再减慢。
  • ease-in:开始时速度较慢,然后逐渐加速。
  • ease-out:开始时速度较快,然后逐渐减速。
  • ease-in-out:开始时速度较慢,中间加速,然后再减慢。
  • linear:线性平缓的过渡

Css的float属性

浮动(float):是元素脱离文件流,但不会完全脱离,它允许元素向左或向右移动,直到其外边缘碰到包含框或另一个浮动元素的边缘。不完全脱离即体现在他也会与边框内其他的浮动元素相互影响。

CSS的box-shadow属性

box-shadow: 0 15px 30px rgb(0 0 0 / 10%);

三个值分别为 阴影在x方向上的偏移量,阴影在y方向上的偏移量,阴影的模糊半径。越大阴影越柔和,越小越锐利

vue3 watch的底层实现

1.watch的入口函数
function watch( source, callback, options ) 
//source为监听的数据,callback回调函数是数据变化时的操作,option是一个可选的配置对象,如immediate、deepd等选项
    {
// 一系列处理逻辑
   }
2、处理数据源

watch 函数根据响应式数据源类型的不同(数据可能是ref类型的响应式数据。 reactive类型的响应式对象。 一个或多个响应式数据源组成的数组。 一个返回响应式数据的getter函数。),watch会将数据源转换为一个getter函数, 这个getter函数会在需要时读取数据源的值。

以数据源是一个getter函数或者响应式对象为例

function watch( source, callback, options ) 
    {
        let newValue
        let oldValue
        let useGetter
        if( typeof source ==='function'){
        useGetter == source
   }
         if( typeof source ==='Object'){
        useGetter == ()=> source
   }
3.收集数据源中数据的依赖、执行回调函数

把回调函数callback 包装在一个effect副作用函数中。这个副作用函数会被添加到响应式系统的依赖收集器中。

实际上watch就是把effect重新封装,加入了更丰富的操作
effect 函数的主要作用是创建一个副作用(即通过观察数据变化执行某些逻辑)。在 effect 中,Vue 会自动收集你在副作用函数中访问的响应式数据,并跟踪这些数据之间的依赖关系。当这些数据发生变化时,effect 会自动重新执行。

function watch( source, callback, options ) 
    {
        let newValue
        let oldValue
        let useGetter
        if( typeof source ==='function'){
        useGetter == source
   }
         if( typeof source ==='Object'){
        useGetter == ()=> traverse(source) //traverse是一个递归函数,用于递归遍历对象的所有属性
   }
       effect(() =>{
           oldValue = newValue
           newValue = useGetter()
       })
4. 配置选项(options)处理细节

deep选项

如前面所述,当deeptrue时,对于reactive对象,会深度递归遍历其属性来建立响应式监听。用traverse遍历对象所有属性来实现该效果

immediate选项

如果immediatetrue,在watch创建初始化时就会立即执行一次callback函数。在源码里,会有专门的逻辑判断来识别这个配置,当检测到immediatetrue时,会主动调用callback,并按照规则传递初始值作为新值