编辑推荐: |
本文主要介绍了前端工程化(vue3)相关知识。希望对您的学习有所帮助。
本文来自于csdn,由火龙果软件linda编辑、推荐。 |
|
一、概述
前端工程化 是使用 软件工程的方法 来 单独 解决 前端 的开发流程中 模块化、组件化、规范化、自动化
的问题,其主要目的为了提高效率和降低成本。
前端工程化实现的技术栈有很多,我们采用 es6 nodejs npm vite vue3 router pinia axios element-plus
组合来实现
ecmascript6 vue3中大量使用es6语法
nodejs 前端项目运行环境
npm 依赖下载工具
vite 前端项目构建工具
vue3 优秀的渐进式前端框架
router 通过路由实现页面切换
pinia 通过状态管理实现组件数据传递
axios ajax异步请求封装技术实现前后端数据交互
element-plus 可以提供丰富的快速构建网页的组件仓库 二、ecma6script
ecmascript 6,简称es6,是javascript语言的一次重大更新。它于2015年发布,是原来的ecmascript标准的第六个版本。es6带来了大量的新特性,包括箭头函数、模板字符串、let和const关键字、解构、默认参数值、模块系统等等 2.1 es6的变量和模板字符串
es6 新增了 let 和 const ,用来声明变量,使用的细节上也存在诸多差异
let 和var的差别:let 与 java中变量的定义类似
let不能重复声明
let有块级作用域,非函数的花括号遇见let会有块级作用域,也就是只能在花括号里面访问
let不会预解析进行变量提升
let定义的全局变量不会作为window的属性
let在es6中推荐优先使用
const和var的差异:const 与 java 中被 final 变量类似
模板字符串(template string)是增强版的字符串,用反引号(`)标识,会原样记录字符串,可以使用
${xxx} 形式输出变量和拼接变量
const times = '3次';
let str = `${times}
够不够?`;
console.log(str);
|
2.2 es6的解构表达式
let [a, b, c] = [1, 2, 3];
let {a, b} = {a: 1, b: 2};
function add([x, y]) {
return x y;
}
add([1, 2]);
|
2.3 es6的箭头函数
函数声明
let fn1 = function(){}
let fn2 = ()=>{}
let fn3 = x =>{}
let fn4 = x => console.log(x)
let fun5 = x => x 1
|
使用特点:箭头函数this关键字
在 javascript 中,this 关键字通常用来引用函数所在的对象,或者在函数本身作为构造函数时,来引用新对象的实例。但是在箭头函数中,this
的含义与常规函数定义中的含义不同,是由箭头函数定义时的上下文来决定的,而不是由函数调用时的上下文来决定的。箭头函数没有自己的this,this指向的是外层上下文环境的this
let person ={
name:"张三",
showname:function (){
console.log(this)
console.log(this.name)
},
viewname: () =>{
console.log(this)
console.log(this.name)
}
}
person.showname()
person.viewname()
function counter() {
this.count = 0;
window.setinterval(() => {
this.count;
console.log(this.count);
}, 1000);
}
let counter = new counter();
|
2.4 rest和spread
rest参数,在形参上使用和java中的可变参数几乎一样
let fun = (...args) =>{console.log(args)}
|
spread参数,在函数调用实参上使用rest;还可以快速合并数组或者对象
let a = [1,2,3];
fun(...a);
let a = [1,2,3];
let b = [4,5,6];
let c = [...a,...b];
let a = { x: 'm', y: 'h'};
let b = { y: 'n'};
let c = {...a, ...b};
|
2.5 es6的对象创建和拷贝
es6中新增了对象创建的语法糖,支持了class extends constructor等关键字,让es6的语法和面向对象的语法更加接近
class person{
#n;
age;
get name(){
return this.n;
}
set name(n){
this.n =n;
}
eat(food){
console.log(this.age"岁的"this.n"用筷子吃"food)
}
static sum(a,b){
return ab;
}
constructor(name,age){
this.n=name;
this.age = age;
}
}
let person =new person("张三",10);
console.log(person.name)
console.log(person.n)
person.name="小明"
console.log(person.age)
person.eat("火锅")
console.log(person.sum(1,2))
class student extends person{
grade ;
score ;
study(){
}
constructor(name,age ) {
super(name,age);
}
}
let stu =new student("学生小李",18);
stu.eat("面条")
|
深拷贝
let arr =['java','c','python'];
let person ={
name:'张三',
language:arr
};
let person2 = json.parse(json.stringify(person));
|
2.6 es6的模块化处理
目前,前端模块化有多种规范和实现,包括 commonjs、amd 和 es6 模块化。es6 模块化是
javascript 语言的模块标准,使用 import 和 export 关键字来实现模块的导入和导出。现在,大部分浏览器都已经原生支持
es6 模块化,因此它成为了最为广泛使用的前端模块化标准.
es6模块化的几种暴露和导入方式
分别导出:对每个需要导出的变量或方法前加 export,如 export pi
统一导出:模式适用 export 并将需要导出变量或方法放入 export 大括号内,如 export
{ a, b ,c }
默认导出:export default pi 一个文件中只能写一个,代表默认的导出对象
es6中无论以何种方式导出,导出的都是一个对象,导出的内容都可以理解为是向这个对象中添加属性或者方法
导入:
import * as m1 from './module.js'
import {pi ,person ,sum,pi as pi,person as people,sum as add} from './module.js'
import {default as add} from './module.js'
import add2 from './module.js'
|
三、前端工程化环境搭建 3.1 node.js
node.js 相对 js 而言相当于java的虚拟机。node.js 是一个基于 chrome v8
引擎的 javascript 运行时环境,可以使 javascript 运行在服务器端。使用 node.js,可以方便地开发服务器端应用程序,如
web 应用、api、后端服务,还可以通过 node.js 构建命令行工具等。node.js 底层用
c 编写,运行速度快。node.js是单线程,但是采用了事件驱动、异步 i/o 模型,可以处理高并发请求。
在 node.js 中,我们可以使用 javascript 来编写服务器端程序,这也使得前端开发人员可以利用自己已经熟悉的技能来开发服务器端程序,同时也让
javascript 成为一种全栈语言
下载与安装
打开凯发娱发com官网https://nodejs.org/en下载对应操作系统的 lts 版本。
双击安装包进行安装,安装过程中遵循默认选项即可(或者参照https://www.runoob.com/nodejs/nodejs-install-setup.html
)。安装完成后,可以在命令行终端输入 node -v 和 npm -v 查看 node.js 和 npm
的版本号。 3.2 npm
npm 相当于 java maven 的依赖管理功能。安装了上述 node.js 会自动安装 npm。
3.2.1 npm的配置
npm 安装依赖包时默认使用的是官方源,由于国内网络环境的原因,有时会出现下载速度过慢的情况。为了解决这个问题,可以配置使用阿里镜像来加速
npm 的下载速度,具体操作如下:
npm config set registry https://registry.npmmirror.com
|
原:https://registry.npmjs.org/ 将替换为 https://registry.npmmirror.com
恢复官方源可执行下面语句
npm config set registry https://registry.npmjs.org/
|
配置全局依赖下载后存储位置:默认位置 <用户目录>\appdata\roaming\npm
npm config set prefix "d:\softwaredata\npmrepository"
|
查看依赖存储位置:
npm 升级命令
npm install -g npm@10.2.3
|
3.2.2 npm 常用命令
项目初始化
npm init :进入一个vscode创建好的项目中, 执行 npm init 命令后,npm 会引导您在命令行界面上回答一些问题,例如项目名称、版本号、作者、许可证等信息,并最终生成一个package.json
文件。package.json信息会包含项目基本信息,类似maven的pom.xml
npm init -y :-y yes的意思,所有信息使用当前文件夹的默认值,不用挨个填写
安装依赖 (查看所有依赖地址 https://www.npmjs.com )
npm install 包名 或者 npm install 包名@版本号 :安装包或者指定版本的依赖包(安装到当前项目中)
npm install -g 包名 :安装全局依赖包(安装到 d:\softwaredata\npmrepository
)则可以在任何项目中使用它,而无需在每个项目中独立安装该包
npm install :安装package.json中的所有记录的依赖
升级依赖
npm update 包名 :将依赖升级到最新版本
卸载依赖
npm uninstall 包名
查看依赖
npm ls :查看项目依赖
npm list -g :查看全局依赖
运行命令
npm run :执行 npm 脚本时使用的命令。npm 脚本是一组在 package.json 文件中定义的可执行命令。npm
脚本可用于启动应用程序,运行测试,生成文档等,还可以自定义命令以及配置需要运行的脚本。
在 package.json 文件中,scripts 字段是一个对象,其中包含一组键值对,键是要运行的脚本的名称,值是要执行的命令。
scripts 对象包含 start、test 和 build 三个脚本。当您运行 npm run
start 时,将运行 node index.js,并启动应用程序。同样,运行 npm run test
时,将运行 jest 测试套件,而 npm run build 将运行 webpack 命令以生成最终的构建输出 四、vue3简介和快速体验
vue (发音为 /vjuː/,类似 view) 是一款用于构建用户界面的 javascript 框架。它基于标准
html、css 和 javascript 构建,并提供了一套声明式的、组件化的编程模型,帮助你高效地开发用户界面。无论是简单还是复杂的界面,vue
都可以胜任。凯发娱发com官网为: https://cn.vuejs.org/
vue的两个核心功能:
声明式渲染:vue 基于标准 html 拓展了一套模板语法,使得我们可以声明式地描述最终输出的 html
和 javascript 状态之间的关系
响应性:vue 会自动跟踪 javascript 状态并在其发生变化时响应式地更新 dom
vue3快速体验(非工程化方式)
doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta http-equiv="x-ua-compatible" content="ie=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>documenttitle>
head>
<body>
<script src="https://unpkg.com/vue@3/dist/vue.global.js">script>
<div id="app">
<h1 v-bind:style="colorstyle">{{headline}}h1>
<p v-text="article">p>
<input v-bind:type ="inputtype" value="hellovue3"> <br>
<button @click="sayhello()">hellobutton>
div>
<script>
const app = vue.createapp({
setup(){
let inputtype ='text'
let headline ='hello vue3'
let article ='vue is awesome'
let colorstyle ={'color':'red'}
let sayhello =()=>{
alert("hello vue")
}
return {
inputtype,
headline,
article,
colorstyle,
sayhello
}
}
});
app.mount("#app");
script>
body>
html>
|
五、vue3通过vite实现工程化
5.1 vite 简介
vite作用相当于 java 中 maven 的项目管理功能。
vite 旨在利用生态系统中的新进展解决前端项目管理问题:浏览器开始原生支持 es 模块,且越来越多
javascript 工具使用编译型语言编写。https://cn.vitejs.dev/guide/why.html前端工程化的作用包括但不限于以下几个方面:
快速创建项目:使用脚手架可以快速搭建项目基本框架,避免从零开始搭建项目的重复劳动和繁琐操作,从而节省时间和精力。
统一的工程化规范:前端脚手架可以预设项目目录结构、代码规范、git提交规范等统一的工程化规范,让不同开发者在同一个项目上编写出风格一致的代码,提高协作效率和质量。
代码模板和组件库:前端脚手架可以包含一些常用的代码模板和组件库,使开发者在实现常见功能时不再重复造轮子,避免因为轮子质量不高带来的麻烦,能够更加专注于项目的业务逻辑。
自动化构建和部署:前端脚手架可以自动进行代码打包、压缩、合并、编译等常见的构建工作,可以通过集成自动化部署脚本,自动将代码部署到测试、生产环境等。 5.2 vite创建vue3工程化项目
项目创建:项目目录下执行命令:执行后会出现选项选择框架。选择生成后,进入项目目录,执行 npm install
npm create vite@latest
cd .\vite-project\
npm install
|
看 package.json
{
"name": "vite-project",
"private": true,
"version": "0.0.0",
"type": "module",
"scripts": {
"dev": "vite",
"build": "vite build",
"preview": "vite preview"
},
"dependencies": {
"vue": "^3.3.8"
},
"devdependencies": {
"@vitejs/plugin-vue": "^4.5.0",
"vite": "^5.0.0"
}
}
|
scripts 中即可运行选项,这里执行命令启动本地开发环境
5.3 vite vue3项目的目录结构
public/ 目录 :用于存放一些公共资源,如 html 文件、图像、字体等,这些资源会被直接复制到构建出的目标目录中。
src/ 目录 :存放项目的源代码,包括 javascript、css、vue 组件、图像和字体等资源。在开发过程中,这些文件会被
vite 实时编译和处理,并在浏览器中进行实时预览和调试。以下是src内部划分建议:
assets/ 目录:用于存放一些项目中用到的静态资源,如图片、字体、样式文件等。
components/ 目录:用于存放组件相关的文件。组件是代码复用的一种方式,用于抽象出一个可复用的
ui 部件,方便在不同的场景中进行重复使用。
layouts/ 目录:用于存放布局组件的文件。布局组件通常负责整个应用程序的整体布局,如头部、底部、导航菜单等。
pages/ 目录:用于存放页面级别的组件文件,通常是路由对应的组件文件。在这个目录下,可以创建对应的文件夹,用于存储不同的页面组件。
plugins/ 目录:用于存放 vite 插件相关的文件,可以按需加载不同的插件来实现不同的功能,如自动化测试、代码压缩等。
router/ 目录:用于存放 vue.js 的路由配置文件,负责管理视图和 url 之间的映射关系,方便实现页面之间的跳转和数据传递。
store/ 目录:用于存放 vuex 状态管理相关的文件,负责管理应用程序中的数据和状态,方便统一管理和共享数据,提高开发效率。
utils/ 目录:用于存放一些通用的工具函数,如日期处理函数、字符串操作函数等。
vite.config.js 文件:vite 的配置文件,可以通过该文件配置项目的参数、插件、打包优化等。该文件可以使用
commonjs 或 es6 模块的语法进行配置。
package.json 文件:标准的 node.js 项目配置文件,包含了项目的基本信息和依赖关系。其中可以通过
scripts 字段定义几个命令,如 dev、build、serve 等,用于启动开发、构建和启动本地服务器等操作。
vite 项目的入口为 src/main.js 文件,这是 vue.js 应用程序的启动文件,也是整个前端应用程序的入口文件。在该文件中,通常会引入
vue.js 及其相关插件和组件,同时会创建 vue 实例,挂载到 html 页面上指定的 dom
元素中。
vite的运行界面
在安装了 vite 的项目中,可以在 npm scripts 中使用 vite 可执行文件,或者直接使用
npx vite 运行它。下面是通过脚手架创建的 vite 项目中默认的 npm scripts:(package.json)
{
"scripts": {
"dev": "vite",
"build": "vite build",
"preview": "vite preview"
}
}
|
运行设置端口号:(vite.config.js)
//修改vite项目配置文件 vite.config.js
export default defineconfig({
plugins: [vue()],
server:{
port:3000
}
})
|
5.4 vite vue3项目组件(sfc入门)
什么是vue的组件?
一个页面作为整体,是由多个部分组成的,每个部分在这里就可以理解为一个组件,每个.vue文件就可以理解为一个组件,多个.vue文件可以构成一个整体页面
传统的页面有.html文件.css文件和.js文件三个文件组成(多文件组件)
vue将这文件合并成一个.vue文件(single-file component,简称 sfc,单文件组件)
.vue文件对js/css/html统一封装,这是vue中的概念 该文件由三个部分组成
|
7.3 路由传参(useroute)
路径参数:如 /showdetail/:id
路径参数首先要在 router.js 配置的路由上加上 /:参数名 表示路由参数
发送时可用路径直接发送或者使用:userouter 返回的对象调用 router.push({name:"showdetail",params:{id:id,language:language}})
接收时使用 useroute 返回的对象的 params 属性获取
键值对参数:如 /showdetail?hid=1 ,则将上述 params 替换成 query 属性即可 7.4 路由守卫
全局前置守卫:在路由切换前被调用,可以用于验证用户是否已登录、中断导航、请求数据等
全局后置守卫:在路由切换之后被调用,可以用于处理数据、操作 dom 、记录日志等
守卫代码的位置: 在 router.js 中
router.beforeeach( (to,from,next) => {
console.log(to.path,from.path,next)
if(to.path == '/index'){
next()
}else{
next('/index')
}
} )
router.aftereach((to, from) => {
console.log(`navigate from ${from.path} to ${to.path}`);
});
|
八、promise
前端中的异步编程技术,类似java中的多线程 线程结果回调
promise 是异步编程的一种凯发娱发com的解决方案,比传统的凯发娱发com的解决方案——回调函数和事件——更合理和更强大。它由社区最早提出和实现,es6将其写进了语言标准,统一了用法,原生提供了promise对象
所谓promise,简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果。从语法上说,promise
是一个对象,从它可以获取异步操作的消息。promise 提供统一的 api,各种异步操作都可以用同样的方法进行处理
promise对象有以下两个特点。
promise对象代表一个异步操作,有三种状态:pending(进行中)、resolved(已完成,又称
fulfilled)和rejected(已失败)。只有异步操作的结果,可以决定当前是哪一种状态,任何其他操作都无法改变这个状态。这也是promise这个名字的由来,它的英语意思就是“承诺”,表示其他手段无法改变。
一旦状态改变,就不会再变,任何时候都可以得到这个结果。promise对象的状态改变,只有两种可能:从pending变为resolved和从pending变为rejected。只要这两种情况发生,状态就凝固了,不会再变了,会一直保持这个结果。 8.1 基本用法
8.2 catch()
promise.prototype.catch 方法是 .then(null, rejection)
的别名,用于指定发生错误时的回调函数。
8.3 async和await的使用
async/await 是在promise基础上提供了更加直观和易于使用的语法。
async 用于标识函数
async标识函数后,async函数的返回值会变成一个promise对象
如果函数内部返回的数据是一个非promise对象,async函数的结果会返回一个成功状态 promise对象
如果函数内部返回的是一个promise对象,则async函数返回的状态与结果由该对象决定
如果函数内部抛出的是一个异常,则async函数返回的是一个失败的promise对象
await :获取一个 promise 对象的成功值,失败则会抛异常
await右侧的表达式一般为一个promise对象,但是也可以是一个其他值
如果表达式是promise对象,await返回的是promise成功的值
await会等右边的promise对象执行结束,然后再获取结果,后续代码也会等待await的执行
如果表达式是其他值,则直接返回该值
await必须在async函数中
如果await右边的promise失败了,就会抛出异常,需要通过 try … catch捕获处理 九、数据交互axios
axios 是一个基于 promise 网络请求库,作用于node.js 和浏览器中。 它是 isomorphic
的(即同一套代码可以运行在浏览器和node.js中)。在服务端它使用原生 node.js http
模块, 而在客户端 (浏览端) 则使用 xmlhttprequests。
原生javascript方式进行ajax(了解):
9.1 基本用法
使用 axios 前需先安装
使用:
response 响应数据:
{
data: {},
status: 200,
statustext: 'ok',
headers: {},
config: {},
request: {}
}
|
axios在发送异步请求时的可选配置:
{
url: '/user',
method: 'get',
baseurl: 'https://some-domain.com/api/',
transformrequest: [function (data, headers) {
return data;
}],
transformresponse: [function (data) {
return data;
}],
headers: {'x-requested-with': 'xmlhttprequest'},
params: {
id: 12345
},
paramsserializer: function (params) {
return qs.stringify(params, {arrayformat: 'brackets'})
},
data: {
firstname: 'fred'
},
data: 'country=brasil&city=belo horizonte',
timeout: 1000,
withcredentials: false,
adapter: function (config) {
},
auth: {
username: 'janedoe',
password: 's00pers3cret'
},
responsetype: 'json',
responseencoding: 'utf8',
xsrfcookiename: 'xsrf-token',
xsrfheadername: 'x-xsrf-token',
onuploadprogress: function (progressevent) {
},
ondownloadprogress: function (progressevent) {
},
maxcontentlength: 2000,
maxbodylength: 2000,
validatestatus: function (status) {
return status >= 200 && status < 300;
},
maxredirects: 5,
socketpath: null,
httpagent: new http.agent({ keepalive: true }),
httpsagent: new https.agent({ keepalive: true }),
proxy: {
protocol: 'https',
host: '127.0.0.1',
port: 9000,
auth: {
username: 'mikeymike',
password: 'rapunz3l'
}
},
canceltoken: new canceltoken(function (cancel) {
}),
decompress: true
}
|
9.2 axios get和post方法
axios.get(url[, config])
axios.get(url,{
上面指定配置key:配置值,
上面指定配置key:配置值
})
axios.post(url[, data[, config]])
axios.post(url,{key:value},{
上面指定配置key:配置值,
上面指定配置key:配置值
})
|
9.3 axios 拦截器
定义 src/utils/request.js 提取拦截器和配置语法
const instance = axios.create({
baseurl:'http://localhost:8080/',
timeout:10000
})
instance.interceptors.request.use(
config=>{
return config
},
error=>{
return promise.reject(error)
}
)
instance.interceptors.response.use(
response=>{
return response
},
error=>{
return promise.reject(error)
}
)
export default instance
|
十、跨域问题
同源策略(sameoriginpolicy)是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响。可以说web是构建在同源策略基础之上的,浏览器只是针对同源策略的一种实现。同源策略会阻止一个域的javascript脚本和另外一个域的内容进行交互。所谓同源(即指在同一个域)就是两个页面具有相同的协议(protocol),主机(host)和端口号
解决跨域的两个方式,1 前端代理模式(高并发下效果不好,一般不用)2
后端跨域过滤器
后端跨域过滤器:crosfilter过滤器
package com.pro.filter;
import com.pro.common.result;
import com.pro.util.webutil;
import jakarta.servlet.*;
import jakarta.servlet.annotation.webfilter;
import jakarta.servlet.annotation.webservlet;
import jakarta.servlet.http.httpservletrequest;
import jakarta.servlet.http.httpservletresponse;
import java.io.ioexception;
@webfilter("/*")
public class crosfilter implements filter {
@override
public void dofilter(servletrequest servletrequest, servletresponse servletresponse, filterchain filterchain) throws ioexception, servletexception {
httpservletrequest request = (httpservletrequest) servletrequest;
system.out.println(request.getmethod());
httpservletresponse response = (httpservletresponse) servletresponse;
response.setheader("access-control-allow-origin", "*");
response.setheader("access-control-allow-methods", "post, get, put, options, delete, head");
response.setheader("access-control-max-age", "3600");
response.setheader("access-control-allow-headers", "access-control-allow-origin, authority, content-type, version-info, x-requested-with");
if(request.getmethod().equalsignorecase("options")){
webutil.writejson(response, result.ok(null));
}else{
filterchain.dofilter(servletrequest, servletresponse);
}
}
}
|
未来使用框架,用一个 @crossorigin 就可以解决跨域问题了
十一、pinia
pinia 是 vue 的专属状态管理库,它允许你跨组件或页面共享状态。由 vue 核心团队维护,对
vue 2 和 vue 3 都可用 11.1 基本用法
先安装
定义 pinia store 对象 src/store/store.js
[推荐这么命名不是强制]
import {definestore } from 'pinia'
export const definedperson = definestore(
{
id: 'personpinia',
state:()=>{
return {
username:'张三',
age:0,
hobbies:['唱歌','跳舞']
}
},
getters:{
gethobbiescount(){
return this.hobbies.length
},
getage(){
return this.age
}
},
actions:{
doubleage(){
this.age=this.age*2
}
}
}
)
|
在 main.js 配置 pinia 组件到vue中
let app =createapp(app)
app.use(router)
app.use(pinia)
app.mount('#app')
|
pinia 使用:
<script setup type="module">
import { ref} from 'vue';
import { definedperson} from '../store/store';
let person= definedperson()
script>
<template>
<div>
<h1>operate视图,用户操作pinia中的数据h1>
请输入姓名:<input type="text" v-model="person.username"> <br>
请输入年龄:<input type="text" v-model="person.age"> <br>
请增加爱好:
<input type="checkbox" value="吃饭" v-model="person.hobbies"> 吃饭
<input type="checkbox" value="睡觉" v-model="person.hobbies"> 睡觉
<input type="checkbox" value="打豆豆" v-model="person.hobbies"> 打豆豆 <br>
<button @click="person.doubleage()">年龄加倍button> <br>
<button @click="person.$reset()">恢复默认值button> <br>
<button @click="person.$patch({username:'奥特曼', age:100,hobbies:['晒太阳','打怪兽']})">变身奥特曼button> <br>
显示pinia中的person数据:{{person}}
div>
template>
<style scoped>style>
|
11.2 pinia其他细节
状态监听及初始状态
state (状态) 在大多数情况下,state 都是你的 store 的核心。人们通常会先定义能代表他们
app 的 state。在 pinia 中,state 被定义为一个返回初始状态的函数。
let person= definedperson()
person.$subscribe((mutation,state)=>{
console.log('---subscribe---')
console.log(mutation)
console.log(mutation.type)
console.log(mutation.payload)
console.log(mutation.storeid)
console.log(person.$id)
console.log(state)
})
|
getter 完全等同于 store 的 state 的计算属性。可以通过 definestore()
中的 getters 属性来定义它们。推荐使用箭头函数,并且它将接收 state 作为第一个参数
let person= definedperson()
person.$subscribe((mutation,state)=>{
console.log('---subscribe---')
console.log(mutation)
console.log(mutation.type)
console.log(mutation.payload)
console.log(mutation.storeid)
console.log(person.$id)
console.log(state)
})
|
action 相当于组件中的 method。它们可以通过 definestore() 中的 actions
属性来定义,并且它们也是定义业务逻辑的完美选择。类似 getter,action 也可通过 this
访问整个 store 实例,并支持完整的类型标注(以及自动补全)。不同的是,action 可以是异步的,你可以在它们里面
await 调用任何 api,以及其他 action
export const usecounterstore = definestore('main', {
state: () => ({
count: 0,
}),
actions: {
increment() {
this.count
},
randomizecounter() {
this.count = math.round(100 * math.random())
},
},
})
|
十二、element plus
element plus 是一套基于 vue 3 的开源 ui 组件库,是由饿了么前端团队开发的升级版本
element ui。element plus 提供了丰富的 ui 组件、易于使用的 api 接口和灵活的主题定制功能,可以帮助开发者快速构建高质量的
web 应用程序。
element plus 可以在支持 es2018 和 resizeobserver 的浏览器上运行。
如果您确实需要支持旧版本的浏览器,请自行添加 babel 和相应的 polyfill
凯发娱发com官网https://element-plus.gitee.io/zh-cn/
由于 vue 3 不再支持 ie11,element plus 也不再支持 ie 浏览器。
使用步骤:
安装:npm 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')
|
复制凯发娱发com官网组件代码直接使用即可
|