vue3学习(续篇)

vue3学习(续篇)

默认有vue3基础并有一定python编程经验。

chrome浏览器安装vue.js devtools拓展。

文章目录

  • vue3学习(续篇)
    • 1. element-ui使用
    • 2. axios 网络请求
      • 1. 简介
      • 2. 操作
    • 3. flask-cors解决跨域问题
      • 1. 简介
      • 2. 操作
    • 4. 前端路由 vue-router
      • 1. 简单使用
      • 2. 配置路径别名@和vscode路径显示
      • 3. 路由查询参数与路径传参
      • 4. router-link,定义别名,定义路由名称,编程式导航
      • 5. 嵌套路由结合共享组件
      • 6. 重定向
      • 7. 全局前置守卫 router.beforeEach
    • 5. vuex
    • 参考

1. element-ui使用

安装

# 选择一个你喜欢的包管理器# NPM
$ npm install element-plus --save# Yarn
$ yarn add element-plus# pnpm
$ pnpm install element-plus

main.js

import { createApp } from 'vue'
import ElementPlus from 'element-plus'
import 'element-plus/dist/index.css'
import App from './App.vue'const app = createApp(App)app.use(ElementPlus)
app.mount('#app')

App.vue

<template><el-table:data="tableData"style="width: 100%":row-class-name="tableRowClassName"><el-table-column prop="date" label="Date" width="180" /><el-table-column prop="name" label="Name" width="180" /><el-table-column prop="address" label="Address" /></el-table></template><script lang="ts" setup>interface User {date: stringname: stringaddress: string}const tableRowClassName = ({row,rowIndex,}: {row: UserrowIndex: number}) => {if (rowIndex === 1) {return 'warning-row'} else if (rowIndex === 3) {return 'success-row'}return ''}const tableData: User[] = [{date: '2016-05-03',name: 'Tom',address: 'No. 189, Grove St, Los Angeles',},{date: '2016-05-02',name: 'Tom',address: 'No. 189, Grove St, Los Angeles',},{date: '2016-05-04',name: 'Tom',address: 'No. 189, Grove St, Los Angeles',},{date: '2016-05-01',name: 'Tom',address: 'No. 189, Grove St, Los Angeles',},]</script><style>.el-table .warning-row {--el-table-tr-bg-color: var(--el-color-warning-light-9);}.el-table .success-row {--el-table-tr-bg-color: var(--el-color-success-light-9);}</style>

在这里插入图片描述

2. axios 网络请求

1. 简介

Axios是一个基于promise的网络请求库,作用于node.js和浏览器中。Axios能自动完成JSON数据的转换。

安装npm install axios

执行GET请求

// 为给定 ID 的 user 创建请求
axios.get('/user?ID=12345').then(function (response) {//处理成功情况console.log(response);}).catch(function (error) {//处理失败情况console.log(error);}).then(function(){//总是会执行});// 上面的请求也可以这样做
axios.get('/user', {params: {ID: 12345}}).then(function (response) {console.log(response);}).catch(function (error) {console.log(error);});

执行POST请求

axios.post('/user', {firstName: 'Fred',lastName: 'Flintstone'}).then(function (response) {console.log(response);}).catch(function (error) {console.log(error);});

与vue整合

//配置请求根路径
axios.defaults.baseURL='http://api.com'//将axios作为全局的自定义属性,每个组件可以在内部直接访问(vue3)
app.config.globalProperties.$http=axios 
//之后就可以this.$http.get(...)

2. 操作

App.vue

<template><Demo1/>
</template>
<script>
import Demo1 from "./components/Demo1.vue"
import axios from 'axios'
export default{data(){return{}},created(){//详见组件生命周期axios.get('https://www.baidu.com').then((response)=>{console.log(response.data);})//箭头函数使this指向vue实例  },components:{Demo1}
}
</script>

在这里插入图片描述

很明显,我们的get请求被阻止了,因为这涉及了跨域问题,后面会说。

3. flask-cors解决跨域问题

1. 简介

​ 跨域是因为出于浏览器的同源策略限制。同源策略(Sameoriginpolicy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响。可以说Web是构建在同源策略基础之上的,浏览器只是针对同源策略的一种实现。同源策略会阻止一个域的javascript脚本和另外一个域的内容进行交互。

​ 我们可以在服务器端使用flask-cors解决这个问题。

详见 flask—— flask-cors 解决跨域问题 @红@旗下的小兵

pip install -U flask-cors

全局解决-使用CORS类

from flask import Flask, request
from flask_cors import CORS
app = Flask(__name__)
CORS(app)
#CORS(app, supports_credentials=True)
#服务器允许用户跨源发出cookie或经过身份验证的请求

使用@cross_origin装饰器(适用于配置特定的api接口)

from flask import Flask
from flask_cors import CORS, cross_origin
app = Flask(__name__)# 只允许路径为'/login'跨域!
@app.route('/login')
@cross_origin()
def data():return jsonify({'name':'lxc'})

2. 操作

打开pycharm,进以前用过的python项目

输入以下代码,在http://127.0.0.0:9901起一个接口

from flask import Flask,url_for,request,render_template,make_response,redirect,jsonify
from flask_cors import CORS,cross_origin
app = Flask(__name__) # 用本脚本名实例化Flask对象
cors = CORS(app)@app.route('/login',methods=['GET','POST'])
def login():user={'id':request.args.get('id'),'ps':request.args.get('ps')}return jsonify(user)if __name__ == '__main__':app.run(host='0.0.0.0',port=9901,debug=1)

在这里插入图片描述

App.vue 发送get请求调用上述接口

<template><Demo1/>
</template>
<script>
import Demo1 from "./components/Demo1.vue"
import axios from 'axios'
export default{data(){return{}},created(){axios.get('http://127.0.0.1:9901/login?id=admin&ps=123456').then((response)=>{console.log(response.data);})},components:{Demo1}
}
</script>

在这里插入图片描述

4. 前端路由 vue-router

npm install vue-router@4

1. 简单使用

main.js

import { createApp } from 'vue'
import App from './App.vue'
import ElementPlus from 'element-plus'
import 'element-plus/dist/index.css'
import router from './router' const app = createApp(App)
app.use(ElementPlus)//5. 确保 _use_ 路由实例使整个应用支持路由。
app.use(router)
app.mount("#app")

src/router/index.js

import { createRouter, createWebHistory } from 'vue-router'// 1. 定义一些路由,每个路由都需要映射到一个组件。
const routes=[{path:'/',component:()=>import("../components/Demo1.vue")}, // 2.导入路由组件{path:'/demo2',component:()=>import("../components/Demo2.vue")}
]// 3. 创建路由实例并传递`routes`配置
const router=createRouter({// 4. 内部提供了 history 模式的实现history: createWebHistory(),routes, // `routes: routes` 的缩写
})export default router

App.vue

<template><router-view /><!--6. 通过router-view使用路由-->
</template>
<script>
</script>

2. 配置路径别名@和vscode路径显示

vscode下载插件别名路径跳转

vite.config.js 修改对应部分

resolve: {alias: {'@': fileURLToPath(new URL('./src', import.meta.url)),'cop':fileURLToPath(new URL('./src/components', import.meta.url))}}

/src/router/index.js 修改对应部分

const routes=[{path:'/',component:()=>import("@/components/Demo1.vue")}, // 2.导入路由组件{path:'/demo2',component:()=>import("cop/Demo2.vue")}
]

此时,vscode里对路径ctrl+左键不能跳转到Demo2.vue,需要修改jsconfig.json

{"compilerOptions": {"paths": {"@/*": ["./src/*"],"cop/*":["./src/components/*"]}},"exclude": ["node_modules", "dist"]
}

3. 路由查询参数与路径传参

$router是VueRouter的实例,是全局路由对象,用户可以在任何地方使用,包含了所有路由对象,包含了许多关键对象和属性。

$route代表了正在跳转的路由对象,是一个局部对象。每一个路由都有一个$route对象。

$route常见属性说明
.path字符串,对应当前路由的路径,总是解析为绝对路径,如 "/foo/bar"
.params一个 key/value 对象,包含了动态片段和全匹配片段,如果没有路由参数,就是一个空对象。
.query一个 key/value 对象,表示 URL 查询参数。例如,对于路径 /foo?user=1,则有 $route.query.user == 1,如果没有查询参数,则是个空对象。
.hash当前路由的 hash 值 (带 #) ,如果没有 hash 值,则为空字符串。

在这里插入图片描述

修改Demo2.vue

<template><h3>Demo2</h3><p>id: {{this.$route.query.id}}</p><router-view /></template>

在这里插入图片描述

index.js 修改对应部分

const routes=[{path:'/',component:()=>import("@/components/Demo1.vue")}, // 2.导入路由组件{path:'/demo2',component:()=>import("cop/Demo2.vue")},{path:'/user/:id/:name?',component:()=>import("cop/user.vue")}//加?表示name值不是必须
]

./components/user.vue

<template><h3>user</h3>
<p>id: {{$route.params.id}}</p>
<p>name: {{$route.params.name}}</p>
</template>
<script>
</script>

4. router-link,定义别名,定义路由名称,编程式导航

在这里插入图片描述

在index.js里 修改对应部分

const routes=[{path:'/',alias:["/home","/index"],//定义别名为home或index,可以xxx/home访问component:()=>import("@/components/Demo1.vue")}, {path:'/demo2',component:()=>import("cop/Demo2.vue")},{path:'/user/:id/:name?',name:"member",//定义路由名称,路径显示还是path或aliascomponent:()=>import("cop/user.vue")}//加?表示name值不是必须
]

Demo1.vue

<template><h3>Demo1</h3><router-link to="/Demo2?id=999">查询字符串传参</router-link><br><router-link to="/user/007/tom">路径传参</router-link><br><router-link :to="{path:'/Demo2',query:{id:333}}">查询字符串传参-动态属性绑定</router-link><br><router-link :to="{name:'member',params:{id:334,name:'tim'}}">路径传参-动态属性绑定</router-link><br><button @click="goTo()">编程式导航</button></template><script setup>import {useRouter} from 'vue-router'const router=useRouter()const goTo=()=>router.push('/Demo2?id=888')</script>

5. 嵌套路由结合共享组件

在这里插入图片描述

index.js 修改对应部分

const routes=[{path:'/',// xxx/alias:["/home","/index"],//定义别名为home,可以xxx/home访问component:()=>import("cop/Father.vue"),children:[//实现路由嵌套{path:'Child',// xxx/Child或xxx/index/Childcomponent:()=>import("cop/Child.vue")}]}
]

Demo1.vue,Demo2.vue和Child.vue参照下面格式

<template><h3>Demo1</h3></template>  

Father.vue

<template><h3>Father</h3><Demo1 /><Demo2 /><router-view />
</template>
<script setup>
import Demo1 from './Demo1.vue' //共享组件
import Demo2 from './Demo2.vue'
</script>

6. 重定向

index.js 修改对应部分

const routes=[{path:'/',component:()=>import("cop/Demo1.vue"),},{path:'/demo1',redirect:"/" // xxx/demo1重定向到xxx///redirect:{name:'member',params:{id:334,name:'tim'}} //还可以传编程式导航对象}
]

7. 全局前置守卫 router.beforeEach

main.js里

import { createApp } from 'vue'
import App from './App.vue'
import ElementPlus from 'element-plus'
import 'element-plus/dist/index.css'
import router from './router'const app = createApp(App)
app.use(ElementPlus)
app.use(router)//全局前置守卫
router.beforeEach((to,from,next)=>{console.log('to:',to)console.log('from:',from)if(to.name=='member'){next(false)//拦截访问路由}else{next()//继续}
})app.mount("#app")

5. vuex

​ Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式 + 库。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。

在这里插入图片描述

状态说明
state在vuex中state中定义数据,可以在任何组件中进行调用。this.$store.state.属性名称
getters计算属性
mutations更改 Vuex 的 store 中的状态的唯一方法是提交(this.$store.commit('func')) mutation
actions异步操作 ,this.$store.dispatch('func')触发函数
modules将store分割成模块,每个模块都有自己的state,mutation,action,getters

npm install vuex@next --save

main.js

import { createApp } from 'vue'
import App from './App.vue'
import ElementPlus from 'element-plus'
import 'element-plus/dist/index.css'
import router from './router'
import store from './store'const app = createApp(App)
app.use(ElementPlus)
app.use(store)
app.mount("#app")

/src/store/index.js

import { createStore } from 'vuex'
const store=createStore({state(){//状态管理器中定义的数据源return{heave:'举起',count:0}},getters:{//相当于计算属性len(state){return state.heave.length}},mutations:{//同步操作changeCount(state,num){state.count+=numconsole.log('count的值为 ',state.count)}},actions:{//异步操作delayChangeCount(store,num){setTimeout(()=>{store.commit('changeCount',num)},3000);//延时3秒执行}},modules:{}
})
export default store

App.vue 添加

<template><p>{{ $store.state.heave }}</p><button @click="handler">点我</button>
</template>
<script>
import Demo1 from "./components/Demo1.vue"
import axios from 'axios'
export default{data(){return{}},created(){this.handler()},methods:{handler(){this.$store.commit('changeCount',1)//mutationsthis.$store.commit('changeCount',2)this.$store.commit('changeCount',3)this.$store.dispatch('delayChangeCount',10)//actionsconsole.log(this.$store.getters.len)//getters}}
}
</script>

可以在devtools看到vuex的执行。

在这里插入图片描述

至于modules的使用,需要使比如moduleA.js成为命名空间模块

const moduleA ={namespaced:true,  
//开启namespace:true,该模块就成为命名空间模块了state:{count:10,countA:888},getters:{...},mutations:{...},actions:{...}
}

然后在store/index.js里使用如下方法引入,之后使用this.$store.moduleA.state.count访问count

import moduleA from './module/moduleA.js'
import { createStore } from 'vuex'
const store = createStore({modules:{moduleA}
})
export default store

参考

30分钟学会Vue之VueRouter&Vuex 吴悠讲编程
20分钟学会Vue Router4(路由) 邓瑞编程
1天搞定SpringBoot+Vue全栈开发 刘老师教编程

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

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

相关文章

好利来做宠物蛋糕,为啥品牌争相入局宠物赛道?

2月20日&#xff0c;好利来宣布推出宠物烘焙品牌「Holiland Pet」&#xff0c;正式进军宠物烘焙市场。作为首个入局宠物烘焙领域的国内食品品牌&#xff0c;一经推出&#xff0c;就面临着各种争议&#xff0c;不管大众看法如何&#xff0c;好利来进军宠物市场&#xff0c;也让宠…

后台组件-语言包

<groupId>org.qlm</groupId><artifactId>qlm-language</artifactId><version>1.0-SNAPSHOT</version> 平台提供多语言支持&#xff0c;以上为语言包&#xff0c;提供后台多语言支持。首批实现&#xff1a; public class LanguageConstan…

Git快速上手二

对Git命令的深入理解快速上手Git&#xff08;包含提交至GitHub和Gitee&#xff09;-CSDN博客 1.5 分支操作 1.5.1 分支原理 系统上线后,又要修改bug,又要开发新的功能。 由于新功能没有开发完,所以需要建立分支,一边修改bug,一边开发新功能,最终合并. 1.5.2 分支实操 创建…

Java基于微信小程序的旅游出行必备小程序,附源码

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

第三百八十六回

文章目录 概念介绍使用方法示例代码 我们在上一章回中介绍了Snackbar Widget相关的内容,本章回中将介绍TimePickerDialog Widget.闲话休提&#xff0c;让我们一起Talk Flutter吧。 概念介绍 我们在这里说的TimePickerDialog是一种弹出窗口&#xff0c;只不过窗口的内容固定显示…

18.网络游戏逆向分析与漏洞攻防-网络通信数据包分析工具-数据分析工具数据与消息配置的实现

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 上一个内容&#xff1a;17.数据分析工具配置功能的实现 码云地址&#xff08;master 分支&#xff09;&#xff1a;https://gitee.com/dye_your_fingers/titan…

于建筑外窗遮阳系数测试的太阳光模拟器模拟太阳光照射房屋视频

太阳光模拟器是一种用于测试建筑外窗遮阳系数的高科技设备。它能够模拟太阳光照射房屋的情景&#xff0c;帮助建筑师和设计师更好地了解建筑外窗的遮阳性能&#xff0c;从而提高建筑的能源效率和舒适度。 这种模拟器的工作原理非常简单&#xff0c;它通过使用高亮度的光源和精密…

Positional Encoding 位置编码

Positional Encoding 位置编码 flyfish Transformer模型没有使用循环神经网络&#xff0c;无法从序列中学习到位置信息&#xff0c;并且它是并行结构&#xff0c;不是按位置来处理序列的&#xff0c;所以为输入序列加入了位置编码&#xff0c;将每个词的位置加入到了词向量中…

Netty之WebSocket协议开发

一、WebSocket产生背景 在传统的Web通信中&#xff0c;浏览器是基于请求--响应模式。这种方式的缺点是&#xff0c;浏览器必须始终主动发起请求才能获取更新的数据&#xff0c;而且每次请求都需要经过HTTP的握手和头部信息的传输&#xff0c;造成了较大的网络开销。如果客户端…

爆肝!Claude3与ChatGPT-4到底谁厉害,看完你就知道了!

前言&#xff1a; 相信大家在pyq都被这张图片刷屏了把~ 昨天&#xff0c;为大家介绍了一下什么是Claude&#xff0c;今天咱终于弄到号了&#xff08;再被ban了3个号之后终于是成功的登上去了&#xff0c;如果各位看官觉得咱文章写的不错&#xff0c;麻烦点个小小的关注~你们的…

【详识C语言】自定义类型之三:联合

本章重点 联合 联合类型的定义 联合的特点 联合大小的计算 联合&#xff08;共用体&#xff09; 联合类型的定义 联合也是一种特殊的自定义类型 这种类型定义的变量也包含一系列的成员&#xff0c;特征是这些成员公用同一块空间&#xff08;所以联合也叫共用体&#xff09;…

mysql 数据库查询 查询字段用逗号隔开 关联另一个表并显示

文章目录 问题描述解决方案 问题描述 如下如所示&#xff1a; 表一&#xff1a;wechat_dynamically_config表&#xff0c;重点字段&#xff1a;wechat_object 表二&#xff1a;wechat_object表&#xff0c;重点字段&#xff1a;wxid 需求&#xff1a;根据wechat_dynamically_…

模仿Gitee实现站外链接跳转时进行确认

概述 如Gitee等网站&#xff0c;在有外部链接的时候如果不是同域则会出现一个确认页面。本文就带你看看这个功能应该如何实现。 效果 实现 1. 实现思路 将打开链接作为参数传递给一个中间页面&#xff0c;在页面加载的时候判断链接的域名和当前网站是否同域&#xff0c;同域…

Redis线程模型解析

引言 Redis是一个高性能的键值对&#xff08;key-value&#xff09;内存数据库&#xff0c;以其卓越的读写速度和灵活的数据类型而广受欢迎。在Redis 6.0之前的版本中&#xff0c;它采用的是一种独特的单线程模型来处理客户端的请求。尽管单线程在概念上似乎限制了其扩展性和并…

软考65-上午题-【面向对象技术】-面向对象分析、设计、测试

一、面向对象分析OOA 1-1、面向对象分析的定义 面向对象分析的目的&#xff1a;为了获得对应用问题的理解。理解的目的是确定系统的功能、性能要求。 面向对象分析包含5个活动&#xff1a;&#xff08;背&#xff01;&#xff09; 认定对象&#xff1b;&#xff08;重要一点…

QT和OPENGL安装和集成

1.QT安装 1.1官网下载&#xff1a; 网址&#xff1a;https://download.qt.io/archive/qt/ 1.2 开始安装 点击运行 首先注册sign up 然后Login in 选择安装目录 改为D盘&#xff1a; 选择安装项&#xff1a; 准备安装 开始安装&#xff1a; 安装完成&#xff1a; 1.3测试 …

SPI 接口

SPI 接口 SPI 简介寻址方式通信过程极性和相位IIC 和 SPI 的异同相同点不同点 SPI 简介 SPI&#xff08;Serial Peripheral Interface&#xff09;是串行外设接口的缩写&#xff0c;SPI是一种高速的、全双工、同步的串行通信总线&#xff1b;SPI采用主从方式工作&#xff0c;一…

UART 接口

UART 接口 1. UART 协议原理与编程1.1 UART 简介1.2 UART 帧格式1.3 UART 缺点1.4 Verilog 代码 2. RS232、RS485 协议原理2.1 RS232 协议简介2.1.1 RS232 接口2.1.2 RS232 信号2.1.3 RS232 缺点 2.2 RS4852.2.1 RS485协议简介2.2.2 RS458 信号2.2.3 RS458 接口2.2.4 RS485 优点…

Cocos Creator 3.8.x 制作模糊效果(比如游戏弹窗需要的模糊效果)

接着上一个讨论的话题,关于3.8.x的后效,今天来分享自定义后效来制作模糊效果,并将他应用到弹窗中做背景,话不多说开整。 一:最终效果 首先咱们来看官网自定义后效怎么搞的,从它的实例开始:自定义后效 二:定义PostProcessSettings给节点提供资源(通过编辑器修改参数的…

搭建Zabbix监控系统

简介 在企业网络运维过程中&#xff0c;管理员必须随时关注各服务器和网络的运行状况&#xff0c;以便及时发现问题.尽可能减少故障的发生。当网络中的设备,服务器等数量较多时&#xff0c;为了更加方便、快捷地获得各种监控信息&#xff0c;通常会借助于一些集中监测软件。 一…