关于 localStorage.isLogin=true/false;困惑!

来源:3-2 路由守卫实现基础登陆校验功能

Vigorous阿炎

2020-12-27 15:50:53

自己在login中把这个改成 localStorage.isLogin=false;页面照样能跳转到home页面。但是我要是不写localStorage.isLogin=false页面就无法跳转

得出的结论: 不管是true 或者false,其实重要的是要在Application中种植一个数据。


要是这样的话,这个localStorage.isLogin为什么如此重要,而与true/false无关后期还会用它进行数据校验吗?

 我的代码如下:

Login.vue

<template>

    <div class="wrapper">

        <img src="http://www.dell-lee.com/imgs/vue3/user.png" alt="">

        <div class="wrapper__input">

            <input class="wrapper__input__content"

            v-model="data.username"

             placeholder="请输入用户名/手机号">

        </div> 

        <!-- 输入框双向绑定 -->

        <div class="wrapper__input">

            <input class="wrapper__input__content"

            v-model="data.password"

            placeholder="请输入密码" type="password">

        </div> 

        <div class="wrapper__login-button" @click="handleLogin">登入</div>

        <router-link :to='{name:"Register"}'>

            <div class="wrapper__login-link">注册</div>

        </router-link>

        <!-- reactive数据双向绑定需要把弹框内容写到data里面 -->

        <Toast v-if="data.showToast" :message='data.toastMessage' />

    </div>

</template>


<script>

// 引入路由其他功能实现点击直接跳转不用输入/home

import { useRouter } from 'vue-router'

// 引入接口工具包,使用后端给的数据

import axios from 'axios'

// 账号密码绑定包将数据包装成可观测的类型,当数据变化时,我们能够感知到

import { reactive } from 'vue'

// 引入弹框样式组件

import Toast from '../../components/Toast'

// 后端要求content-type的类型为json

axios.defaults.headers.post['Content-Type'] = 'application/json';

export default {

  name:'Login',

  components:{ Toast },

  setup(){

    // 账号密码绑定当数据变化时,我们能够感知到

      const data=reactive({

          username:'',

          password:'',

          showToast:false,

        //   建立弹框内容

          toastMessage:''

      })

      const router=useRouter();

      const handleLogin=()=>{

          axios.post('https://www.fastmock.site/mock/ae8e9031947a302fed5f92425995aa19/jd/api/user/login', {

            username: data.username,

            password: data.password

        }).then(()=>{

            alert('成功')

            // localStorage.isLogin=false;

            router.push({name: 'Home'})

        }).catch(()=>{

            data.showToast=true

            data.toastMessage='登入失败'

            // 两秒后弹框消失

            setTimeout(()=>{

                data.showToast=false

            },2000)

            // alert('失败')

        })               

            }

            return{handleLogin,data}

        }

}

</script>


<style lang="scss" scoped>

.wrapper{

    positionabsolute;

    top0;

    left0;

    right0;

    bottom0;

    margin-top50%;

    img{

      displayblock;

      margin0 auto .4rem auto;

      width.66rem;

      height.66rem;  

    }

    .wrapper__input{

        height.48rem;

        margin0 .4rem .16rem .4rem;

        padding0 .16rem;

        background#f9f9f9;

        border: ipx solid rgba(0,0,0,0.10);

        border-radius6px;

        &__content{

            width100%;

            height.48rem;

            bordernone;

            backgroundnone;

            outlinenone;

            font-size.16rem;

            &::placeholder{

                 color#777;

            }

        }

    }

    .wrapper__login-button{

        margin.32rem .4rem .16rem .4rem;

        background#0091ff;

        box-shadow0 .04rem .08rem 0 rgba(0,145,255,0.32);

        border-radius.04rem;

        colorwhite;

        line-height.48rem;

        font-size.16rem;

        text-aligncenter;

    }

    .wrapper__login-link{

        text-aligncenter;

        font-size.15rem;

        color#777;

    }

}

</style>


index.js

import { createRouter, createWebHashHistory } from 'vue-router'

// 引入两个页面用于路由路径展示

import Home from '../views/home/Home'

import Login from '../views/login/Login'

import Register from '../views/register/Register'

const routes = [

{

  path: '/',

  name: 'Home',

  component: Home

},

{

  path: '/register',

  name: 'Register',

  component: Register,

  beforeEnter(to,from,next){

    const isLogin=localStorage.isLogin;

    if(isLogin){

      next({name:'Home'})

    }else{ next() }

  }

},

{

  path: '/login',

  name: 'Login',

  component: Login,

  // 此处实现的是用户已经登入了就没必要再来到login这个页面了直接回到home页面

  beforeEnter(to,from,next){

    const isLogin=localStorage.isLogin;

    if(isLogin){

      next({name:'Home'})

    }else{ next() }

    console.log(to,from)

  }

},

  // {

  //   path: '/about',

  //   name: 'About',

  //   // 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/About.vue')

  // }

]


const router = createRouter({

  history: createWebHashHistory(),

  routes

})

// 设置登入密码页面跳转功能

router.beforeEach((to,from,next)=>{

  // 在本地存储中添加访问Home功能

  const isLogin=localStorage.isLogin;

  // 此处实现的是你访问任何路径都只会跳转到Login页面

  if(!isLogin &&( to.name!=="Login"&&to.name!=='Register')){

    next({name:'Login'})

  }else{

    // next()表示当前页面

    next();

  }

})

export default router




在这里输入代码,可通过选择【代码语言】突出显示

写回答

3回答

好帮手慕夭夭

2020-12-28

同学你好,没有这样的功能哦。antd其实为React所做的UI库,也就是它适用于React,不适用于Vue。即使它能用在Vue中,那么antd它是UI框架(UI是用户界面),逻辑功能还是要自己写的哦。

祝学习愉快~

0
higorous阿炎
hp>噢噢,谢谢。

h020-12-28
共1条回复

好帮手慕夭夭

2020-12-28

同学你好,虽然同学觉得Antd用着方便,但是学习不能一成不变,所有课程全部用同一个框架。框架的更新换代是非常快的,而核心技术一般是不变的。所以我们在学习的时候,应该各种方法都学会哦。自己虽然会出现很多错误,但是只有在发现错误以及解决错误的过程中,你的技术才会提升的更快哦。

祝学习愉快~

0
higorous阿炎
hp>嗯嗯技术是一方面,老师其实我想问的是,比如那个登入注册页面切换逻辑自己只能勉强完成功能也不太稳定,那antd中文档中是否有这样的模板,供我们参考的。

h020-12-28
共1条回复

好帮手慕夭夭

2020-12-27

同学你好,这是因为localStorage在获取isLogin时,isLogin的类型为字符串(虽然我们设置的值是布尔,但是localStorage保存的时候都是以字符串的形式保存的)。不管是“false”还是“true”,在判断的时候,结果都是true(空字符串才是false)。所以不管设置为true还是false,都可以跳转(课程中也是存在这个问题)。

如果想要解决这个问题,可以在获取isLogin时,进行json数据的转换,参考如下:

http://img.mukewang.com/climg/5fe86b0109a2be3407520210.jpg

注意,如果localStorage还没有保存isLogin时,获取的值是undefined。JSON.parse()无法转换undefined,会报错,所以判断一下。

以上知识可以特殊记一下,总结一下哦。

祝学习愉快~

0
higorous阿炎
hp>JSON.parse()这个知识点之前学过,确实可以转换数据类型。

之前我们学习页面swiper input menu 这些小组件功能的时候模板样式都是到Antdesign官网找文档模板的。 要是我自己写肯定会出现各种bug,在vue项目课程中为什么没用到那个Antd文档样式呢?

h020-12-28
共1条回复

0 学习 · 15276 问题

查看课程