#javascript #vue.js #firebase-authentication #vue-router
#javascript #vue.js #firebase-аутентификация #vue-маршрутизатор
Вопрос:
Я работаю над приложением vue на основе firebase, которое должно перенаправлять пользователей на домашнюю страницу после успешного входа в систему. Однако я не перенаправлен на домашний просмотр, как это должно быть. Он все еще зависает на странице входа в систему после успешного входа в систему.
this.$router.replace просто не работает, и я понятия не имею, почему.
main.js
import Vue from "vue";
import firebase from "firebase";
import App from "./App.vue";
import router from "./router";
import swalPlugin from './plugins/VueSweetalert2';
Vue.config.productionTip = false;
let app ='';
firebase.initializeApp( {
apiKey: "#",
authDomain: "#",
databaseURL: "#",
projectId: "#",
storageBucket: "#",
messagingSenderId: "#"
});
Vue.use(swalPlugin);
firebase.auth().onAuthStateChanged(() => {
if (!app) {
app = new Vue({
router,
render: h => h(App)
}).$mount("#app");
}
});
router.js
import firebase from 'firebase';
import Vue from "vue";
import Router from "vue-router";
import Home from "./views/Home.vue";
import Login from "./views/Login.vue";
import SignUp from "./views/SignUp.vue";
Vue.use(Router);
const router = new Router({
routes: [
{
path: '*',
redirect: '/login'
},
{
path: '/',
redirect: "/login"
},
{
path: '/login',
name: 'login',
component: Login
},
{
path: '/sign-up',
name: 'signUp',
component: SignUp
},
{
path: '/home',
name: 'home',
component: Home,
meta: {
requiresAuth: true
}
}
]
});
router.beforeEach ((to, from, next) => {
const currentUser = firebase.auth.currentUser;
const requiresAuth = to.matched.some (record => record.meta.requiresAuth);
if (requiresAuth amp;amp; !currentUser) next('login');
else if (!requiresAuth amp;amp; currentUser) next('home');
else next();
});
export default router;
Просмотр Login.vue
<template>
<form autocomplete="off">
<div class="login">
<h1>Login</h1>
<p>Sign in to stay updated with the latest news</p>
<hr>
<input type="text" placeholder="Email" v-model="email">
<input type="password" placeholder="Enter Password" v-model="password">
<hr>
<button @click="login">Login</button>
<p>Don't have an account yet? Create one <router-link to="/sign-up">here</router-link></p>
</div>
</form>
</template>
<script>
import firebase from 'firebase';
import Swal from 'sweetalert2';
export default {
name: 'login',
data() {
return {
email: '',
password: ''
}
},
methods: {
login: function(){
firebase.auth().signInWithEmailAndPassword(this.email, this.password).then(
(user) => {
this.$router.replace('home');
},
(err) => {
Swal.fire({
type: 'error',
title: 'An error occurred...',
text: err.message
})
}
);
}
}
}
</script>
Просмотр Home.vue
<template>
<div class="home">
<img alt="Vue logo" src="../assets/logo.png" />
<HelloWorld msg="Welcome to Your Vue.js App" />
<button @click="logout">Logout</button>
</div>
</template>
<script>
import firebase from "firebase";
import HelloWorld from "@/components/HelloWorld.vue";
export default {
name: "home",
components: {
HelloWorld
},
methods: {
logout: function(){
firebase.auth().signOut().then(() => {
this.$router.push ({name: 'login'})
})
}
}
};
</script>
Ответ №1:
Используйте router.push()
this.$router.push({name: 'home'});
Дайте мне знать, если это сработает!
Комментарии:
1. Я попробовал это.$router.push({name: ‘Регистрация’}), и это работает, после входа в систему он перенаправляет меня на страницу регистрации. Я думаю, что что-то на домашней странице блокирует меня
2. Домашний компонент выглядит нормально. Не могли бы вы, пожалуйста, указать регистратор, когда обещание будет выполнено в функции входа в Login.vue. Что это за регистрация — firebase.auth.CurrentUser
3. Нашел это .. Я изменил const CurrentUser = firebase.auth.CurrentUser на const CurrentUser = firebase.auth().CurrentUser внутри router.js .. Не могу поверить, сколько часов потрачено на это..
4. Отлично! Я также пропустил это.