目录
uuid生成随机id
npm install uuid 下载
生成随机且唯一的游客身份
- import { v4 as uuidv4 } from 'uuid';//创建一个uuid
- //生成一个随机的字符串作为用户身份 且每次不会变
- export const getUUID=()=>{
- //先从本地存储获取uuid
- let uuid_token=localStorage.getItem('UUIDTOKEN')
- // 如果没有生成游客临时身份
- if(!uuid_token){
- uuid_token=uuidv4()
- localStorage.setItem('UUIDTOKEN',uuid_token)
- }
- return uuid_token
- }
vue中调用保存uuid
- // Detail 组件的小仓库
- //封装游客模块uuid--生成一个随机字符串
- import{getUUID} from '../../utils/uuid_token'
- import axios from '@/api'
- const state = {
- goodInfo: {},
- //游客临时身份
- uuid_token:getUUID()
- }
- const mutations = {
- getGoodInfo(state, payload) {
- state.goodInfo = payload
- }
- }
- const actions = {
- //获取产品信息
- async AsyncgetGoodInfo({
- commit
- }, skuId) {
- let {
- code,
- data
- } = await axios.reqDetailInfo(skuId)
- if (code != 200) return
- commit('getGoodInfo', data)
- },
- async AsyncAddOrUpdataShopCart({
- commit
- }, {
- skuId,
- skuNum
- }) {
- let result = await axios.reqAddOrUpdataShopCart(skuId, skuNum)
- //代表服务器加入购物车成功
- if (result.code == 200) {
- return 'ok'
- } else {
- return Promise.reject(new Error('false'))
- }
-
- }
- }
-
- const getters = {
- categoryView(state) {
- return state.goodInfo.categoryView || {}
- },
- skuInfo(state) {
- return state.goodInfo.skuInfo || {}
- },
- spuSaleAttrList(state) {
- return state.goodInfo.spuSaleAttrList || []
- }
- }
- export default {
- state,
- mutations,
- actions,
- getters
- }
设置请求头携带uuid
- // 对axios二次封装
- import axios from 'axios'
-
- //引入进度条 start进度条开始 done:进度条结束
- import nprogress from 'nprogress'
- import 'nprogress/nprogress.css'
-
-
- // 利用axios对象方法的created,创建一个axios实例
- const requests = axios.create({
- //配置对象
- // 基础路径,发送请求的时候路径中会出现api
- baseURL: '/api',
- //请求超时时间 5s
- timeout: '5000',
- })
- //请求拦截器
- requests.interceptors.request.use((config) => {
- // config配置对象 header请求头
- //进度条开始
- nprogress.start()
- return config
- })
- //响应拦截器
- requests.interceptors.response.use((res) => {
- //成功的回调函数
- //进度条结束
- nprogress.done()
- return res.data
- }, (error) => {
- //响应失败的回调函数
- return Promise.reject(new Error('false'))
- })
- export default requests
1.every()方法,针对数组中的每一个元素进行比对,只要有一个元素比对结果为false则返回false,反之要所有的元素比对结果为true才为true
- var a = [1,2,3,4,5,6];
- var b = a.every(function(x){
- return x < 8;
- });
- var c = a.every(function(x){
- return x < 5;
- })
- console.log(b); //这里返回true
- console.log(c); //这里返回false
2.some()方法,同样是针对数组中的每一个元素,但是这个方法是,只要有一个元素比对结果为true,返回结果就为true,反之要所有的元素比对结果为false才为false
- var a = [1,2,3,4,5,6]
- var b = a.some(function(x){
- return x > 10;
- })
- var c = a.some(function(x){
- return x > 5;
- })
- console.log(b) //这里返回false
- console.log(c) //这里返回true
witch 语句用于基于不同的条件来执行不同的动作。
JavaScript Switch 语句 请使用 switch 语句来选择要执行的多个代码块之一。
工作原理:首先设置表达式 n(通常是一个变量)。随后表达式的值会与结构中的每个 case 的值做比较。如果存在匹配,则与该 case 关联的代码块会被执行。请使用 break 来阻止代码自动地向下一个 case 运行。
default 关键词
请使用 default 关键词来规定匹配不存在时做的事情:
- switch (day)
- {
- case 6:
- x="Today it's Saturday";
- break;
- case 0:
- x="Today it's Sunday";
- break;
- default:
- x="Looking forward to the Weekend";
-
- }
项目应用
- async handle(type, num, cart) {
- //标记 数量(变化量,和输入的值, 商品数组)
- switch (type) {
- // 加号
- case 'add':
- num = 1
- break
- // 减号
- case 'minus':
- //判断用户的个数大于1给服务器传-1小于等会于1给服务器0
- num = cart.skuNum > 1 ? -1 : 0;
- break
- case 'change':
- // 如果用户输入非法值给服务器0
- if (isNaN(num) || num < 1) {
- num = 0
- } else {
- // 正确情况小数取整 带给服务器的变化量 用户输入进来的值-产品起始个数
- num = parseInt((num) - cart.skuNum)
- }
- break
- }
- try {
- await this.$store.dispatch('AsyncAddOrUpdataShopCart', {
- skuId: cart.skuId,
- skuNum: num
- })
- this.getData()
- } catch (err) {}
- }
HTTP是超文本传输协议,其定义了客户端和服务器端之间文本传输的规范。HTTP默认使用80端口,这个端口指的是服务器端的端口,而客户端的端口是动态分配的。HTTP请求的方法:
HTTP/1.1协议中共定义了八种方法(有时也叫“动作”),来表明Request-URL指定的资源不同的操作方式
HTTP1.0定义了三种请求方法: GET, POST 和 HEAD方法。
HTTP1.1新增了五种请求方法:OPTIONS, PUT, DELETE, TRACE 和 CONNECT 方法
1、OPTIONS
返回服务器针对特定资源所支持的HTTP请求方法,也可以利用向web服务器发送‘*’的请求来测试服务器的功能性
2、HEAD
向服务器索与GET请求相一致的响应,只不过响应体将不会被返回。这一方法可以再不必传输整个响应内容的情况下,就可以获取包含在响应小消息头中的元信息。
3、GET
向特定的资源发出请求。注意:GET方法不应当被用于产生“副作用”的操作中,例如在Web Application中,其中一个原因是GET可能会被网络蜘蛛等随意访问。Loadrunner中对应get请求函数:web_link和web_url
4、POST
向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的建立和/或已有资源的修改。 Loadrunner中对应POST请求函数:web_submit_data,web_submit_form
5、PUT
向指定资源位置上传其最新内容
6、DELETE
请求服务器删除Request-URL所标识的资源
7、TRACE
回显服务器收到的请求,主要用于测试或诊断
8、CONNECT
HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。
Promise的all方法提供了并行执行异步操作的能力,并且在所有异步操作执行完后才执行回调。可以将多个 Promise 实例,包装成一个新的 Promise 实例。
const p = Promise.all([p1, p2, p3]);
上面代码中,Promise.all方法接受一个数组作为参数,p1、p2、p3都是 Promise 实例,如果不是,就会先调用下面讲到的Promise.resolve方法,将参数转为 Promise 实例,再进一步处理。(Promise.all方法的参数可以不是数组,但必须具有 Iterator 接口,且返回的每个成员都是 Promise 实例。)
p的状态由p1、p2、p3决定,分成两种情况。
只有p1、p2、p3的状态都变成fulfilled,p的状态才会变成fulfilled,此时p1、p2、p3的返回值组成一个数组,传递给p的回调函数。
只要p1、p2、p3之中有一个被rejected,p的状态就变成rejected,此时第一个被reject的实例的返回值,会传递给p的回调函数。
项目实战
- async deleteCartList({commit},skuId){
- let{code}=await axios.deleteCartList(skuId)
- if(code==200){
- return 'ok'
- }else{
- return Promise.reject(new Error('false'))
- }
- },
-
- deleteAllChecked({dispatch,getters}){
- //context小仓库上下文 commit【提交 mutations】 getters【计算属性】 dispatch【派发actions】 state【当前仓库的数据】
- //获取购物车的全部数据
- let promiseAll=[]
- let list=getters.cardlist.cartInfoList
- list.forEach(item=>{
- console.log(item);
- //返回一个promis,每一次添加到新数组中
- let result =item.isChecked==1?dispatch('deleteCartList',item.skuId):''
- promiseAll.push(result)
- })
- //全部的promise成功就是成功,有一个失败就失败
- return Promise.all(promiseAll)
- }
- }
- -------------------------------页面--------------------------
- async deleteAll() {
-
- try {
- await this.$store.dispatch('deleteAllChecked')
- this.getData()
- } catch (err) {
- console.log(err.message);
- }
- }
-
- },