# #javascript #reactjs #firebase #firebase-authentication #react-router
Вопрос:
ОТРЕДАКТИРУЙТЕ, ЧТОБЫ ДОБАВИТЬ ДЕТАЛИ
Приложение должно быть запущено со страницы с формой, введите адрес электронной почты и пароль, и при входе в систему мы попадем на экран меню, который я показываю на скриншоте. Однако, когда я ввожу адрес электронной почты и пароль, приложение не перемещается. Журнал работает, потому что а consolelog()
показывает его мне
Это второй скриншот
Я не понимаю, в чем я ошибся. Теперь я показываю измененные App.js файл для отображения формы, но когда я регистрируюсь, приложение не попадает в меню, страница <Sidebar />
архиво App.js модификадо
import React, { useState, useEffect } from 'react'
import { Routes, Route } from 'react-router'
import firebase, { FirebaseContext } from './firebase'
//import { auth } from 'firebase'
import firebaseObj from './firebase'
import Ordenes from './components/paginas/Ordenes'
import Menu from './components/paginas/Menu'
import NuevoPlato from './components/paginas/NuevoPlato'
import Sidebar from './components/ui/Sidebar'
import Signin from './components/Signin'
const auth = firebaseObj.auth
function App() {
const [user, setUser] = useState(null)
useEffect(() => {
const unsubscribe = auth.onAuthStateChanged(userAuth => {
const user = {
uid: userAuth?.uid,
email: userAuth?.email
}
if (userAuth) {
console.log(userAuth)
setUser(user)
} else {
setUser(null)
}
})
return unsubscribe
}, [])
return (
<FirebaseContext.Provider
value={{
firebase
}}
>
<div className="md:flex min-h-screen" >
<div className="md:w-2/5 xl:w-4/5 p-6">
<Routes>
<Route path="/" element={<Signin />} />
<Route path="/sidebar" element={<Sidebar />} />
<Route path="/ordenes" element={<Ordenes />} />
<Route path="/menu" element={<Menu />} />
<Route path="/nuevo-plato" element={<NuevoPlato />} />
</Routes>
</div>
</div>
</FirebaseContext.Provider>
)
}
export default App
Я создал веб-приложение с помощью React (https://github.com/facebook/create-react-app. — npx создать-реагировать-приложение мое-приложение)
Это простое приложение с тремя экранами: Главный, Меню, Новые товары Приложение, которое показывает список товаров из магазина, откуда пользователь может добавить больше товаров. Закончив, я решил, что регистрация по электронной почте обязательна для того, чтобы просматривать контент и иметь возможность добавлять продукты. Я добавил соответствующую конфигурацию для входа в систему через Firebase, приложение всегда запускается напрямую, хотя в нем отображается регистрационная форма.
Конфигурация App.js это правильно, но я не знаю, как сделать так, чтобы мое приложение начиналось с входа в систему, и как только были введены адрес электронной почты и имя пользователя, я был отправлен в приложение
Я попробовал несколько способов, и во всех из них он запускает приложение напрямую. Я добавил подпись к App.js, но мне нужно посмотреть, что App.js показывает, что необходимо ввести адрес электронной почты и пароль. Теперь есть меню приложения
Файл App.js
import React, { useState, useEffect } from 'react'
import { Routes, Route } from 'react-router'
import firebase, { FirebaseContext } from './firebase'
//import { auth } from 'firebase'
import firebaseObj from './firebase'
import Ordenes from './components/paginas/Ordenes'
import Menu from './components/paginas/Menu'
import NuevoPlato from './components/paginas/NuevoPlato'
import Sidebar from './components/ui/Sidebar'
import Signin from './components/Signin'
const auth = firebaseObj.auth
function App() {
const [user, setUser] = useState(null)
useEffect(() => {
const unsubscribe = auth.onAuthStateChanged(userAuth => {
const user = {
uid: userAuth?.uid,
email: userAuth?.email
}
if (userAuth) {
console.log(userAuth)
setUser(user)
} else {
setUser(null)
}
})
return unsubscribe
}, [])
return (
<FirebaseContext.Provider
value={{
firebase
}}
>
<div className="md:flex min-h-screen" >
<Sidebar />
<div className="md:w-2/5 xl:w-4/5 p-6">
<Routes>
<Route path="/" element={<Ordenes />} />
<Route path="/menu" element={<Menu />} />
<Route path="/nuevo-producto" element={<NuevoProducto />} />
</Routes>
</div>
</div>
</FirebaseContext.Provider>
)
}
export default App
Файл Signin.js
import React, { useRef } from 'react'
//import { auth } from '../firebase'
import firebaseObj from '../firebase/firebase'
const auth = firebaseObj.auth
const Signin = () => {
const emailRef = useRef(null);
const passwordRef = useRef(null);
const signUp = e => {
e.preventDefault();
auth.createUserWithEmailAndPassword(
emailRef.current.value,
passwordRef.current.value
).then(user => {
console.log(user)
}).catch(err => {
console.log(err)
})
}
const signIn = e => {
e.preventDefault();
auth.signInWithEmailAndPassword(
emailRef.current.value,
passwordRef.current.value
).then(user => {
console.log(user)
}).catch(err => {
console.log(err)
})
}
return (
<div className="mb-4">
<form action="">
<h1>Sign in</h1>
<input
className="shadow appearance-none border rounded w-full py-2 px-3 text-gray-700 leading-tight focus:outline-none focus:shadow-outline"
ref={emailRef} type="email" placeholder="email"/>
<input
className="shadow appearance-none border rounded w-full py-2 px-3 text-gray-700 leading-tight focus:outline-none focus:shadow-outline"
ref={passwordRef} type="password" />
<button onClick={signIn}>Sign in </button>
</form>
</div>
)
}
export default Signin
Комментарии:
1. Что вы имеете в виду, говоря «Приложение запускается непосредственно после того, как оно показывает регистрационную форму»? У вас есть какие-нибудь скриншоты и немного больше объяснений, как он должен себя вести и как он ведет себя сейчас?
2. Спасибо @TarikHuber и извините за задержку. Приложение должно запуститься на странице формы для ввода электронной почты и пароля, и как только это будет сделано, оно должно привести меня к экрану меню. Но я создал приложение, а затем добавил метод входа в систему, и я не могу его реализовать
Ответ №1:
Причина, по которой вы не попадаете на SignIn
страницу после регистрации, заключается в том, что для этого нет логики. Если вы сделаете просто простое утверждение «если», как здесь, оно должно сработать:
import React, { useState, useEffect } from "react";
import { Routes, Route } from "react-router";
import firebase, { FirebaseContext } from "./firebase";
//import { auth } from 'firebase'
import firebaseObj from "./firebase";
import Ordenes from "./components/paginas/Ordenes";
import Menu from "./components/paginas/Menu";
import NuevoPlato from "./components/paginas/NuevoPlato";
import Sidebar from "./components/ui/Sidebar";
import Signin from "./components/Signin";
const auth = firebaseObj.auth;
function App() {
const [user, setUser] = useState(null);
useEffect(() => {
const unsubscribe = auth.onAuthStateChanged((userAuth) => {
const user = {
uid: userAuth?.uid,
email: userAuth?.email,
};
if (userAuth) {
console.log(userAuth);
setUser(user);
} else {
setUser(null);
}
});
return unsubscribe;
}, []);
if (!user) {
return (
<div className="md:flex min-h-screen">
<div className="md:w-2/5 xl:w-4/5 p-6">
<Signin />
</div>
</div>
);
} else {
return (
<FirebaseContext.Provider
value={{
firebase,
}}
>
<div className="md:flex min-h-screen">
<div className="md:w-2/5 xl:w-4/5 p-6">
<Routes>
<Route path="/" element={<Sidebar />} />
<Route path="/sidebar" element={<Sidebar />} />
<Route path="/ordenes" element={<Ordenes />} />
<Route path="/menu" element={<Menu />} />
<Route path="/nuevo-plato" element={<NuevoPlato />} />
</Routes>
</div>
</div>
</FirebaseContext.Provider>
);
}
}
export default App;
Это просто для примера. Я бы рекомендовал поместить прослушиватель состояния аутентификации в поставщика и создать пользовательские маршруты, которые автоматически перенаправляют на SignIn
страницу, если пользователь не вошел в систему.
Здесь у вас есть пример такого Провайдера, которого я использую в каждом из своих проектов.
Вот пример тех пользовательских маршрутов, которые прослушивают этот провье.
Комментарии:
1. Спасибо @TariKHuber . Я протестировал ваш код, но приложение начинается с пустой страницы. Это работает, потому что console.log (UserAuth) в строке 24 показывает пользователя, зарегистрированного в firebase, но экран пуст. Цель состоит в том, чтобы при запуске приложения отображалась форма, и когда я ввожу правильный адрес электронной почты и пароль, она переходит на </ Боковую панель>. Ваши примеры очень интересны, но, насколько мне известно, они все еще несколько сложны. Я стараюсь узнать каждого немного больше. Я видел ваши работы, и это потрясающе
2. Тнх. Я обновил код. Можете ли вы, пожалуйста, попробовать это с помощью этого.
3. Есть ли у вас проблема с сохранением состояния аутентификации после повторного посещения страницы?
4. Нет никаких проблем, все работает идеально. Мне нужна была только кнопка, чтобы закрыть сеанс, когда пользователь закончит работу в приложении. Таким образом, панель администратора не открыта, я добавил кнопку на
</ Sidebar>
экране, чтобы отключаться всякий раз, когда захочу. Есть ли способ, чтобы приложение вернулось наSignin
страницу через определенное время?5. Спасибо. Рад слышать, что я мог бы помочь 🙂