fastapi+vue3+primeflex前后端分离开发项目第一个程序

安装axios

axios是用来请求后端接口的。

https://www.axios-http.cn/docs/intro

pnpm 是一个前端的包管理工具,当我们需要给前端项目添加新的依赖的时候,就可以使用pnpm install 命令进行安装。

bash 复制代码
pnpm install axios

安装 primeflex

primeflex是一个css样式库,用来帮助我们快速的开发前端的界面。

bash 复制代码
pnpm install primeflex

在 src/main.js 中引入 primeflex 相关的样式文件。

js 复制代码
import { createApp } from 'vue'

import "primeflex/primeflex.css"
import "primeflex/themes/primeone-light.css"

import App from './App.vue'

createApp(App).mount('#app')

vue3请求后端数据

修改 src/App.vue

html 复制代码
<script setup>
import axios from "axios"

axios.get('http://127.0.0.1:8000/')
    .then(function (response) {
      // 处理成功情况
      console.log(response);
    })
    .catch(function (error) {
      // 处理错误情况
      console.log(error);
    })
    .finally(function () {
      // 总是会执行
    });
</script>

<template>
  <h1>request fastapi data</h1>
</template>

此时,前端会报一个CORS跨域错误,这个是前后端分离开发中非常常见的错误。

在本项目中,将使用 fastapi 在后端解决此错误。

解决后端跨域问题

修改 main.py

python 复制代码
from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware

app = FastAPI()

origins = [
    "*"
]

app.add_middleware(
    CORSMiddleware,
    allow_origins=origins,
    allow_credentials=True,
    allow_methods=["*"],
    allow_headers=["*"],
)


@app.get("/")
async def main():
    return {"message": "Hello World"}

修改以后,记得重启服务。

vue 的挂载生命周期方法

生命周期方法,就是不需要我们手动调用,vue会在特殊的时刻自动调用的方法。

示例代码:

js 复制代码
import {onMounted} from "vue";

onMounted(() => {
  console.log("on mounted")
})

onMounted这个生命周期方法,会在组件挂载的时候,自动触发。

直白的讲,就是我们每次刷新页面的时候,都会触发这个方法。

vue3 如何定义和渲染响应式变量

响应式变量,指的是,我们在程序运行过程中,动态修改了变量的值以后,页面中的渲染效果也会自动跟着改变的变量。如果我们在页面中,反向修改了响应式变量的值,内存中真实的响应式变量的值也会跟着修改。

有点抽象,直接看代码:

html 复制代码
<script setup>
import axios from "axios"
import {onMounted, ref} from "vue";

const message = ref("frontend variable")

axios.get('http://127.0.0.1:8000/')
    .then(function (response) {
      // 处理成功情况
      console.log("response", response);
    })
    .catch(function (error) {
      // 处理错误情况
      console.log(error);
    })
    .finally(function () {
      // 总是会执行
    });

onMounted(() => {
  console.log("on mounted")
})

</script>

<template>
  <h1>{{ message }}</h1>
</template>

定义响应式变量:

js 复制代码
import {onMounted, ref} from "vue";

const message = ref("frontend variable")

渲染响应式变量:

html 复制代码
<h1>{{ message }}</h1>

提取后端数据

思路:

  • 在页面加载的时候,请求后端数据
  • 将请求到的后端数据,设置为响应式的变量
  • 在页面中渲染响应式变量

直接上代码:

html 复制代码
<script setup>
import axios from "axios"
import {onMounted, ref} from "vue";

const message = ref("frontend variable")

onMounted(() => {
  console.log("on mounted")
  axios.get('http://127.0.0.1:8000/')
      .then(function (response) {
        // 处理成功情况
        console.log("response", response);
        console.log("response", response.data.message);
        message.value = response.data.message
      })
      .catch(function (error) {
        // 处理错误情况
        console.log(error);
      })
      .finally(function () {
        // 总是会执行
      });
})

</script>

<template>
  <h1>{{ message }}</h1>
</template>

关键:将后端请求的数据赋值给前端响应式变量

js 复制代码
message.value = response.data.message

练习

后端给我返回一个字符串,这个字符串有1到100的偶数组成,用逗号分隔,然后前端渲染。

后端代码:main.py

python 复制代码
from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware

app = FastAPI()

origins = [
    "*"
]

app.add_middleware(
    CORSMiddleware,
    allow_origins=origins,
    allow_credentials=True,
    allow_methods=["*"],
    allow_headers=["*"],
)


@app.get("/")
async def main():
    arr = [str(i) for i in range(2, 101, 2)]
    message = ",".join(arr)
    return {"message": message}

前端代码:App.vue

html 复制代码
<script setup>
import axios from "axios"
import {onMounted, ref} from "vue";

const message = ref("frontend variable")

onMounted(() => {
  console.log("on mounted")
  axios.get('http://127.0.0.1:8000/')
      .then(function (response) {
        // 处理成功情况
        console.log("response", response);
        console.log("response", response.data.message);
        message.value = response.data.message
      })
      .catch(function (error) {
        // 处理错误情况
        console.log(error);
      })
      .finally(function () {
        // 总是会执行
      });
})

</script>

<template>
  <h1>{{ message }}</h1>
</template>
相关推荐
OpenTiny社区4 分钟前
开源之夏报名倒计时3天!还有9个前端任务有余位,快来申请吧~
前端·github
ak啊9 分钟前
WebGL魔法:从立方体到逼真阴影的奇妙之旅
前端·webgl
hang_bro19 分钟前
使用js方法实现阻止按钮的默认点击事件&触发默认事件
前端·react.js·html
用户907387036486428 分钟前
pnpm是如何解决幻影依赖的?
前端
树上有只程序猿34 分钟前
Claude 4提升码农生产力的5种高级方式
前端
傻球35 分钟前
没想到干前端2年了还能用上高中物理运动学知识
前端·react.js·开源
咚咚咚ddd35 分钟前
前端组件:pc端通用新手引导组件最佳实践(React)
前端·react.js
Lazy_zheng36 分钟前
🚀 前端开发福音:用 json-server 快速搭建本地 Mock 数据服务
前端·javascript·vue.js
HJ_Coder36 分钟前
基于Proxyman的实时解密和预览方案
前端
Gixy37 分钟前
聊聊纯函数与不可变数据结构
前端·设计模式