上一篇简单编写了Header组件的框架:
Vue3.0 简单商城—Header组件的编写(1) – 每天进步一点点
Vue3.0 简单商城—路由和index页面编写 – 每天进步一点点
这一篇文章来美化一下Header组件。
1.Header组件
我们使用前面已经引入的ElementUI
我们修改Header组件,在其中加入”登录“ 和”退出“功能。
<template>
<div>
<el-row>
<el-col :span="8"></el-col>
<el-col :span="10">
<div class="grid-content ep-bg-purple" />
<span class="logo-text">水果商城</span>
</el-col>
<el-col :span="6"><div class="grid-content ep-bg-purple-light" />
<el-button type="primary">登录</el-button>
<el-button type="primary" plain>退出</el-button>
</el-col>
</el-row>
</div>
</template>
<script>
export default {
// import引入的组件需要注入到对象中才能使用
components: {},
data() {
// 这里存放数据
return {};
},
// 监听属性 类似于data概念
computed: {},
// 监控data中的数据变化
watch: {},
// 方法集合
methods: {},
// 生命周期 - 创建完成(可以访问当前this实例)
created() {},
// 生命周期 - 挂载完成(可以访问DOM元素)
mounted() {},
};
</script>
<style >
.logo-text{
color: #112eeb;
font-size: 20px;
font-weight:600
}
</style>
我们需要加入一些逻辑。
比如:
1.当打开界面的时候我们首先校验一下用户有没有登录,如果登录了,就不显示”登录“按钮,如果没有登录,就只显示”登录“按钮,不显示”退出按钮“。
2.如果用户点击登录,就弹出登录的对话框,进行登录操作(登录也是一个组件)。
3.校验用户是否登录过,可以暂时用本地存储,localstorgae。
修改完Header组件如下:
<template>
<div>
<el-row>
<el-col :span="8"></el-col>
<el-col :span="10">
<div class="grid-content ep-bg-purple" />
<span class="logo-text">水果商城</span>
</el-col>
<el-col :span="6"
><div class="grid-content ep-bg-purple-light" />
<el-button @click="Login" v-if="!isLogin" type="primary">登录</el-button>
<el-button @click="logout" v-else type="primary" plain>退出</el-button>
<span v-if="isLogin">欢迎您:{{user.username}}</span>
</el-col>
</el-row>
</div>
</template>
<script>
export default {
components: {},
data() {
return {
isLogin: false, //是否登录的标志
user:{},//用户数据
};
},
computed: {},
// 方法集合
methods: {
//登录跳转
Login() {
this.$router.push("/login");
},
//登出方法
logout() {
console.log("用户登出");
console.log(localStorage.getItem("userToken"));
this.$router.push("/login").catch((err) => err);
localStorage.removeItem("userToken");
this.login = true;
console.log(localStorage.getItem("userToken"));
},
},
// 生命周期 - 创建完成(可以访问当前this实例)
created() {},
// 生命周期 - 挂载完成(可以访问DOM元素)
mounted() {
if (localStorage.getItem("userToken")) {
this.isLogin = true;
this.user = JSON.parse(localStorage.getItem("userToken"))
} else {
this.isLogin = false;
}
},
};
</script>
<style >
.logo-text {
color: #112eeb;
font-size: 20px;
font-weight: 600;
}
</style>
此处,如果用户没有登录的话点击登录就会跳转到登录界面,如果退出的话也会跳转到登录界面。
在mounted函数中监测有没有用户登录信息,如果有就显示用户信息,如果没有则展示默认登录状态。
2.编写登录组件Login.vue
这里为了示范,先不用表单逻辑,就简单使用input框
我们创建一个login.vue
参考代码如下:
<template>
<div>
<el-card class="box-card">
<el-row>
<h2>欢迎来到水果商城</h2>
</el-row>
<el-row>
用户名:
<el-input v-model="username" placeholder="请输入用户名"></el-input
></el-row>
<el-row>
密码:
<el-input
placeholder="请输入密码"
v-model="password"
show-password
></el-input>
</el-row>
<el-row>
<el-col :span="12">
<el-button type="primary" round @click="userLogin"
>登录</el-button
></el-col
>
<el-col :span="12"> <el-button round>注册</el-button></el-col>
</el-row>
</el-card>
</div>
</template>
<script>
export default {
name: "Login",
data() {
return {
username: "",
password: "",
};
},
methods: {
//登录方法:
userLogin() {
if (this.acount == "") {
alert("用户名不能为空");
return;
} else if (this.password == "") {
alert("密码不能为空");
return;
} else {
//模拟向后台请求数据
alert("登录成功")
//使用localstorage存储
let userData = {
username: this.username,
password: this.password,
};
//如果localStorage监测到userToken就认为登录成功了
localStorage.setItem("userToken", JSON.stringify(userData)); //使用json,便于观察数据
//localStorage.setItem("userToken", userData);
console.log(userData)
this.$router.push("/home") //路由跳转
}
},
},
};
</script>
<style>
.box-card {
margin: 5% 25% 5% 25%;
width: 50%;
}
</style>
然后在路由中,添加登录组件的信息,让header组件可以跳转到路由组件中。
// 定义路由
const routes = [
{
path: '/',
name: 'index',
component: index,
},
{
path:'/login',
name:'login',
component:login,
}
];

这样便能实现简单的登录功能,效果图如下:
