Vue+ElementUI项目搭建小案例(idea)
npm下载比较慢,可以使用cnpm安装:npm下载包路径更改
npm命令解释:
1、创建一个名为hello-vue的项目
2、在项目目录下初始化项目
vue init webpack hello-vue
- 进入项目目录 cd hello-vue
- 先安装组件,在idea中会有语法提示
- 安装vue-router
npm install vue router --save-dev
- 安装elementUI
npm i element-ui -S
- 安装依赖
npm install
- 安装SASS加载器
cnpm install sass-loader node-sass --save-dev
- 启动测试
npm run dev
访问 http://localhost:8080
3、项目案例
- 在src目录下建立文件夹:router,views
- 在views目录下创建一个main.vue文件
- 在views目录下创建一个Login.vue文件
<template>
<div class="login-box">
<!-- 通过:rules="loginFormRules"来绑定输入内容的校验规则 -->
<el-form :rules="loginFormRules" ref="loginForm" :model="loginForm" label-position="right" label-width="auto" show-message>
<span class="login-title">欢迎登录</span>
<div style="margin-top: 5px"></div>
<el-form-item label="用户名" prop="loginName">
<el-col :span="22">
<el-input type="text" v-model="loginForm.loginName"></el-input>
</el-col>
</el-form-item>
<el-form-item label="密码" prop="loginPassword">
<el-col :span="22">
<el-input type="password" v-model="loginForm.loginPassword"></el-input>
</el-col>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="loginSubmit('loginForm')">登录</el-button>
<el-button type="primary" @click="onRegit('loginForm')">注册</el-button>
</el-form-item>
</el-form>
</div>
</template>
<script>
export default {
name: "login",
data() {
return {
loginForm: {
loginName: '',
loginPassword: ''
},
// 表单验证,需要在 el-form-item 元素中增加 prop 属性
loginFormRules: {
loginName: [
{required: true, message: '账号不可为空', trigger: 'blur'}
],
loginPassword: [
{required: true, message: '密码不可为空', trigger: 'blur'}
]
}
}
},
methods: {
loginSubmit(formName) {
// 为表单绑定验证功能
this.$refs[formName].validate((valid) => {
if (valid) {
// 使用 vue-router 路由到指定页面,该方式称之为编程式导航
console.log("to loginSuccess")
this.$router.replace("/loginSuccess");
} else {
return false;
}
});
}
}
}
</script>
<style scoped>
.login-box {
border: 1px solid #DCDFE6;
width: 350px;
margin: 180px auto;
padding: 35px 35px 15px 35px;
border-radius: 5px;
-webkit-border-radius: 5px;
-moz-border-radius: 5px;
box-shadow: 0 0 25px palegreen;
}
.login-title {
text-align: center;
margin: 0 auto 40px auto;
color: #66CD00;
font-size: 30px;
font-weight: bold;
}
</style>
- 配置router,在router目录下建index.js配置文件
import Vue from "vue";
import Router from "router";
import Main from "../views/main"
import Login from "../views/Login";
Vue.use(Router);
export default new Router({
routers: [
{
path: "/main",
component: Main
},{
path: "/login", // 访问路径
component: Login // 组件
}
]
})
- 在main.js中导入相关的依赖包(Router,ElementUI)
// The Vue build version to load with the `import` command
// (runtime-only or standalone) has been set in webpack.base.conf with an alias.
import Vue from 'vue';
import App from './App';
import router from "./router";
import ElementUI from "element-ui";
Vue.config.productionTip = false;
Vue.use(router);
Vue.use(ElementUI);
import 'element-ui/lib/theme-chalk/index.css';
/* eslint-disable no-new */
new Vue({
el: '#app',
router,
render: h => h(App)
})
4、路由嵌套
-
在views目录下建user文件夹,并创建两个vue文件,List.vue和Profile.vue
-
在main.vue加入以下代码:
<template>
<div>
<el-container>
<el-aside width="200px">
<el-menu :default-openeds="['1']">
<el-submenu index="1">
<template slot="title"><i class="el-icon-caret-right"></i>用户管理</template>
<el-menu-item-group>
<el-menu-item index="1-1">
<router-link to="/user/profile">个人信息</router-link>
</el-menu-item>
<el-menu-item index="1-2">
<router-link to="/user/list">用户列表</router-link>
</el-menu-item>
</el-menu-item-group>
</el-submenu>
<el-submenu index="2">
<template slot="title"><i class="el-icon-caret-right"></i>内容管理</template>
<e1-menu-item-group>
<el-menu-item index="2-1">分类管理</el-menu-item>
<el-menu-item index="2-2">内容列表</el-menu-item>
</e1-menu-item-group>
</el-submenu>
</el-menu>
</el-aside>
<el-container>
<el-header style="text-align: right; font-size: 12px">
<el-dropdown>
<i class="el-icon-setting" style="margin-right:15px"></i>
<el-dropdown-menu slot="dropdown">
<el-dropdown-item>个人信息</el-dropdown-item>
<el-dropdown-item>退出登录</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
</el-header>
<el-main>
<router-view/>
</el-main>
</el-container>
</el-container>
</div>
</template>
<script>
export default {
name: "Main"
}
</script>
<style scoped lang="scss">
.el-header {
background-color: #048bd1;
color: #333;
line-height: 60px;
}
.el-aside {
color: #333;
}
</style>
- 在路由中添加配置,导入组件
import List from "../views/user/List";
import Profile from "../views/user/Profile";
- 路由嵌套
routes: [
{
path: "/Main",
component: Main,
//嵌套路由
children: [
{
path: "/user/list",
component: List
}, {
path: "/user/profile",
component: Profile
}
]
}, {
path: "/login", // 访问路径
component: Login, // 组件
}
]
5、参数传递及重定向
参数传递
- 方法一:
<!-- 需要进行双向绑定:name为组件路径也可以为组件名,param为参数 -->
<router-link v-bind:to="{name: '/user/profile',param: {id:1}}">个人信息</router-link>
{
//与传参的名字一致
path: "/user/profile/:id",
component: Profile
}
<template>
<!-- 踩坑点:所有的元素必须放在根标签下-->
<div>
<h2>用户信息</h2>
<!-- $route没有s param有s-->
{{$route.params.id}}
</div>
</template>
- 方法二:通过props解耦
在路由配置文件中添加
{
path: "/user/profile/:id",
component: Profile,
props: true //添加这一行表示开启props传参
}
在profile.vue中添加,props:[‘id’]接收参数
重定向
,{
path: "/gohome",
redirect: "/main"
}
6、路由钩子
- 导入依赖
import axios from 'axios'
import VueAxios from 'vue-axios'
Vue.use(VueAxios, axios);
- Profile.vue,添加路由钩子,在路由前、路由后执行
<script>
export default {
props: ['id'],
name: "profile",
beforeRouteEnter: (to, from, next)=>{
console.log("进入路由之前");
//加载数据
next(vm => {
vm.getData();
})
},
beforeRouteLeave: (to, from, next) => {
console.log("进入路由之后");
next();
},
methods: {
getData: function () {
this.axios({
method: "get",
url: "http://localhost:8080/static/mock/data.json"
}).then(function (response) {
console.log(response)
})
}
}
}
</script>
bug
-
如何解决: [Vue warn]: Do not use built-in or reserved HTML elements as component id: 标签id
自定义的id和HTML内部id重复 -
出现bug有可能是单词拼写错误(踩坑点:不能正确跳转页面)
-
npm run dev 错误提示:
{ parser: “babylon” } is deprecated; we now treat it as { parser: “babel” }.
解决方法:
找到你的工程文件夹里的 YourProName\node_modules\vue-loader\lib\template-compiler\index.js
//将以下代码
if (!isProduction) {
code = prettier.format(code, { semi: false, parser: ‘babylon’ })
}//修改为:
if (!isProduction) {
code = prettier.format(code, { semi: false, parser: ‘babel’ }) -
解决方法:将SaaS的版本改为7.3.1,然后重新安装依赖