Vue項目實戰:登錄頁面實現與Vuex集成

目錄

1. 登錄頁面

2. Vuex集成

登錄頁面

(1)登錄功能

<template>
	<div class="login-form">
          <h3>
            <span class="checked">帳號登錄</span><span class="sep-line">|</span><span>掃碼登錄</span>
          </h3>
          <div class="input">
            <input type="text" placeholder="請輸入帳號" v-model="username">
          </div>
          <div class="input">
            <input type="password" placeholder="請輸入密碼" v-model="password">
          </div>
          <div class="btn-box">
            <a href="javascript:;" class="btn" @click="login">登錄</a>
          </div>
          <div class="tips">
            <div class="sms" @click="register">手機短信登錄/註冊</div>
            <div class="reg">立即註冊<span>|</span>忘記密碼?</div>
          </div>   
	</div>
</template>
<script>
export default {
  name: 'login',
  data(){
    return {
      username:'',
      password:'',
      userId:''
    }
  },
  methods:{
      login() {
          let {username, password} = this;
          this.axios.post('/user/login', {
               username,
               password
          }).then((res) => {
              this.$cookie.set('userId', res.id, {expires:'1M'});
              //to-do保存用戶名
              this.$router.push('/index')
          })
      },
      register() {
          this.axios.post('/user/register', {
              username:'admin',
              password:'admin1',
              email:'[email protected]'
          }).then(() => {
              alert('註冊成功');
          })
      }
  }
}
</script>

(2)拉取用戶信息

在App.vue中:

<template>
  <div id="app">
    <router-view></router-view>
  </div>
</template>

<script>
//import storage from './storage' 
export default {
  name: 'App',
  components: {
  },
  data() {
    return { 
      res: {}
    }
  },
  mounted() {
    this.getUser(); 
    this.getCartCount();
  },
  methods: {
    getUser() {
      this.axios.get('/user').then(() => {
        //to-do保存在vuex
      })
    },
    getCartCount() {
      this.axios.get('/carts/products/sum').then(() => {
        //to-do 保存在vuex
      })
    }
  }
}
</script>

Vuex集成

(1)Vuex框架搭建

  • 在src文件夾中創建文件夾store,並在store文件夾下創建三個文件,分別是 action.js、index.js、mutations.js。

  • 在index.js中:

 import Vue from 'vue'
 import Vuex from 'vuex'
 import mutations from './mutations'
 import actions from './action'
 Vue.use(Vuex);
 const state = {
     username: '',
     cartCount: 0
 }
 export default new Vuex.Store({
     state,
     mutations,
     actions
 })
  • 在mutations.js中:
export default {   
}
  • 在action.js中:
export default { 
}
  • 在main.js中新增:
import store from './store'
new Vue({
  router,
  store,
  render: h => h(App),
}).$mount('#app')

(2)Vuex存儲讀取數據

  • 在action.js中:
export default {
    saveUserName(context, username) {
        context.commit('saveUserName', username);
    },
    saveCartCount(context, count) {
        context.commit('saveCartCount', count);
    }
}
  • 在mutations.js中:
export default {
    saveUserName(state, username) {
        state.username = username;
    },
    saveCartCount(state, count) {
        state.cartCount = count;
    }
}
  • 在login.vue中存儲用戶信息:
<!--大部分無關無關代碼被省略-->
<div class="btn-box">
       <a href="javascript:;" class="btn" @click="login">登錄</a>
 </div>
<script>
export default {
 methods:{
	login() {
          let {username, password} = this;
          this.axios.post('/user/login', {
               username,
               password
          }).then((res) => {
              this.$cookie.set('userId', res.id, {expires:'1M'});
              this.$store.dispatch('saveUserName', res.username); //將用戶信息存入state中
              this.$router.push('/index')
          })     
	  }
 }
}
</script>
  • 在NavHeader.vue讀取用戶信息:
<a href="javascript:;" v-if="username">{{username}}</a>
<script>
export default {
  data() {
    return {
      username: this.$store.state.username,
    };
  }
</script>
  • 在App.vue中

    由於store裏的數據是保存在運行內存中的,當頁面刷新時,頁面會重新加載vue實例,store裏面的數據就會被重新賦值。當頁面重新加載時,在App.vue中重新存儲一次用戶信息到state裏。

 mounted() {
    this.getUser(); 
  }, 
methods: {
    getUser() {
      this.axios.get('/user').then((res) => {
      this.$store.dispatch('saveUserName', res.username);
      })
    }
  }

(3)解決vuex頁面數據延遲

vuex數據更新,頁面數據沒有跟着刷新?這是由於先通過this.$store.state.username,讀取到了變量,而此時這個變量還未被存儲到state中,所以爲空。讀取了空變量後才執行了this.$store.dispatch('saveUserName', res.username);

解決方法之一:使用計算屬性。

將NavHeader.vue中修改爲如下:

<a href="javascript:;" v-if="username">{{username}}</a>
<script>
export default {
  data() {
    return {
    };
  },
  computed: {
  username(){
    return this.$store.state.username;
  }
}
</script>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章