第一步:win+r进入cmd :输入vue ui
第二步:输入你要创建文件的文件夹位置
然后点击创建
输入创建的信息,即下一步
将vuex 、router、css、配置文件 勾选
第三步
第四步就是创建相关依赖
第五步运行项目:
因为项目已经配置好了 所以不需要npm i
其中有一个报错:npm errno-4058
原因是你并没有进入vue文件夹,而是在它的外层,使用cd进入你的vue项目中即可
解决了:
项目创建完成:
安装prettier:
第二步对preitter进行配置
首先创建第一个文件.prettierrc文件
{
// 选择tab缩进还是空格
"useTabs": false,
// 缩进多少个空格
"tabWidth": 2,
// 单行字符的长度
"printWidth": 80,
// 使用单引号
"singleQuote": true,
// 是否需要在末尾添加逗号,比如对象属性后
"trailingComma": "none",
// 语句末尾是否需要添加分号
"semi": false
}
创建第二个文件.prettierignore文件
/dist/*
.local
.output.js
/node_modules/**
**/*.svg
**/*.sh
/public/*
最后到package.json中进行配置
"prettier": "prettier --write ."
可能会出现的报错1:Comments are not permitted in JSON.
将json修改为json with comments
可能会出现的报错2:TypeScript intellisense is disabled on template. To enable,
configure"jsx": "preserve"
in the"compilerOptions"
property of
tsconfig or jsconfig. To disable this prompt instead, configure
"experimentalDisableTemplateSupport": true
in"vueCompilerOptions"
property. 解决方法:添加"jsx":“preserve”,
“jsx”: “preserve”, 有三种模式
preserve:生成代码中会保留JSX以供后续的转换操作使用(比如:Babel).另外,输出文件会带有.jsx扩展名。
react:会生成React.createElement,在使用前不需要再进行转换操作了,输出文件的扩展名为.js。
react-native:相当于preserve,它也保留了所有的JSX,但是输出文件的扩展名是.js
为了解决冲突,可以添加:
'indent':0,
'space-before-function-paren':0,
关于premitter自动添加逗号分号问题: 在package.json中添加;
"singleQuote": true, // 使用单引号 "printWidth": 115, "proseWrap": "always", "semi": false, // 不加分号 "trailingComma": "none", // 结尾处不加逗号 "htmlWhitespaceSensitivity": "ignore" // 忽略'>'下落问题 },
第三步 安装commit规范你使用 commitizen 进行代码提交(git commit)时,commitizen 会提交你在提交时填写所有必需的提交字段!
1.
npm i -g commitizen@4.2.4
2.在package.json中添加
"config": {
"commitizen":{
"path":"node_modules/cz-customizable"
}
}
3.项目根目录下创建 .cz-config.js 自定义提示文件
module.exports = {
// 可选类型
types: [
{ value: 'feat', name: 'feat: 新功能' },
{ value: 'fix', name: 'fix: 修复' },
{ value: 'docs', name: 'docs: 文档变更' },
{ value: 'style', name: 'style: 代码格式(不影响代码运行的变动)' },
{
value: 'refactor',
name: 'refactor: 重构(既不是增加feature,也不是修复bug)'
},
{ value: 'perf', name: 'perf: 性能优化' },
{ value: 'test', name: 'test: 增加测试' },
{ value: 'chore', name: 'chore: 构建过程或辅助工具的变动' },
{ value: 'revert', name: 'revert: 回退' },
{ value: 'build', name: 'build: 打包' }
],
// 消息步骤
messages: {
type: '请选择提交类型:',
customScope: '请输入修改范围(可选):',
subject: '请简要描述提交(必填):',
body: '请输入详细描述(可选):',
footer: '请输入要关闭的issue(可选):',
confirmCommit: '确认使用以上信息提交?(y/n/e/h)'
},
// 跳过问题
skipQuestions: ['body', 'footer'],
// subject文字长度默认是72
subjectLimit: 72
}
4.运行git add .
5.运行git cz
6.最终git push
npm install element-plus --save --force
npm install -D unplugin-vue-components unplugin-auto-import --force
然后新建一个文件:
// webpack.config.js
const AutoImport = require('unplugin-auto-import/webpack')
const Components = require('unplugin-vue-components/webpack')
const { ElementPlusResolver } = require('unplugin-vue-components/resolvers')
module.exports = {
// ...
plugins: [
AutoImport({
resolvers: [ElementPlusResolver()],
}),
Components({
resolvers: [ElementPlusResolver()],
}),
],
}
将main.js进行修改
import { createApp } from 'vue'
import App from './App.vue'
import router from './router'
import store from './store'
import ElementPlus from 'element-plus'
import 'element-plus/dist/index.css'
createApp(App).use(store).use(router).use(ElementPlus).mount('#app')
重新npm run serve运行成功了就是没问题了
element-plus指南和组件u链接i
1.首先安装插件:
Vue VSCode Snippets
输入vue即可显示初始页面
2.如果有报错:1:1 error Component name “index” should always be multi-word vue/multi-word-
解决办法:在.eslintrc.js中添加配置项
'vue/multi-word-component-names': 0
3.导入js文件
在App.vue中添加
import 'element-plus/dist/index.css'
import '@/styles/index.scss'
4.重写router/index.js
import { createRouter, createWebHashHistory } from 'vue-router'
const routes = [
{
path: '/login',
name: 'Login',
// route level code-splitting
// this generates a separate chunk (about.[hash].js) for this route
// which is lazy-loaded when the route is visited.
component: () => import(/* webpackChunkName: "about" */ '../views/login')
}
]
const router = createRouter({
history: createWebHashHistory(),
routes
})
export default router
5.把没用的vue删除。
在views文件夹下新建login文件夹,再建index.vue文件
<template>
<div>
<div class="login-container">
<el-form :model="form">
<el-form-item>
<el-input v-model="form.name" />
</el-form-item>
</el-form>
</div>
</div>
</template>
<script setup>
import { ref } from 'vue'
const form = ref({
name: ''
})
</script>
<style lang="scss" scoped></style>
6.创建图标
import { Edit } from '@element-plus/icons-vue'
可以去官网自己选样式element-plus官网
7.修改样式
使用了 ElementUI 组件且样式 style 使用了 scoped 属性,当想要修改组件样式,发现直接修改不了,需去掉 scoped 属性或者使用深度选择器才能修改成功。
box-sizing:border-box属性:
如果没有设置,宽高会加上padding和border的值,需要我们手动去计算,减去padding和border的值,并调整content的值,以免超过给定的宽高;
如果设置了, 则会自动调整content值
8.登录按钮
"primary" class="login-button">登录
.login-button {
width: 100%;
box-sizing: border-box;
}
9.引入自定义组件:
在src下加载icon文件夹,然后在components中添加SvgIcon文件夹,再在其中添加index.vue文件
fill
是SVG元素的一种属性;SVG元素的这些属性,用于指定如何处理或者呈现元素的详细信息。在css中,currentColor是一个变量,这个变量的值是当前元素的color值。
vertical-align:
-0.15em;因icon大小被设置为和字体大小一致,而span等标签的下边缘会和字体的基线对齐,故需设置一个往下的偏移比例,来纠正视觉上的未对齐效果.
关于defualtprops:${props.icon}
defineProps:
1.用于组件通信中父级组件给子级组件传值,其用来声明props,其接收值为props选项相同的值
2.必须在全局中使用,不能再局部中使用。且不可访问其他变量。无需导入,在编译setup时会一起编译
3.与之对应的是defineEmits:用于组件通信中子级组件向父级组件传值,其用来声明emit,其接收内容于emit选项一致
10
首先在icons文件夹下创建index.js
import SvgIcon from '@/components/svgIcon'
// require.context(要匹配的目录,是否检索子文件夹,匹配名字的正则)
const SvgRequired=require.context('./svg',false,/\.svg$/)
//require.context.keys()返回一个数组,数组中的每个元素传入require.context方法中,就可以导出相应的文件
SvgRequired.keys().array.forEach(element => SvgRequired(element));
export default app=>{
//app.component()方法,让组件在当前 Vue 应用中全局可用 注册组件svg-icon
app.component('svg-icon',SvgIcon)
}
import SvgIcon from '@/components/svgIcon'
然后去main,js中导入
import SvgIcon from '@/icons'
const app=create(App)
SvgIcon(app)
app.use(store).use(router).use(ElementPlus).mount('#app')
安装svg-loader
npm i --save-dev svg-sprite-loader@6.0.9
> 如果有报错:code ERESOLVE npm ERR! ERESOLVE could not resolve npm ERR! npm ERR! While resolving: @vue/eslint-config-standard@6.1.0 npm ERR!
Found: eslint-plugin-vue@8.7.1 npm ERR! node_modules/eslint-plugin-vue
npm ERR! dev eslint-plugin-vue@“^8.0.3” from the root project npm
ERR! npm ERR! Could not resolve dependency: npm ERR! peer
eslint-plugin-vue@“^7.0.0” from @vue/eslint-config-standard@6.1.0 npm
ERR! node_modules/@vue/eslint-config-standard npm ERR! dev
@vue/eslint-config-standard@“^6.1.0” from the root project npm ERR!
npm ERR! Conflicting peer dependency: eslint-plugin-vue@7.20.0 npm
ERR! node_modules/eslint-plugin-vue npm ERR! peer
eslint-plugin-vue@“^7.0.0” from @vue/eslint-config-standard@6.1.0
npm ERR! node_modules/@vue/eslint-config-standard npm ERR! dev
@vue/eslint-config-standard@“^6.1.0” from the root project npm ERR!
Fix the upstream dependency conflict, or retry npm ERR! this command
with --force, or --legacy-peer-deps npm ERR! to accept an incorrect
(and potentially broken) dependency resolution.
则可以使用–force或者 --legacy-peer-deps
修改webpack配置
const path = require('path')
function resolve(dir) {
return path.join(__dirname, dir)
}
在module.export中添加:
chainWebpack(config) {
// 设置 svg-sprite-loader
// config 为 webpack 配置对象
// config.module 表示创建一个具名规则,以后用来修改规则
config.module
// 规则
.rule('svg')
// 忽略
.exclude.add(resolve('src/icons'))
// 结束
.end()
// config.module 表示创建一个具名规则,以后用来修改规则
config.module
// 规则
.rule('icons')
// 正则,解析 .svg 格式文件
.test(/\.svg$/)
// 解析的文件
.include.add(resolve('src/icons'))
// 结束
.end()
// 新增了一个解析的loader
.use('svg-sprite-loader')
// 具体的loader
.loader('svg-sprite-loader')
// loader 的配置
.options({
symbolId: 'icon-[name]'
})
// 结束
.end()
config
.plugin('ignore')
.use(
new webpack.ContextReplacementPlugin(/moment[/\\]locale$/, /zh-cn$/)
)
config.module
.rule('icons')
.test(/\.svg$/)
.include.add(resolve('src/icons'))
.end()
.use('svg-sprite-loader')
.loader('svg-sprite-loader')
.options({
symbolId: 'icon-[name]'
})
.end()
}
}
11.添加校验
到官网查找from表单验证
const rules = ref({
name: [
{ required: true, message: 'Please input Activity name', trigger: 'blur' },
{ min: 3, max: 5, message: 'Length should be 3 to 5', trigger: 'blur' }
],
password: [
{ required: true, message: 'Please input Activity name', trigger: 'blur' },
{ min: 3, max: 5, message: 'Length should be 3 to 5', trigger: 'blur' }
]
})
用户名输入与密码输入均添加prop
"password">