上一篇简单编写了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,
    }
];

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

分类: 前端