VUE 开发——Vue学习(三)—— 智慧商城项目

news2025/1/18 18:45:30

目录

解释各个模块

  1. api接口模块:发送ajax请求的接口模块
  2. utils工具模块:自己封装的一些工具方法模块
  3. components组件模块:全局通用的组件
  4. router路由模块:封装要所有路由
  5. views:各个页面
  6. assets:各种资源

vant组件库

组件库:适用vue2版本的vant2
一般会按照不同平台进行分类:

  1. PC端:element-ui、ant-design-vue
  2. 移动端:vant-ui、Mint UI、Cube UI

vant导入操作

全部导入

1.安装vant-ui

npm i vant@latest-v2 -S

2.main.js注册

import Vant from 'vant'
import 'vant/lib/index.css'
//把vant组件都导入了
Vue.use(vant)

3.组件使用

按需导入

1.安装插件
npm i babel-plugin-import -D
2.babel.config.js配置

`module.exports = {
  plugins: [
    ['import', {
      libraryName: 'vant',
      libraryDirectory: 'es',
      style: true
    }, 'vant']
  ]
};`

3.main.js按需导入注册
官网查询用法

封装vant组件导入

在utils中新建一个vant-ui.js文件,将刚才main.js写入的导入代码写进去,并在main.js中导入该文件

postcss插件

实现项目中vw适配

1.安装插件

npm install postcss-px-to-viewport --save-dev

2.根目录新建postcss.config.js文件,填入配置

// postcss.config.js
module.exports = {
  plugins: {
    'postcss-px-to-viewport': {
      viewportWidth: 375,
    },
  },
};

路由设计配置

路由页面建立

但凡单个页面独立展示,就是一级路由。
建立路由页面
新建文件内容填入:

<template>

</template>

<script >
export default {
    name: 'LayoutIndex'
}
</script>

<style lang="less" scoped>
</style>

路由引入

在router的文件引入路由

import Vue from 'vue'
import VueRouter from 'vue-router'
import Layout from '@/views/layout'
import Login from '@/views/login'
import MyOrder from '@/views/myorder'
import Pay from '@/views/pay'
import Prodetail from '@/views/prodetail'
import Search from '@/views/search'
import SearchList from '@/views/search/list.vue'

Vue.use(VueRouter)

const router = new VueRouter({
  routes: [
    { path: '/login', component: Login },
    { path: '/', component: Layout },
    { path: '/search', component: Search },
    { path: '/searchlist', component: SearchList },
    //动态路由传参,确认是哪一些商品,路由传参中携带id
    { path: '/prodetail/:id', component: Prodetail },
    { path: '/pay', component: Pay },
    { path: '/myorder', component: MyOrder },
  ]
})

export default router

二级路由

1.vant-ui.js按需引入

import Vue from 'vue';
import { Tabbar, TabbarItem } from 'vant';

Vue.use(Tabbar);
Vue.use(TabbarItem);

2.layout.vue粘贴官方代码测试
3.修改文字、图标、颜色

二级路由配置

router中配置

{ path: '/',
      component: Layout,
      children: [
        { path: '/home', component: Home},
        { path: '/category', component: Category},
        { path: '/cart', component: Cart},
        { path: '/user', component: User}
      ]
    }

tabbar里添加路由属性

 <!-- 二级路由出口,二级组件展示的位置 -->
        <router-view></router-view>

        <van-tabbar route  active-color="#ee0a24" inactive-color="#000">
            <van-tabbar-item to="/home" icon="wap-home-o">我的</van-tabbar-item>
            <van-tabbar-item to="/category" icon="apps-o">分类页</van-tabbar-item>
            <van-tabbar-item to="/cart" icon="shopping-cart-o">购物车</van-tabbar-item>
            <van-tabbar-item to="/user" icon="user-o">我的</van-tabbar-item>
        </van-tabbar>

登录页静态布局

async的作用详解

async 是 JavaScript 中的一个关键字,用于声明异步函数。异步函数通常用于处理异步操作,如网络请求、文件读写等,这些操作不会立即完成,而是会在将来某个时刻完成。

什么是 async 函数?

async 函数允许你在函数内部使用 await 关键字,等待一个 Promise 结果。当一个函数被声明为 async 时,它会返回一个 Promise 对象,即使你没有显式地返回它。

async 函数的特点

  1. 自动返回 Promiseasync 函数会自动返回一个 Promise 对象。
  2. 使用 await 关键字:在 async 函数内部,可以使用 await 关键字来等待一个异步操作的结果。
  3. 更简洁的错误处理:可以使用 try...catch 语句来捕获异步操作中的错误。

示例

下面是一个简单的示例,展示如何使用 asyncawait 来处理异步操作:

// 异步函数模拟获取数据
function getData() {
  return new Promise((resolve) => {
    setTimeout(() => resolve('Data loaded'), 2000);
  });
}

// 使用 async 和 await 处理异步操作
async function fetchData() {
  try {
    const result = await getData();
    console.log(result); // 输出 "Data loaded"
  } catch (error) {
    console.error('Error fetching data:', error);
  }
}

// 调用异步函数
fetchData();

asyncawait 的优势

  1. 提高可读性:使用 asyncawait 可以让你的代码更加接近同步代码的风格,使代码更容易理解和维护。
  2. 简化错误处理:使用 try...catch 可以更方便地处理异步操作中的错误。
  3. 链式调用:可以方便地链式调用多个异步操作,使得异步流程更加自然和直观。

使用场景

asyncawait 常用于以下场景:

  1. 网络请求:发送 HTTP 请求并处理响应。
  2. 文件操作:读取或写入文件。
  3. 数据库操作:执行数据库查询或事务。
  4. 定时任务:处理定时触发的操作。

注意事项

  1. 只能在 async 函数内部使用 awaitawait 只能在 async 函数内部使用。
  2. 错误处理:需要适当处理异步操作中的错误,通常使用 try...catch
  3. 性能考虑:虽然 asyncawait 可以简化异步代码编写,但在大量并发请求时仍需注意性能优化。

示例:Vue 中的使用

在 Vue 中,你可以使用 async 函数来处理组件生命周期钩子中的异步操作,例如:

export default {
  async created() {
    try {
      const data = await getData();
      this.data = data;
    } catch (error) {
      console.error('Error fetching data:', error);
    }
  }
};

通过这种方式,你可以更清晰地管理组件中的异步逻辑。

总之,asyncawait 提供了一种更加优雅的方式来编写和处理异步代码,使得代码更加简洁易懂。

request模板——axios封装

使用axios来请求后端接口,一般都会对axios进行一些配置(例如:配置基础地址,请求响应拦截器等)
所以项目开发中,都会对axios进行基本的二次封装,单独封装到一个request模块中,便于维护。

步骤

1.安装axios

npm install axios --save

2.新建request模块 utils/request.js

3.创建实例,配置导出实例

import axios from "axios";

const instance = axios.create({
    baseURL: 'http://cba.itlike.com/public/index.php?s=/api/',
    timeout: 5000
});

// 添加请求拦截器
instance.interceptors.request.use(function (config) {
    // 在发送请求之前做些什么
    return config;
  }, function (error) {
    // 对请求错误做些什么
    return Promise.reject(error);
  });

// 添加响应拦截器
instance.interceptors.response.use(function (response) {
    // 2xx 范围内的状态码都会触发该函数。
    // 对响应数据做点什么
    return response.data;
  }, function (error) {
    // 超出 2xx 范围的状态码都会触发该函数。
    // 对响应错误做点什么
    return Promise.reject(error);
  });

export default instance

4.图形验证码功能实现

export default {
  name: 'LoginPage',
  data () {
    return {
      picKey: '', // 将来请求传递的图形验证码唯一标识
      picUrl: '', // 存储请求渲染的图片地址
      totalSecond: 60, // 总秒数
      second: 60, // 当前秒数,开定时器对 second--
      timer: null, // 定时器 id
      mobile: '', // 手机号
      picCode: '', // 用户输入的图形验证码
      msgCode: '' // 短信验证码
    }
  },
  async created () {
    this.getPicCode()
  },
  methods: {
    //获取图形验证码
    async getPicCode () {
    const { data: { base64, key } } = await request.get('/captcha/image')
    this.picUrl = base64 //存储地址
    this.picKey = key //存储唯一标识
    }
  }
  
  
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2214190.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JAVA软开-面试经典题(7)-字符串常量池

字符串常量池 1.定义&#xff1a;字符串常量池&#xff08;String Constant Pool&#xff09;&#xff0c;用于存放字符串常量的运行时内存结构&#xff0c;其底层的实现为Hashtable。 【注意】 在JDK1.6之前&#xff0c;字符串常量池中只会存放具体的String实例&#xff0c;在…

MySQL基础探秘(3)

前面那篇文章是简单介绍了往数据库中插入数据&#xff0c;以及对数据进行有些改动。 但是&#xff0c;细想下&#xff0c;数据能够无限制&#xff0c;无约束进行插入吗&#xff1f; emm……显然是不行的&#xff0c;不然数据就乱套了&#xff0c;看起来不美观。 所以要对数据…

Axure详细介绍及功能对比,常用版本选择和替代软件分享

Axure是一款专门用于原型设计和交互设计的专业软件&#xff0c;广泛应用于用户界面&#xff08;UI&#xff09;和用户体验&#xff08;UX&#xff09;设计领域。它的主要功能是帮助产品经理、设计师以及开发人员创建具有互动性的原型&#xff0c;以便展示和测试各种应用、网站或…

CST学习笔记(二)Floquet模式激励设置

CST学习笔记&#xff08;二&#xff09;Floquet模式激励设置 在CST中我们常常使用Floquet模式来仿真频率选择表面(FSS)或者超材料等&#xff0c;但是我们设置好Zmax的floquet模式数量后&#xff0c;启动仿真&#xff0c;会发现S参数一栏中有很多我们不想要看的S参数&#xff0…

海南聚广众达电子商务咨询有限公司解锁流量密码

在这个瞬息万变的数字时代&#xff0c;电商行业如同一股不可阻挡的洪流&#xff0c;正以前所未有的速度重塑着商业版图。而在这股浪潮中&#xff0c;抖音电商以其独特的魅力&#xff0c;迅速崛起为一颗璀璨的新星&#xff0c;吸引了无数商家与创业者的目光。海南聚广众达电子商…

【题解】【动态规划01背包问题】—— [NOIP2012 普及组] 摆花

【题解】【动态规划01背包问题】—— [NOIP2012 普及组] 摆花 [NOIP2012 普及组] 摆花题目描述输入格式输出格式输入输出样例输入 #1输出 #1 提示 解法1.二维 d p dp dp1.1.思路解析1.2.AC代码 解法2.一维 d p dp dp2.1.思路解析2.2.AC代码 3.扩展:前缀和优化 [NOIP2012 普及组…

python基础知识(十一)面向过程,面向对象,对象属性,魔法方法,继承,私有权限

目录 面向过程是什么 什么是面向对象&#xff1f; 面向对象的三大特性&#xff1a; 继承 多态 类 对象 self关键字 对象属性 类外面访问属性 类内部获取属性 魔法方法 无参init()方法 有参init()方法 str()方法 del()方法 继承基础 什么是继承 单继承 多继…

Javascript笔试题目(六)

1.如何使用JS实现Promise 对象?请写出具体代码 Promise其实也不难-CSDN博客 Javascript 手写一个Promise_javascript中手写promise ?-CSDN博客 Promise其实也不难-CSDN博客 题目要求我们使用JavaScript实现一个Promise对象。对此我们可以基于Promise/A规范的要求进行实现Prom…

面试-2024年7月16号

面试-2024年7月16号 自我介绍Mysql主从复制是做了一个什么样的集群&#xff1f;在Mysql的使用过程中遇到过哪些问题&#xff1f;mysql迁移具体步骤mysql漏洞修复是怎么做的。mysql的容灾方案&#xff08;灾备恢复机制&#xff09;。redis多节点怎么部署的redis的备份与恢复、迁…

电源中的“冷地”和“热地”

最近硬件同事在弄开关电源相关项目&#xff0c;由于其第一次做开关电源&#xff0c;并不懂冷地和热地的区别&#xff0c;出现示波器探头接地夹夹“热地”导致实验室多次跳闸&#xff0c;最严重时把板子给炸了。为了了解冷地和热地的如何辨别以及为什么热地带电这些知识&#xf…

【从零开发Mybatis】引入XNode和XPathParser

引言 在上文&#xff0c;我们发现直接使用 DOM库去解析XML 配置文件&#xff0c;非常复杂&#xff0c;也很不方便&#xff0c;需要编写大量的重复代码来处理 XML 文件的读取和解析&#xff0c;代码可读性以及可维护性相当差&#xff0c;使用起来非常不灵活。 因此&#xff0c…

JavaEE 多线程第二节 (多线程的简单实现Thread/Runable)

1. 创建线程&#xff08;继承 Thread 类&#xff09;步骤&#xff1a; 继承 Thread 类&#xff1a; 创建一个类并继承 Thread 类&#xff0c;然后重写 run() 方法&#xff0c;在该方法中写入线程执行的代码 class MyThread extends Thread {Overridepublic void run()…

数据恢复超简单!9 个方法任你选!小白也能轻易恢复数据!

在当今数字化的世界中&#xff0c;数据恢复的重要性日益凸显。无论是工作中的重要文档&#xff0c;还是生活中的珍贵照片和视频&#xff0c;一旦丢失&#xff0c;都可能给我们带来极大的困扰。别担心&#xff0c;下面为大家介绍 9 个超简单的数据恢复方法&#xff0c;让小白也能…

C++基础面试题 | 什么是C++中的运算符重载?

文章目录 回答重点&#xff1a;示例&#xff1a; 运算符重载的基本规则和注意事项&#xff1a; 回答重点&#xff1a; C的运算符重载是指可以为自定义类型&#xff08;如类或结构体&#xff09;定义运算符的行为&#xff0c;使其像内置类型一样使用运算符。通过重载运算符&…

它思科技CTO聂玮奇:消除“AI幻觉”,搭建高可靠对话云平台丨数据猿专访

大数据产业创新服务媒体 ——聚焦数据 改变商业 近年来&#xff0c;大模型技术在全球范围内引起了广泛关注和应用热潮。 提到人工智能&#xff0c;很多人会想到它强大的运算能力和广泛的应用场景。如今&#xff0c;语言模型的发展如火如荼&#xff0c;但其中的“幻觉”问题却带…

基于SSM社区医院预约转诊管理系统JAVA|VUE|Springboot计算机毕业设计源代码+数据库+LW文档+开题报告+答辩稿+部署教+代码讲解

源代码数据库LW文档&#xff08;1万字以上&#xff09;开题报告答辩稿 部署教程代码讲解代码时间修改教程 一、开发工具、运行环境、开发技术 开发工具 1、操作系统&#xff1a;Window操作系统 2、开发工具&#xff1a;IntelliJ IDEA或者Eclipse 3、数据库存储&#xff1a…

SwiftUI 6.0(iOS 18)自定义容器值(Container Values)让容器布局渐入佳境(上)

概述 我们在之前多篇博文中已经介绍过 SwiftUI 6.0&#xff08;iOS 18&#xff09;新增的自定义容器布局机制。现在&#xff0c;如何利用它们对容器内容进行“探囊取物”和“聚沙成塔”&#xff0c;我们已然胸有成竹了。 然而&#xff0c;除了上述鬼工雷斧般的新技巧之外&…

STM32_实验1_建立新工程

1、使用STM32CubeIDE建立一个新工程 1.1选择时钟源为外部晶振时钟。 1.2选择调试方式为 serial wire&#xff08;串行线&#xff09;。 1.3配置时钟树. 1.4选择以 c 和 h 文件型式管理工程文件。 1.5生成 hex 可执行文件。&#xff08;完成后点击锤子&#xff09; 2.串口输出调…

鸿蒙进入“无人区”:该如何闯关?

按照华为方面的说法&#xff0c;“打造鸿蒙操作系统是三大战役&#xff0c;目前已经完成了底座和体验两大战役&#xff0c;第三大战役则是生态。”生态固然重要&#xff0c;但要让鸿蒙与当今世界主流操作系统抗衡&#xff0c;乃至成为新一代操作系统中的翘楚&#xff0c;其实还…

每个程序员都应该了解的硬件知识

作者:shizhaoyang 在追求高效代码的路上,我们不可避免地会遇到代码的性能瓶颈。为了了解、解释一段代码为什么低效,并尝试改进低效的代码,我们总是要了解硬件的工作原理。于是,我们可能会尝试搜索有关某个架构的介绍、一些优化指南或者阅读一些计算机科学的教科书(如:计…