【问题标题】:Can not get the latest data after updated the user profile(vue.js 2, vuex, laravel 8)更新用户配置文件后无法获取最新数据(vue.js 2,vuex,laravel 8)
【发布时间】:2021-08-05 04:02:41
【问题描述】:

我是 VueX 的新手。我遇到了一个问题,即在我更新配置文件信息并成功保存后,数据库显示了最新更新的信息,但用户界面无法检索最新数据。状态似乎没有更新。

我的个人资料界面

https://i.stack.imgur.com/8QtI9.png

但更新后,所有信息都消失了,没有显示最新信息

https://i.stack.imgur.com/ul1ob.png

UserProfile.vue

<template>
<div class="container" style="padding-top:25px">
    <div class="main-font">My Profile</div>
    <div class="d-flex row">
        <div class="col-6">
            <ValidationObserver v-slot="{ handleSubmit }">
                <form @submit.prevent="handleSubmit(updateProfile)">
                    <div class="d-flex py-4">                       
                        <div>                                
                            <img class="profile" src="/img/default.png" alt=""                               
                        </div>
                        <div class="my-auto ml-5">
                            <button type="submit" class="btn upload text"><i class="fas fa-upload fa-sm pr-2"></i>Upload new picture</button>
                        </div>
                    </div>
                    <div class="form-group col-10 p-0 m-0">
                        <ValidationProvider name="Name" rules="required|alpha" v-slot="{ errors }">
                            <label  class="text">Name</label>
                            <input type="text" id="name" class="form-control form-text" placeholder="Enter your username" v-model="userForm.name">
                            <span class="error-messsage">{{ errors[0] }}</span>
                        </ValidationProvider>
                        <!-- <small id="emailHelp" class="form-text text-muted">We'll never share your email with anyone else.</small> -->
                    </div>
                    <div class="form-group col-10 p-0 m-0 mt-4">
                        <ValidationProvider name="E-mail" rules="required|email" v-slot="{ errors }">
                            <label class="text">Email</label>
                            <input type="email" id="email"  class="form-control form-text" placeholder="Enter email" v-model="userForm.email">
                            <span class="error-messsage">{{ errors[0] }}</span>
                        </ValidationProvider>
                    </div>
                    <button type="submit" class="btn col-10 p-o save-but">SAVE CHANGES</button>
                </form>
            </ValidationObserver>
        </div>
        <div class="w-50">
            <img class="bg-img" src="/img/profile-bg.png" alt="">
        </div>
    </div>
</div>

脚本

<script>
import { ValidationProvider, ValidationObserver, extend } from 'vee-validate/dist/vee-validate.full';

export default {

    components: {
        ValidationProvider,
        ValidationObserver,
    },

    data() {
        return {
            userForm: {
                name: '',
                email: '',  
            },
            
            error: null,
        }
    },
     
    created () {
        this.userForm = JSON.parse(JSON.stringify(this.$store.getters.currentUser));
    },

    computed: {          
        currentUser(){
            return this.$store.getters.currentUser;
        },
    },

    methods: {
        getUser (){
            const token = this.$store.getters.currentUser.token
            axios.get('/api/auth/userprofile',{
                headers: {
                    Authorization: `Bearer ${token}`
                }
            })
            .then(response => {
                this.userForm= response.data.user;
            })
        },

        updateProfile () {
            const token = this.$store.getters.currentUser.token
            // console.log(this.$store.getters.currentUser.token)
            axios.put('/api/auth/update-profile', 
                {
                name: this.userForm.name,    
                email: this.userForm.email,
            },
            {
                headers: {
                    Authorization: `Bearer ${token}`,
                    "Content-Type": "application/json" // add content-type
                }
            })
                .then(response => {
                    this.userForm.name = response.data.name;
                    this.userForm.email = response.data.email; 
                    swal({
                        icon: "success",
                        text: "Update Succesfully!",
                    });   
                    // this.$store.commit('update');
                })
        }
    }    
}
</script>

store.js

import {getLoggedinUser} from './auth';
import {getUser} from './auth';
const user = getLoggedinUser();
const updateUser = getUser();

export default {
    state: {
        currentUser: user,
        isLoggedin: !!user,
        loading: false,
        auth_error: null,
        reg_error:null,
        registeredUser: null,
        update: null,
    },
    getters: {
        isLoading(state){
        return state.loading;
        },
        isLoggedin(state){
            return state.isLoggedin;
        },
        currentUser(state){
            return state.currentUser;
        },
        authError(state){
            return state.auth_error;    
        },
        regError(state){
            return state.reg_error;
        },
        registeredUser(state){
            return state.registeredUser;
        },
        update(state){
            return state.update;
        }
    },
    mutations: {
        login(state){
            state.loading = true;
            state.auth_error = null;
        },
        loginSuccess(state, payload){
            state.auth_error = null;
            state.isLoggedin = true;
            state.loading = false;
            state.currentUser = Object.assign({}, payload.user , {token: payload.access_token});
            localStorage.setItem("user", JSON.stringify(state.currentUser));
        },
        loginFailed(state, payload){
            state.loading = false;
            state.auth_error = payload.error;
        },
        logout(state){
            localStorage.removeItem("user");
            state.isLoggedin = false;
            state.currentUser = null;
        },
        registerSuccess(state, payload){
            state.reg_error = null;
            state.registeredUser = payload.user;
        },
        registerFailed(state, payload){
            state.reg_error = payload.error;
        },
        update(state, payload) {
            state.currentUser = payload.data;      
        }
    },
    actions: {
        login(context){
            context.commit("login");
        },
        // update(context){
        //     // state.currentUser.update(context);
        // }

    }
};

auth.js

export function registerUser(credentials){
  return new Promise((res,rej)=>{
      axios.post('/api/auth/register', credentials)
      .then(response => {
          res(response.data);
      })
      .catch(err => {
          rej('An error occured.. try again later.')
      })
  })
}

export function login(credentials){
  return new Promise((res,rej)=>{
      axios.post('/api/auth/login', credentials)
      .then(response => {
            setAuthorization(response.data.access_token);
            res(response.data);
      })
      .catch(err => {
          rej('Wrong Email/Password combination.')
      })
  })
}

export function getLoggedinUser(){
  const userStr = localStorage.getItem('user');

  if(!userStr){
      return null
  }

  return JSON.parse(userStr);
}

export function getUser(credentials){
  return new Promise((res,rej)=>{
    axios.get('/api/auth/userprofile', credentials)
    .then(response => {
          // setAuthorization(response.data.access_token);
          res(response.data);
    })
    .catch(err => {
        rej('No User')
    })
})
}

如果您有任何想法或解决方案,请帮助我。

【问题讨论】:

    标签: vue.js state vuex laravel-8


    【解决方案1】:

    您没有运行任何商店的分派。

    你已经定义了update突变,但是注释了它。

    取消注释

    // this.$store.commit('update')
    

    并像这样修改它:

    this.$store.commit('update', { data: response.data })
    

    接下来对您的登录请求执行相同的操作。

    【讨论】:

    • 您好,很抱歉回复晚了。如果方便,请指导我在 store.js 中应该做什么?因为我仍然对此感到困惑。供您参考,vuex代码来自一个教程网站,但我仍然不熟悉它。
    猜你喜欢
    • 2021-08-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-11
    • 2016-10-31
    • 1970-01-01
    • 2022-01-07
    • 2021-10-02
    • 2018-09-08
    相关资源
    最近更新 更多