Vue.js完成用户登录退出和e2e测试

媒介

原本只是想写个Vuet完成登录退出的例子的,然则又以为如许干货太少。一个好的开源项目,少不了单元测试和e2e测试,为了保证Vuet教程的雄厚性和顺序的稳定性,所以我挑选了写的例子即能当教程运用,也能够用于测试,雄厚的运用场景和测试,能保证往后的版本迭代不会由于修复了一个bug而引发了一大堆bug的为难。

源码地点

例子源码
测试源码

运转Vuet项目

git clone https://github.com/medevicex/vuet.git
npm install
npm run dev
npm run dev:test # 运转测试,须要电脑当地装置firefox和chrome浏览器

最先

哈哈,上面直接抛源码地点,觉得也是挺为难的,我们先剖析一下我们这个登录退出所须要所的功用

  • 登录页面,用户信息页面,是两个差别的页面,就触及到了多组件状况同享

  • 我希冀用户在已登录的情况下,每次到用户信息页面时,先衬着当地的用户信息,然后再去要求服务器更新当地的用户信息

  • 将登录退出的要领,集合起来治理,方面在在各个组件中挪用

多组件同享状况和要领

Vuet供应了全局的mapModules要领,能够让我们衔接到挂载在Vue实例上的Vuet实例

  • ages/Home.vue

  import { mapRules, mapModules } from 'vuet'

  export default {
    mixins: [
      // manual:划定规矩,能够将通用的更新模块状况的要领集合起来,
      //        能够明白成vuex中的action,只不过他是能够许可在内里变动模块状况的
      // need 划定规矩,会在组件每一次的beforeCreate钩子中,发送要求更新一次用户的信息
      mapRules({ manual: 'user', need: 'user' }),
      // 衔接用户模块
      mapModules({ user: 'user' })
    ]
  }

定义一个user模块

  • vuet/user.js

export default {
  data () {
    // 一个Object对象中,是不是有data要领,是组成Vuet.js一个模块的根据
    // 当你挪用reset要领时,将会重置全部模块的状况
    // 比方在组件中:this.$vuet.reset('模块称号')
    return {
      name: null,
      age: null,
      sex: null,
      count: 0
    }
  },
  async fetch ({ state }) {
    // 当need划定规矩触发更新时,出挪用一次fetch要领更新
    // 我们能够在这里直接变动state,也能够return一个Object对象来更新状况

    // 在现实项目中,用户未登录时,我们并不须要向服务器发送真正的要求
    // 所以我们能够推断一下用户的称号是不是存在,不然的话不向服务器举行真正的要求
    if (state.name === null) return
    
    // 下面数据由于是模仿的,所以就直接return好了
    return {
      name: 'Vuet',
      age: 18,
      sex: 'male',
      count: ++state.count
    }
  },
  // 注:你要在组件中运用manual划定规矩才向组件注入这些要领
  // 比方:mapRules({ manual: '模块称号' }) 
  // 挪用:this.$模块称号.xxx()
  manuals: {
    async signin ({ state }, from) { // 定义了一个登录的要领
      if (from.name === 'Vuet' && from.pass === '2017') {
        return {
          success: true,
          msg: 'Login was successful',
          data: {
            name: 'Vuet',
            age: 18,
            sex: 'male',
            count: ++state.count
          }
        }
      }
      return {
        success: false,
        msg: 'Logon failure',
        data: null
      }
    },
    async sigout () {
      // 用户挑选退出后,直接挪用reset的要领即可重置用户信息
      this.reset()
    }
  }
}

完成用户登录

  • pages/Signin.vue


<template>
  <div class="inner">
    <b class="msg" style="color:red" v-if="msg">{{ msg }}</b>
    <form @submit.prevent="submit">
      <div>
        <label>User name:<input class="name" type="text" v-model="form.name"></label>
      </div>
      <div>
        <label>Password:<input class="pass" type="password" v-model="form.pass"></label>
      </div>
      <button>Signin</button>
    </form>
  </div>
</template>
<script>
  import { mapRules, mapModules } from 'vuet'

  export default {
    mixins: [
      // 运用manual划定规矩获得user模块内里manuals的要领
      mapRules({ manual: 'user' }),
      // 衔接用户的模块信息
      mapModules({ user: 'user' })
    ],
    data () {
      return {
        msg: null,
        form: {
          name: null,
          pass: null
        }
      }
    },
    methods: {
      async submit () {
        const res = await this.$user.signin(this.form)
        this.msg = res.msg
        if (res.success) {
          // 登录胜利后,直接赋值更新用户信息
          this.user = res.data
          setTimeout(() => {
            this.$router.replace({ name: 'home' })
          }, 500)
        }
      }
    }
  }
</script>
<style scoped>
</style>

总结

实在教程并没有写得迥殊细致的历程,重要是为了体现出Vuet一种开放的姿态,它能够在恣意组件直接对模块的状况举行直接的赋值更新,也能够运用相似action的要领举行更新,它能够让你随心所欲,用得好的人能够让你开辟的效力飙升,用得不好,也会致使你顺序中的状况难以追踪变化的纪录。哈哈,不小心被吓到了吧,实在这些都是有方法能够处理的,下次有时机,我们能够再讨论一下运用Vuet的准确姿态。

    原文作者:狼族小狈
    原文地址: https://segmentfault.com/a/1190000009756158
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞