vue-cli 创建vue3项目

文章目录

          • 一、环境准备
          • 二、核心组件
            • 2.1. axios封装
            • 2.2. vuex
            • 2.3. vue-router

一、环境准备

前提:

# 安装node环境
node -v
npm -v# 卸载旧脚手架工具
npm uninstall vue-cli -g
or
yarn global remove vue-cli# 安装新版的脚手架工具 指定版本@vue/cli@版本号
npm install -g @vue/cli

创建项目

vue create vue3

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Vue CLI v4.5.14
┌─────────────────────────────────────────────┐
│                                             │
│    New version available 4.5.14 → 4.5.15    │
│   Run yarn global add @vue/cli to update!   │
│                                             │
└─────────────────────────────────────────────┘
// 1.手工模式
? Please pick a preset: Manually select features
// 2.安装 Router, Vuex, CSS 插件
? Check the features needed for your project: Choose Vue version, Babel, Router, Vuex, CSS Pre-processors, Linter
// 3. vue3.x版本
? Choose a version of Vue.js that you want to start the project with 3.x
// 4. 选择hash模式 默认历史模式
? Use history mode for router? (Requires proper server setup for index fallback in production) No
// 5. 选择css插件Sass/SCSS
? Pick a CSS pre-processor (PostCSS, Autoprefixer and CSS Modules are supported by default): Sass/SCSS (with dart-sass)
// 6. 格式化配置祖安泽标准
? Pick a linter / formatter config: Standard
? Pick additional lint features: Lint on save
? Where do you prefer placing config for Babel, ESLint, etc.? In dedicated config files
// 7. 不保存为模板,立即创建项目
? Save this as a preset for future projects? (y/N) n
二、核心组件
2.1. axios封装

安装 axios
使用axios发送ajax请求

npm install axios --save

utils/request.js

import axios from 'axios'const instance = axios.create({baseURL: 'https://www.fastmock.site/mock/ae8e9031947a302fed5f92425995aa19/jd',timeout: 10000
})export const get = (url, params = {}) => {return new Promise((resolve, reject) => {instance.get(url, { params }).then((response) => {resolve(response.data)}, err => {reject(err)})})
}export const post = (url, data = {}) => {return new Promise((resolve, reject) => {instance.post(url, data, {headers: {'Content-Type': 'application/json'}}).then((response) => {resolve(response.data)}, err => {reject(err)})})
}

后续更新集成请求拦截和响应拦截+模块单独api

案例:获取博文发布作者姓名

<template><div class="about"><h1 @click="handleClick">This is an about page</h1><button @click="getBlogData">获取博文数据</button></div><div>{{ name }}</div>
</template>
<script>
import { toRefs } from 'vue';
import { useStore } from 'vuex';
export default {name: 'about',setup() {const store = useStore();// 从store.state把name解构出来const { name } = toRefs(store.state);const handleClick = () => {// 异步修改数据store.dispatch('getData', 'hello aync');// 同步修改数据// store.commit('changeName', 'hello2');};const getBlogData = () => {store.dispatch('getBlogData');};return { name, handleClick, getBlogData };},
};
</script>

大家可以直接使用我的调用测试地址,自己的地址会有跨域问题

import { createStore } from 'vuex';
import axios from 'axios';
// VueX 数据管理框架
// VueX 创建一个全局唯一的仓库,用来全局的数据
export default createStore({state: {name: 'dell',},mutations: {changeName(state, val) {state.name = val;},},actions: {// 异步逻辑getBlogData(store) {axios.get('https://www.fastmock.site/mock/a4701044176a98816d53ce26897cdd3b/api/hxq').then((res) => {console.log(res);const name = res.data.name;store.commit('changeName', name);});},// 修改名字getData(store, val) {setTimeout(() => {store.commit('changeName', val);}, 2000);},},modules: {},
});

后期,api接口具体调用会api目录下的模块具体的xx.js中,然后在,store的index模块的actions下面调用此方法即可

2.2. vuex

store/index.js

VueX 数据管理框架
VueX 创建一个全局唯一的仓库,用来全局的数据,一处修改,全局立即生效
数据声明和数据获取使用:数据放到state里面
通过计算属性获取到数据
computed: {myName() {return this.$store.state.name;}}数据修改
声明一个事件
触发一个/*** 1.dispatch方法,派发一个action,名字叫做change* 2.vuex中actions就会感知到change 这个action,执行store中actions下面change的方法(在actions中的方法不能直接修改数据,必须通过提交一个commit发送请求)* 3.在actions下面change的方法内部,提交一个commit 叫做change的数据改变方法* 4.mutation 感知到提交的mutation改变,执行change方法,改变数据* 5.*/state中的数据只能在mutations中去修改mutation只执行同步的代码逻辑actions中写异步的逻辑(不做数据修改具体操作,只是发送commit请求)如果不需要异步操作:也可以this.$store.commit('change', 'hello word');mutations下的change方法也会感知到,直接修改数据dispatch是和actions做关联的commit是和mutations做关联的一般  mutations中封装同步代码actions封装异步代码

传统方式使用

import { createStore } from 'vuex';
// VueX 数据管理框架
// VueX 创建一个全局唯一的仓库,用来全局的数据
export default createStore({state: {name: 'dell',},mutations: {//  第4步,对应的mutation 被执行change(state, val) {//  第5步,在mutation里面修改数据state.name = val;},},actions: {// 第2步,store感知到你触发一个change的action,执行change方法change(store, val) {// 第3步,提交一个commit 触发一个mutationsetTimeout(() => {store.commit('change', val);}, 2000);},},modules: {},
});

about.vue

<template><div class="about"><h1 @click="handleClick">This is an about page</h1><div>{{ myName }}</div></div>
</template>
<script>
export default {name: 'about',computed: {myName() {return this.$store.state.name;},},methods: {handleClick() {/*** 1.dispatch方法,派发一个action,名字叫做change* 2.感知change 这个action,执行store中actions下面change的方法* 3.commit 提交一个叫做change的数据改变* 4.mutation 感知到提交的mutation改变,执行change方法,改变数据* 5.*/this.$store.commit('change', 'hello word');//  this.$store.dispatch('change', 'hello word');},},
};
</script>

compositionAPI方式
从vuex中引入useStore函数,获取全局数据对象

然后通过useStore获取Store,使用commit调用同步方法改数据

使用dispatch调用异步方法改数据

import { createStore } from 'vuex';
// VueX 数据管理框架
// VueX 创建一个全局唯一的仓库,用来全局的数据
export default createStore({state: {name: 'dell',},mutations: {changeName(state, val) {console.log;val;state.name = val;},},actions: {// 异步逻辑getData(store, val) {setTimeout(() => {store.commit('changeName', val);}, 2000);},},modules: {},
});

about.vue

<template><div class="about"><h1 @click="handleClick">This is an about page</h1></div><div>{{ name }}</div>
</template>
<script>
import { toRefs } from 'vue';
import { useStore } from 'vuex';
export default {name: 'about',setup() {const store = useStore();// 从store.state把name解构出来const { name } = toRefs(store.state);const handleClick = () => {// 异步修改数据store.dispatch('getData', 'hello aync');// 同步修改数据// store.commit('changeName', 'hello2');};return { name, handleClick };},
};
</script>
2.3. vue-router
import { createRouter, createWebHashHistory } from 'vue-router'const routes = [{path: '/',name: 'Home',component: () => import(/* webpackChunkName: "home" */ '../views/home/Home')},{path: '/cartList',name: 'CartList',component: () => import(/* webpackChunkName: "cartList" */ '../views/cartList/CartList')},{path: '/orderConfirmation/:id/:addressId?',name: 'OrderConfirmation',component: () => import(/* webpackChunkName: "orderConfirmation" */ '../views/orderConfirmation/OrderConfirmation')}, {path: '/orderList',name: 'OrderList',component: () => import(/* webpackChunkName: "orderList" */ '../views/orderList/OrderList')},{path: '/shop/:id',name: 'Shop',component: () => import(/* webpackChunkName: "shop" */ '../views/shop/Shop')}, {path: '/register',name: 'Register',component: () => import(/* webpackChunkName: "register" */ '../views/register/Register'),beforeEnter(to, from, next) {const { isLogin } = localStorage;isLogin ? next({ name: 'Home'}):  next();}}, {path: '/login',name: 'Login',component: () => import(/* webpackChunkName: "login" */ '../views/login/Login'),beforeEnter(to, from, next) {const { isLogin } = localStorage;isLogin ? next({ name: 'Home'}):  next();}}, {path: '/chooseAddressList/:shopId',name: 'ChooseAddressList',component: () => import(/* webpackChunkName: "chooseAddressList" */ '../views/chooseAddressList/ChooseAddressList'),},{path: '/myAddressList',name: 'MyAddressList',component: () => import(/* webpackChunkName: "myAddressList" */ '../views/myAddressList/MyAddressList'),}, {path: '/upsertAddress/:id?',name: 'UpsertAddress',component: () => import(/* webpackChunkName: "upsertAddress" */ '../views/upsertAddress/UpsertAddress'),}, {path: '/person',name: 'PersonalInfo',component: () => import(/* webpackChunkName: "person" */ '../views/personalInfo/PersonalInfo'),}
]const router = createRouter({history: createWebHashHistory(),routes
})router.beforeEach((to, from ,next) => {const { isLogin } = localStorage;const { name } = to;const isLoginOrRegister = (name === "Login" || name === "Register");(isLogin || isLoginOrRegister) ? next() : next({ name: 'Login'});
})export default router
<template><router-view />
</template><script>
export default {name: 'App',
}
</script>

参数传递

,{path: '/shop/:id',name: 'Shop',component: () => import(/* webpackChunkName: "shop" */ '../views/shop/Shop')}

参数接收

<template><div class="wrapper"><div class="title"><divclass="iconfont title__back"@click="handleBackClick">&#xe6f2;</div><div class="title__text">管理收货地址</div><div class="title__add" @click="handleAddClick">新建</div></div><Addressv-for="address in addressList":key="address._id":address="address"@click="() => handleUpdateClick(address._id)"/></div>
</template><script>
import Address from '../../components/Address'
import useCommonAddressEffect from '../../effects/addressEffect'import { toRefs } from 'vue'
import { useStore } from 'vuex'
import { useRouter } from 'vue-router'export default {name: 'MyAddressList',components: { Address },setup() {const store = useStore()const router = useRouter()const { addressList } = toRefs(store.state)const { getAddressList } = useCommonAddressEffect()getAddressList(true)const handleBackClick = () => { router.back() }const handleAddClick = () => { router.push({ name: 'UpsertAddress'}) }const handleUpdateClick = (addressId)=> {router.push(`/upsertAddress/${addressId}`)}return { addressList, handleBackClick, handleAddClick, handleUpdateClick }}
}
</script><style lang="scss" scoped></style>

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

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

相关文章

Excel VBA 处理图形图表详解

目录 一. 图表各元素在VBA中的表达方式1. 图表区2. 绘图区3. 数据系列4. 图表轴5.网格线6、数据标签7. 图表标题、图例和数据表8. 趋势线和误差线二. 图表类型三. VBA图表常用命令1. 获取工作表的行数2. 使用工作表函数检查 A1单元格中的数据是否为数字:3. 激活单元格区域 A 列…

Jquery 日期组件

项目开源地址&#xff1a;https://gitee.com/gblfy/date-field

十六进制、RGB 与 VBA颜色值对照表

十六进制、RGB 与 VBA颜色值对照表 颜色名称 RGB颜色 十六进制颜色代码 VBA颜色代码 颜色效果 黑色0,0,0#000000&H000000象牙黑41,36,33#292421&H212429灰色192,192,192#C0C0C0&HC0C0C0

利用 VBA 和 HTML自制兼容 WPS及 EXCEL(32位/64位)的颜色选择器

效果&#xff1a; 选择器参考网友一个且里面还残缺不全的半拉子工程方案进行了完善和改进。 技术方案&#xff1a; VBA HTML 实现的具体功能&#xff1a; 画VBA窗体时&#xff0c;非常方便地查看VBA颜色值&#xff08;如上图&#xff09;&#xff1b;默认颜色&#xff1a;有…

Apollo 分布式配置中心 搭建篇

文章目录一、介绍1. 痛点2. 为什么选择Apollo二、快速开始2.1. 安装mysql2.2. 下载脚本2.3. 初始化脚本三、服务端配置3.1. 下载安装包3.2. 创建目录3.3. 解压3.4. 配置3.5. 启动3.6. 防火墙策略3.6. 效果验证四、测试4.1. 引入依赖4.2. 配置4.3. 测试类4.4. 启动项目4.5. 效果…

VBA FSO 对象模型知识点梳理

目录 一. FSO-文件系统对象1.1 FSO的用途1.2 FSO 对象模型所包含的对象1.3 FSO对象的创建1.4 FSO对象属性示例二 FSO 中的方法和属性2.1 属性2.2 方法2.2.1 BuildPath 方法2.2.2 FileExists 方法2.2.3 GetFile 方法2.2.4 GetFileName 方法2.2.5

VBA GetOpenFilename 方法

目录 一. 作用二. 语法三. 参数说明四. 用法示例GetOpenFilename方法 一. 作用 显示标准的 “ 打开 ” 对话框,获取 用户 文件名,而 不必真正打开 任何文件。 二. 语法 expression.GetOpenFilename(FileFilter, FilterIndex, Title, ButtonText, MultiSelect)

docker Redis集群

文章目录1. 创建redis网卡2. 创建redis配置3. 启动redis集群4. 创建集群5. 记录与调试6. 故障转移1. 创建redis网卡 # 删除容器 docker rm -f ${docker ps -aq}# 创建redis网卡 docker network create redis --subnet 172.38.0.0/16# 删除redis网卡 docker network rm redis# …

VBA 用 Environ 获取系统环境变量

目录 1. VBA Environ系统环境变量:2. 利用 VBA 获得系统所有环境变量1. VBA Environ系统环境变量: 返回 Windows 目录: Environ ("Windir") 返回应用程序文件夹: Environ ("ProgramFiles") 返回用户配置文件目录:

关于 VBA Erase() 函数清空数组

目录 1. 关于 Erase() 函数1.1 作用1.2 语法1.3 说明1.4 示例1.4.1 示例一1.4.2 示例二1. 关于 Erase() 函数 1.1 作用 重新初始化大小固定的数组的元素,以及释放动态数组的存储空间。它的行为取决于数组的类型(见 1.3 )。 1.2 语法 Erase arraylist所需的 arraylist 参…

Excel 表单控件之 CheckBox 集合事件响应

示例代码: Sub CheckClick()Dim check As CheckBoxSet check = Sheet1.CheckBoxes(Application.Caller)If check.Value = 1 ThenSheet1.Range("a1").Value =

VBA 自制 TreeView 树视图,附加控件 TreeView 最优替代方案

目录 一. Treeview Demo1.1 概述1.2 按钮说明1.3 TreeView 事件说明二. Instructions - 使用说明2.1 Excel 用户2.1.1 常规使用2.1.2 开发大型 TreeView 的技巧2.2 Word 和 Access 用户2.2.1 Access 实现三. 类模块3.1 类模块一:clsTreeView3.2 类模块二:clsNode三. 版本历史…

VBA 精选示例代码库

目录 1. 厘米&英寸&像素&Point 的转换2. 固定滚动区域3. 按特定数量的行、列或页滚动3.1 `Window.SmallScroll` 方法:按行或按列滚动窗口内容3.2 `Window.LargeScroll` 方法:按页滚动窗口内容4. 工作簿 VBA 属性和操作4.1 按名称引用工作簿4.2 按状态引用工作簿4…

Excel 宏工作簿 VBAProject 工程保护 - 代码不可查看

目录 一. VBAProject 工程保护二. VBA工程不可查看一. VBAProject 工程保护 该功能由 Excel 官方提供,用于对 VBA 代码加以密码保护,具体设置方法如下动态图所示: 但是这个方法的缺点非常明显,随便一个工具就能轻松消除密码或免密查看。 二. VBA工程不可查看 接触 VBA 比…

比较 Excel 中两列的差异,并用箭头标识和指向匹配结果

目录 1. 简介 - 比较两个 Excel 列2. 示例 - 比较两个列3. 绘制比较结果箭头标识3.1 绘制箭头的宏3.2 清除表格中的箭头的宏3.3 绘制箭头过程调用1. 简介 - 比较两个 Excel 列 查找两个 excel 列之间的差异。 通过遍历未知长度和未知顺序的列,将较长的列表与较短的列表进行比…

SSL/TLS协议信息泄露漏洞(CVE-2016-2183)【原理扫描】 服务器支持 TLS Client-initiated 重协商攻击(CVE-2011-1473)【原理扫描】

netstat -apn | grep 41148 ps -ef | grep 2376 netstat -apn | grep 41148二、Linux 1、查询8080端口是否被占用&#xff0c;并可以查看pid/程序名 netstat -apn | grep 8080Q2、查看详细信息 ps -ef | grep PID3、终止该进程kill -9 PID

使用Istio进行多集群部署管理:单控制平面 Gateway 连接拓扑

作者 | 王夕宁 阿里巴巴高级技术专家 导读&#xff1a;本文摘自于由阿里云高级技术专家王夕宁撰写的《Istio 服务网格技术解析与实践》一书&#xff0c;讲述了如何使用 Istio 进行多集群部署管理来阐述服务网格对多云环境、多集群即混合部署的支持能力。 前文详情&#xff1a;…

如何轻松学习 Kubernetes?

作者 | 声东 阿里巴巴技术专家 <关注阿里巴巴云原生公众号&#xff0c;回复 排查 即可下载电子书> 导读&#xff1a;《深入浅出 Kubernetes》一书共汇集 12 篇技术文章&#xff0c;帮助你一次搞懂 6 个核心原理&#xff0c;吃透基础理论&#xff0c;一次学会 6 个典型问…

JavaScript 常用代码整理

目录 1.获取浏览器Cookie的值2. 颜色RGB转十六进制3. 复制到剪贴板4. 检查日期是否合法5. 查找日期位于一年中的第几天6. 英文字符串首字母大写7. 计算2个日期之间相差多少天8. 清除全部Cookie9. 生成随机十六进制颜色10. 数组去重11. 从 URL 获取查询参数12. 时间处理13. 校验…

《阿里云互联网多媒体存储解决方案蓝皮书》震撼上线!

前言 中国互联网从1994年正式接入国际网络至今&#xff0c;以非凡的力量改变了世界&#xff0c;重新塑造了商业、政治、社会&#xff0c;甚至改变了全球几十亿的人的生活。 中国互联网络信息中心&#xff08;CNNIC&#xff09;第45次《中国互联网络发展状况统计报告》中显示&a…