项目难点知识点汇总(2)

内容总结:

  • var/let/const区别
  • vuex分模块调用
  • filter/find/map/every/reduce讲解
  • promise
  • async/await

var/let/const

这应该是一个比较经典的问题了,不过还是想要搞清楚点

var和let的区别:

  • var声明变量可以重复声明,重复声明后之前变量值被覆盖;而 let 不可以重复声明,重复声明会报错。
  •  var声明的变量不受限于块级作用域,即 var 声明的变量是全局变量,不受当前(块级)作用域;let 声明的变量当前(块级)作用域限制,只在作用域内有效。
  • let不存在变量提升:var 声明变量的代码上面可以访问变量,而 let 不可以,在 let 声明的上面访问变量会报错,这就我们说的暂存死区。
  • var 会与 window 相映射(会挂一个属性),而let 不与 window 相映射。

const和let的异同:

  • const 和 let 一样不会与 window 相映射、支持块级作用域、在声明的上面访问变量会报错(不能变量提升)
  • const 声明之后必须赋值,否则会报错。而let可以只声明不赋值。
  • const 定义常量,不可以改变他的值(即改变他的内存地址)。let定义变量。这里注意: 假如我们使用const声明了一个对象或者数组这样的引用类型,直接修改掉整个对象的值是不可以的, 但是可以修改他们的属性值,这不会使内存地址发生改变。例如const obj = {name:’yft’} 如果我们使得obj = {},那么这样就会报错,但是如果我们obj = {name: ‘Alice’},那就没问题。

vuex分模块

在网上查了很多分模块相互调用的文章, 但是都讲的不是很清楚…所以打算自己来写。

首先来了解一下命名空间namespaced的作用: 命名空间,便于更快捷地访问内部模块。假如没有开启命名空间, 那么默认模块内部的actions/mutations等是注册在全局命名空间的, 但是如果不同的模块中有同名的属性,使用起来很可能会出错。总之,如果希望你的模块具有更高的封装度和复用性,请使用命名空间,将namespaced设置为true。

先说一下第一种情况的相互调用,即两个不同模块之间的调用。

图片

getters跨模块获取state

注意都要开启命名空间!!!

首先先看下文件结构:

图片
图片
图片

测试:

图片
图片

getters跨模块获取getters

图片

在模块B中获取:

图片

下面就不测试了吧,我都一个个试过啦。

actions跨模块获取getters

moduleA.js

图片

moduleB.js

图片
图片

actions跨模块获取actions

这个和上面那个也差不多

图片
图片

差不多就是这样, 一般就是getters, mutations, actions跨模块获取state的数据,actions调用另一个模块的actions和mutations的方法。接下来再讲讲actions方法中的参数。

actions的第一个参数为context, 第二个参数为payload(就是简单的传递参数),其中context包含{commit, dispatch, state, rootState},所以我们可以直接解构context :

actions: {    getName({dispatch}, payload) {      dispatch('模块名/方法', ' ', { root: true })    }  }

而dispatch又包含三个参数: {mutationName, data, {root: true}}, 第一个是异步提交的mutations名,第二个就是传进来的参数,第三个是配置选项,声明不是执行当前模块。

第二种情况比较简单, 就是同一模块内的相互调用

图片

getters调用同模块state

图片

getters调用同模块中的getters

图片

actions调用同模块mutations图片

调用actions的方法

图片

打印一下:

图片
图片

顺便写一下怎么在模块中打印vuex内的数据:

打印state{{ $store.state.m模块名.属性名 }}

打印getters: {{ $store.getters[‘模块名/属性名’] }}

在setup中调用mutations和actions:

import { useStore } from "vuex";setup(props, {emit}){    const store = useStore();    store.commit("模块名/方法名", "传递的参数");    store.dispatch("模块名/方法名", "传递的参数");}

find/filter/map/every/reduce

find(): 用于查找数组中符合条件的第一个元素,没有则返回undefined

array.find(callback, thisArg)

filter(): filter()方法创建一个新的数组,新数组中的元素是通过检查指定数组中符合条件的所有元素。注意: 不对空数组进行检测,,且不会改变原始数组。

array.filter(function(currentValue,index,arr), thisValue);

map()返回一个新数组,map()方法会按照原始数组元素顺序依次处理元素。

arr.map((item, index, array))// 接受三个参数,第一个参数是arr的当前一项的值,// 第二个参数当前索引值,// 第三个参数是本身数组对象。

every():用来检测数组所有元素是否满足指定条件。如果有一个不满足则返回false,剩下的不再检测。反之则返回true

array.every(callback[, thisObject]);

reduce():方法接收一个函数作为累加器,数组中的每个值(从左到右)开始缩减,最终计算为一个值。这个用的场景比较多

语法:

array.reduce(function(previousValue, currentValue, currentIndex, arr), initialValue)

其中total为初始值或者计算后的返回值(必须)在第一次调用时,若指定了初始值 initialValue,其值则为 initialValue,否则为数组索引为 0 的元素 array[0]。currentValue为当前元素(必须)、currentIndex为当前元素索引(可选)、arr为当前元素所属的对象(可选)、initialValue为传递给函数的初始值。

promise

promise这个东西吧,用的话还行,但是还是一知半解吧

一、为什么使用Promise?

我们知道 js 执行的时候,一次只能执行一个任务,它会阻塞其他任务。由于这个缺陷导致 js 的所有网络操作,浏览器事件,都必须是异步执行。异步执行可以使用回调函数执行。

promise是一个对异步操作进行封装并返回其结果的构造函数.

使用

promise的参数是一个函数函数里有两个参数这两个参数也是函数。resolve和reject这两个参数都是函数,名字随意。resolve是成功时的回调,reject是失败时的回调

  const a = new Promise((resolve, reject) => {    if(xxx) {      resolve('如果执行成功时返回的信息')    }    else {      reject('执行失败时返回的信息')    }  })

new Promise中的函数是同步函数promise共有三种状态,pending,fulfilled,rejected状态只能从pending变为fulfilled状态,成功状态。
或者从pending变为rejected状态,失败状态。promise只有这两种转变状态,是转变状态哈。再无其他状态。
而一旦转变状态确定,就不可更改。
例如:pending转变到fulfilled,状态就确定了,只能是fulfilled状态;如果想转成rejected状态,是不能转的。
Promise 实例化时,传入的回调会立即执行,而Promise 的 then 回调会被放到微任务队列中,等待执行。

接收结果

res函数和rej函数返回的数据,用then函数。来接收结果
then函数里的参数是两个异步回调函数,是异步的,第一次参数函数用于接收res返回来的数据,第二个参数函数用于接收rej返回的数据。

then的第一个参数函数里的形参用来接收res返回的数据。

const a = new Promise((resolve, reject) => {      if (xxx) {        resolve("成功时返回的信息");      } else {        reject("失败时返回的信息");      }    }).then(      (res) => {      //接收resolve返回来的结果, 即"成功时返回的信息"        console.log(res);      },      (err) => {      // 接收reject返回来的结果, 即"失败时返回的信息"        console.log(err);      }    );

Promise.catch

执行 reject 时,Promise 状态从 pending 变为 rejected,会执行 catch 方法,catch 方法接收的也是一个函数,函数中携带一个参数,该参数为 reject(err) 返回的数据。

    const a = new Promise((resolve, reject) => {      if (xxx) {        resolve("如果执行成功时返回的信息");      } else {        reject("执行失败时返回的信息");      }    })      .then((res) => {        console.log(res);      })      .catch((err) => {        console.log(err);      });

这时候就有一个疑问了, 在then中的err获取到的错误和catch有什么区别呢?

首先reject 是用来抛出异常的,catch 才是用来处理异常的。类比传统的 try catch 写法,reject 就相当于 throw。

其次:reject 是 Promise 的方法,而 catch 是 Promise 实例的方法

async / awaitasync 和 await 在干什么任意一个名称都是有意义的,先从字面意思来理解。async 是“异步”的简写,而 await 可以认为是 async wait 的简写。所以应该很好理解 async 用于申明一个 function 是异步的,而 await 用于等待一个异步方法执行完成。

async

async 是“异步”的简写, async 用于声明一个异步的 function。

async是一个加在异步函数前的修饰符,被async定义的函数会默认返回一个Promise对象resolve的值。因此对async函数可以直接then,返回值就是then方法传入的函数。async声明的函数的返回本质是一个Promise。

await

await 可以认为是 async wait 的简写,await 用于等待一个异步方法执行完成。

await 也是一个修饰符,只能放在async定义的函数内。可以理解为等待。

await 修饰的如果是Promise对象:可以获取Promise中返回的内容(resolve或reject的参数),

且取到值后语句才会往下执行;如果不是Promise对象:把这个非promise的东西当作await表达式的结果。

 const startRoll = () => {      return new Promise((resolve, reject) => {        console.log("这一行会自动立即执行");        let num = 100;        setTimeout(() => {          resolve((num += 100));        }, 2000);      });    };    // 用async来说明这个函数是特殊的    async function getNum() {      const result = await startRoll();      console.log(`点数为${result}`);          }    getNum();

在这个代码中还需要注意的是,getNum(n)得到的结果会返回给 const result = await startRoll();里面的result 。在const result = await startRoll();这行代码中,等号左边和等号右边是分离的。右边是1秒之前执行的,左边赋值1s之后执行的,等号两边不是在同一时间执行的,左边要等右边执行完再执行。所以getNum函数也是要等1s才执行的,所以getNum函数是异步的,所以function前面必须加一个async,表示它的特殊性,让引擎对它进行特殊处理,如果不标记,则报错。

声明:文中观点不代表本站立场。本文传送门:https://eyangzhen.com/235006.html

联系我们
联系我们
分享本页
返回顶部