目录

苍穹外卖前端Day1-vue基础Axios路由vue-router状态管理vuexTypeScript

苍穹外卖前端Day1 | vue基础、Axios、路由vue-router、状态管理vuex、TypeScript

https://i-blog.csdnimg.cn/direct/ba5d1098c6ec4778a3b6b2596ecee385.png

https://i-blog.csdnimg.cn/direct/bf3ae5549a3d4c82aec0d4a8d2dcd403.png

Vue基础回顾

1. 基于脚手架创建前端工程

https://i-blog.csdnimg.cn/direct/2a5dc7d9b8b144f48129f939b3de9c6c.png

安装环境检查

https://i-blog.csdnimg.cn/direct/e0626f52e10d4c80801b1efb701b0c73.png

两种创建项目方式

https://i-blog.csdnimg.cn/direct/e69f590d91444f67a3ba5dd0262b6ff1.png

第二种方式更常用,但是两种方式创建出的项目结构是一样的

https://i-blog.csdnimg.cn/direct/9db8e6a967ef4dc5ae96423128d61601.png

第一种方法:在想创建项目的根目录下输入 vue create 项目名称https://i-blog.csdnimg.cn/direct/a96dca9b42754f5b8431ec3dfb284009.png

https://i-blog.csdnimg.cn/direct/9d88896f1b4243d189122d517a8d3f84.png

第二种方法:在想创建项目的根目录下输入vue ui,进入UI网页界面

https://i-blog.csdnimg.cn/direct/82d2af1b9fe24b8f96d42a6e154312f2.png

https://i-blog.csdnimg.cn/direct/efcb48972797418fbf28fe2f1eea24f3.png

项目结构:

https://i-blog.csdnimg.cn/direct/796dd8779aff48d9ac558e35ca004ff7.png

https://i-blog.csdnimg.cn/direct/96456c3f7cb54a6992f73b2748707943.png

https://i-blog.csdnimg.cn/direct/53547f2ad49541bcb0aa24738b96258a.png

2. vue基本使用方式

https://i-blog.csdnimg.cn/direct/7caec5e7415e46b495192d5b52a235c8.png

https://i-blog.csdnimg.cn/direct/c962d7bc94334685a12aa44f0ca4484f.png

例子:

<template>
  <div id="app">
    <img alt="Vue logo" src="./assets/logo.png">
    <HelloWorld msg="Welcome to Your Vue.js App"/>
  </div>
</template>

<script>
import HelloWorld from './components/HelloWorld.vue'

export default {
  name: 'App',
  components: {
    HelloWorld
  }
}
</script>

<style>
#app {
  font-family: Avenir, Helvetica, Arial, sans-serif;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  text-align: center;
  color: #2c3e50;
  margin-top: 60px;
}
</style>

基本语法

文本插值

https://i-blog.csdnimg.cn/direct/9b35e10862ab42e9bfb1a134828c575a.png

可以使用简单的三目运算

https://i-blog.csdnimg.cn/direct/8fb566727b40436bbaecc7670a723930.png

https://i-blog.csdnimg.cn/direct/598f7547039b4c74a8c6a7020a408b2e.png

https://i-blog.csdnimg.cn/direct/695d2197316c43e8ba095c46c9482698.png

https://i-blog.csdnimg.cn/direct/3024375940f845658a4589ee5beea9fb.png

以上的测试代码在HelloWorld.vue

<template>
  <div class="hello">
    {{ name }}
    {{ age > 60 ? '老年' : '青年 '}}

    <input type="text" v-bind:value="name"/>
    <input type="text" :value="age"/>
    <img :src="src">

    <input type="button" value="保存" v-on:click="handleSave"/>
    <input type="button" value="保存" @click="handleSave"/>

    <input type="text" v-model="name"/>
    <input type="button" value="修改name的值" @click="handleChange"/>

    <div v-if="sex == 1">
      男
    </div>
    <div v-else-if="sex == 2">
      女
    </div>
    <div v-else>
      未知
    </div>

  </div>
</template>

<script>
export default {
  name: 'HelloWorld',
  props: {
    msg: String
  },
  data() {
    return {
      name: '张三',
      age: 30,
      src: 'https://i-blog.csdnimg.cn/img_convert/bcd90b2d074ce6f358b63d4f53a44cc7.jpeg',
      sex: 1
    }
  },
  methods: {
    handleSave(){
      alert('你点击了保存按钮')
    },
    handleChange(){
      this.name = '李四'
    }
  }

}
</script>

<!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped>
h3 {
  margin: 40px 0 0;
}
ul {
  list-style-type: none;
  padding: 0;
}
li {
  display: inline-block;
  margin: 0 10px;
}
a {
  color: #42b983;
}
</style>

Axios

Axios 是一个基于 Promise 的 HTTP 客户端,可用于浏览器和 Node.js 环境,在前端开发中被广泛应用于发送 HTTP 请求、与后端 API 进行数据交互。

https://i-blog.csdnimg.cn/direct/9c7c9faecb224d9da8f6af89f83d0bef.png

安装如下

https://i-blog.csdnimg.cn/direct/5ae4a792c5f949538fa0218d74f10b8c.png

https://i-blog.csdnimg.cn/direct/7fe15266e3bb44a7b685bb43513f0439.png

https://i-blog.csdnimg.cn/direct/ecbfc337b51b4f8594849582c9061e07.png

尝试:不配置跨域解决方法,产生错误,原因是当前是在7070端口,而后端服务运行在8080端口

https://i-blog.csdnimg.cn/direct/a9343345b14f498eb6667af96aa8409f.png

按照上面的方法配置可以解决跨域请求问题,修改vue.config.js文件,需要重启vue才能生效

https://i-blog.csdnimg.cn/direct/91d29f8ffbc44ce0ab521e0e022c86dc.png

编写get请求后会发生401错误,是因为需要JWT令牌token,所以从刚才POST方法中获得当前token,写到这个方法中

https://i-blog.csdnimg.cn/direct/f83f045a75e1490d8a7eafce2d5f2330.png

https://i-blog.csdnimg.cn/direct/7cf59705c90f44deb3320780bdf6fa76.png

https://i-blog.csdnimg.cn/direct/378c6f618cf042e3a7e84050462aadf6.png

这次status可以正确请求,一开始测试不成功是因为redis没有开启,无法获取店铺营业状态

https://i-blog.csdnimg.cn/direct/93dc547a86e74b58ae947b5f4281ab4d.png

https://i-blog.csdnimg.cn/direct/313bfa2cd3e045d190faf78126cd15da.png

路由Vue-Router

1. 介绍

https://i-blog.csdnimg.cn/direct/e00a737b9f494930990ae3cc024fa0f6.png

https://i-blog.csdnimg.cn/direct/f32f71695ba14196aac64e4b155aa4ac.png

选择“手动创建”,勾选Router

https://i-blog.csdnimg.cn/direct/8efaf3fde5eb467c9cc3d43ddf8c3bf2.png

不同的路径对应不同的组件展示

https://i-blog.csdnimg.cn/direct/de9e59d57d2041b99de3c30a612ce53c.png

https://i-blog.csdnimg.cn/direct/296e2473f4b44bdbb61ba06df1b9ee43.png

https://i-blog.csdnimg.cn/direct/4712482b118645a8845d9dcac1c058a8.png

2. 路由配置

https://i-blog.csdnimg.cn/direct/6a52146ec85345f7b4b3ff78ef0b1a99.png

路由组成:路由器、路由链接组件、路由视图组件

在src/router/index.js中是路由路径和视图的对应关系,注意学习 静态引入/动态引入

import Vue from 'vue'
import VueRouter from 'vue-router'
import HomeView from '../views/HomeView.vue'

Vue.use(VueRouter)

// 维护路由表,某个路由路径对应哪个视图组件
const routes = [
  {
    path: '/',
    name: 'home',
    //静态引入,打包时组件打包到同一个js文件里面
    component: HomeView
  },
  {
    path: '/about',
    name: 'about',
    // route level code-splitting
    // this generates a separate chunk (about.[hash].js) for this route
    // which is lazy-loaded when the route is visited.
    // 懒加载,项目打包时,单独打包到一个js文件里面
    // 如果请求这个视图时才加载,否则不加载
    // 建议使用这个动态导入方式,性能更好一些
    component: () => import(/* webpackChunkName: "about" */ '../views/AboutView.vue')
  }
]

const router = new VueRouter({
  routes
})

export default router

路由链接组件,在App.vue,这是整个项目的入口

<template>
  <div id="app">
    <nav>
      <router-link to="/">Home</router-link>
      <router-link to="/about">About</router-link>
    </nav>
    <router-view/>
  </div>
</template>

路由跳转:标签式、编程式

https://i-blog.csdnimg.cn/direct/3e5bf073863d449fb7be3cdfb616539d.png

https://i-blog.csdnimg.cn/direct/a02e9d93725747988c2cb23106781a84.png

https://i-blog.csdnimg.cn/direct/05b3019bf4494ef9bebc52f9fa32f22c.png

3. 嵌套路由(子路由)

https://i-blog.csdnimg.cn/direct/8fe1ca04d3544a6fb1ead6a7c2c24ca7.png

https://i-blog.csdnimg.cn/direct/9a8dd18b452a4b8293019f6fb9a04a83.png

https://i-blog.csdnimg.cn/direct/30100f2b52c24bef9f7dd04567db8fdc.png

基于ElementUI提供的快速上手攻略配置main.js文件

https://i-blog.csdnimg.cn/direct/1fc1cd272bc54fa69f26877dea6767cf.png

<el-container>
  <el-aside width="200px">Aside</el-aside>
  <el-container>
    <el-header>Header</el-header>
    <el-main>Main</el-main>
  </el-container>
</el-container>

配置嵌套路由:在index.js中配置children

https://i-blog.csdnimg.cn/direct/f81cda0feabb4a2483fcdc87ee399e1d.png

https://i-blog.csdnimg.cn/direct/b4e1ddf31af94cfd927ce15e9489b463.png

https://i-blog.csdnimg.cn/direct/59dee157f6e24145a9c543535f7d8745.png

状态管理vuex

1. vuex介绍

https://i-blog.csdnimg.cn/direct/4f271cf9d0174befb0206e713765ea13.png

https://i-blog.csdnimg.cn/direct/ba92b78fbac24cfda91975fc7b303354.png

只能通过同步函数mutations修改state共享数据

https://i-blog.csdnimg.cn/direct/5261927b6b994d69bce24116d9c8d6ac.png

2. 使用方式

https://i-blog.csdnimg.cn/direct/b1bbead787c34404a4df877d2412455c.png

https://i-blog.csdnimg.cn/direct/3bf1a3edfc2a43e39a1651a2c870942a.png

https://i-blog.csdnimg.cn/direct/ec4e1ae6f6694a85abfa2c358ec9755b.png

定义和展示共享数据,在state中集中定义数据,在其他多组件都可以使用

https://i-blog.csdnimg.cn/direct/6e148c8aa8e44784bbc922183f1bd321.png

修改共享数据

https://i-blog.csdnimg.cn/direct/0942692b52f44568bac33f6a05abfc4c.png

https://i-blog.csdnimg.cn/direct/95be03012e2144f0b5a84ed16e57187c.png

https://i-blog.csdnimg.cn/direct/71cd83b34bc9415c9e153a41b71f6d38.png

3. 异步操作和同步操作

对比:

维度同步操作(Synchronous)异步操作(Asynchronous)
执行方式任务按顺序执行,前一个任务完成后,才执行下一个任务任务发起后不等待结果,直接执行后续代码,结果通过 “回调 / 事件” 通知
阻塞性会阻塞后续代码运行(“卡主” 程序)不会阻塞后续代码运行(“并行” 处理)
结果获取时机任务执行完成后,立即获取结果任务后台执行,结果在未来某个时间点通过特定方式返回
典型场景简单计算、变量赋值、同步读取本地文件网络请求(Axios)、定时器(setTimeout)、异步 IO(数据库查询)
类型优点缺点适用场景
同步操作逻辑简单、线性执行、调试容易阻塞线程,导致程序 “卡顿”(如长耗时 IO)短耗时任务:简单计算、变量赋值、同步读取小文件
异步操作不阻塞线程,提高程序响应速度逻辑复杂(需处理回调 / Promise)、调试难长耗时任务:网络请求、定时器、数据库查询、大文件读写
执行队列:“单线程” 中的同步与异步(以 JavaScript 为例)

JavaScript 是单线程语言(同一时间只能执行一个任务),但通过 “事件循环(Event Loop)” 机制实现了异步操作,核心逻辑如下:

  • 同步任务:直接进入 “主线程” 执行,执行完一个再执行下一个,形成 “同步执行栈”。
  • 异步任务:不进入主线程,而是先进入 “任务队列”(Task Queue)等待;当主线程的同步任务全部执行完后,再从任务队列中取出异步任务的 “回调函数” 进入主线程执行。

https://i-blog.csdnimg.cn/direct/b32da0f85add4b85bd622d4a972bd754.png

TypeScript

1. TypeScript介绍

https://i-blog.csdnimg.cn/direct/04eba45e2397476491fd1a731c0773bd.png

Vue框架源码是基于TS编写的

https://i-blog.csdnimg.cn/direct/8e2a715961464aa582329af2f22a7223.png

尝试编写ts代码并编译,故意传参传一个错误的类型

https://i-blog.csdnimg.cn/direct/b6485bd89f3e4a7483d392ac242bdd2e.png

https://i-blog.csdnimg.cn/direct/db893b269e7941c490ac5e87bf7229fb.png

https://i-blog.csdnimg.cn/direct/d44f5334bfaa4377bbf26d548678d397.png

编译tsc hello.ts   执行 node hello.js

TS优点

https://i-blog.csdnimg.cn/direct/205c3e54867b4174a8d981f57958ffda.png

https://i-blog.csdnimg.cn/direct/d1ca535a977e4fe3af307ddf9048e6b3.png

2. TypeScript常用类型

https://i-blog.csdnimg.cn/direct/b44c388f4439417597aa600ee68f78b9.png

https://i-blog.csdnimg.cn/direct/bef58b12608949ce96957ca7311e5f55.png

只是在开发阶段使用TypeScript,实际项目上线需要将ts编译成js,编译之后的文件中类型会擦除

(类型擦除)

https://i-blog.csdnimg.cn/direct/eb8a27255d5c426886b584d40aa96b2f.png

https://i-blog.csdnimg.cn/direct/66876abefc2844c9bf799fcfde072a2f.png

编译后的js文件

https://i-blog.csdnimg.cn/direct/74f5a0dcda90499b88ed74a5b486df31.png

字面量类型 – 类似于java的枚举

https://i-blog.csdnimg.cn/direct/5c23444c7e074467ae961323ce497865.png

字面量类型用于限定数据的取值范围

interface类型

https://i-blog.csdnimg.cn/direct/d3d034c67d0949f784dadc159ab0181c.png

编译后的js文件中没有interface,类型擦除,只是为了编码过程中约束赋值

https://i-blog.csdnimg.cn/direct/c7a2e3fe6c5140538f2b90c066a1d1b7.png

class类

https://i-blog.csdnimg.cn/direct/06637f546291484a8ca493258f9263f1.png

编译之后没有class关键字

https://i-blog.csdnimg.cn/direct/49668618aa2b4778bd42f529db480258.png

class类–实现接口implements

https://i-blog.csdnimg.cn/direct/0d21b06e30ca44c89e52a66833e40b8a.png

https://i-blog.csdnimg.cn/direct/d94af1507c5649ad8f33b4ea6400de54.png

class类–类的继承extends

https://i-blog.csdnimg.cn/direct/c9dc3177abcd4ba799709862fa81056d.png

编译后

https://i-blog.csdnimg.cn/direct/e620bf7d19744c7e87f4eabe8aabf7a6.png

https://i-blog.csdnimg.cn/direct/f7b2978ee890475f9b62d761a6e9e548.png