محمود سعداوي2 نشر 30 سبتمبر 2023 أرسل تقرير نشر 30 سبتمبر 2023 السلام عليكم. أواجه في التنقل بين الصفحات حيث يتوجب علي تحديث الصفحة كلما أردت الحصول على الصفحة المطلوبة function App() { const user = JSON.parse(localStorage.getItem('user')) return ( <Router> <Routes> <Route path='/' element={user ? <Chat/> : <Navigate to='/login'/>} /> <Route path="/login" element={ !user ? <Login/> : <Navigate to='/' />}/> <Route path="/register" element={ !user ? <Register/> : <Navigate to='/login'/> }/> <Route path= "/*" element={ <NotFound/> }/> </Routes> </Router> ); } في هذا المثال مثلا لا يمكن لصفحة تسجيل الدخول بعد النقر على تسجيل الخروج إلا بعد تحديث الصفحة. كذلك بعد تسجيل الدخول لا يمككن التنقل لصفحة المحادثة إلا بعد تحديث الصفحة Login import React, { useState } from 'react' import { Card, Input, Button, Form } from 'reactstrap' import { Link, useNavigate } from 'react-router-dom'; import Error from '../components/Error'; import axios from 'axios' function Login() { const [error, setError] = useState('') const navigate = useNavigate(); const [formData, setFormData] = useState({ name: '', password: '' }) const { name, password } = formData const onChange = (e) => { setFormData({...formData, [e.target.name]: e.target.value}) } const onSubmit = async e => { e.preventDefault() axios.post('/api/auth/login', formData) .then(res => { localStorage.setItem("user", JSON.stringify(res.data)); navigate("/") }) .catch(error => setError(error.response.data.message)) } return ( <Card className="auth col-lg-3 col-sm-6"> <Form onSubmit={onSubmit}> <img src="" alt="" width="200" /> <h5 className="mb-4"> تسجيل الدخول</h5> <Error error={error} /> <Input value={name} name="name" onChange={onChange} placeholder="الاسم" required autoFocus /> <Input type="password" value={password} name="password" onChange={onChange} placeholder="كلمة المرور" required /> <Button color="primary" block className="mb-3"> {" "} تسجيل الدخول{" "} </Button> <small> <Link to="/register">إنشاء حساب جديد</Link> </small> <p className="m-3 text-muted">© {new Date().getFullYear()}</p> </Form> </Card> ); } export default Login Logout import React, {useEffect} from 'react' import { Row, DropdownItem, DropdownMenu, DropdownToggle, Nav, UncontrolledDropdown} from "reactstrap"; import Avatar from '../Avatar'; import { Navigate, useNavigate } from 'react-router-dom'; function ChatHeader({ receiver, users }) { const navigate = useNavigate() // Find Receiver Avatar const receiverAvatar = users.find(u=> u._id === receiver?._id) // logout const logout = () => { navigate('/login') localStorage.clear() } // useEffect(()=>{ // logout() // }, []) return ( <div> <Row className="heading m-0"> <div // onClick={props.toggle} > <Avatar src={receiverAvatar?.avatar} /> </div> <div className="text-right"> <div>{receiver ? receiver.name : ''}</div> {/* <small>{status()}</small> */} </div> <Nav className="mr-auto" navbar> <UncontrolledDropdown> <DropdownToggle tag="a" className="nav-link"> <i className="fa fa-ellipsis-v" /> </DropdownToggle> <DropdownMenu> <DropdownItem >تغيير كلمة المرور</DropdownItem> <DropdownItem divider /> <DropdownItem onClick={()=>logout()}>تسجيل الخروج</DropdownItem> </DropdownMenu> </UncontrolledDropdown> </Nav> </Row> </div> ) } export default ChatHeader شكرا على المساعدة 1 اقتباس
0 Mohamed Selem2 نشر 30 سبتمبر 2023 أرسل تقرير نشر 30 سبتمبر 2023 السلام عليكم. أقترح عليك حل وهو استخدام local state بدلا من localStorage وممكن استخدام state عند تسجيل الدخول وازالتها عند تسجيل الخروج. في الـ "App" المستخدم لإعداد مسارات التطبيق، استخدام الState لتحديد هل المستخدم قيد تسجيل الدخول أم لا، ثم استخدم هذه الحالة لعرض المكون المناسب على أساس حالة تسجيل الدخول. اليك الكود: import React, { useState } from 'react'; import { BrowserRouter as Router, Routes, Route, Navigate } from 'react-router-dom'; import Login from './Login'; import Chat from './Chat'; import Register from './Register'; function App() { const [isLoggedIn, setIsLoggedIn] = useState(!!JSON.parse(localStorage.getItem('user'))); const handleLogin = () => { setIsLoggedIn(true); } const handleLogout = () => { localStorage.removeItem('user'); setIsLoggedIn(false); } return ( <Router> <Routes> <Route path='/' element={isLoggedIn ? <Chat onLogout={handleLogout} /> : <Navigate to='/login' />} /> <Route path="/login" element={!isLoggedIn ? <Login onLogin={handleLogin} /> : <Navigate to='/' />} /> <Route path="/register" element={!isLoggedIn ? <Register /> : <Navigate to='/login' />} /> </Routes> </Router> ); } export default App; 1 اقتباس
0 Hessen Nasser نشر 30 سبتمبر 2023 أرسل تقرير نشر 30 سبتمبر 2023 لمشكلة التي تواجهها تحدث بسبب استخدام متغير localStorage لتخزين معلومات تسجيل الدخول، وعدم تحديث الصفحة بشكل تلقائي بعد تسجيل الدخول أو تسجيل الخروج. لحل هذه المشكلة، يمكنك استخدام React Router لإعادة توجيه المستخدم تلقائيًا بعد تسجيل الدخول أو تسجيل الخروج. اولا في مكان استجابة نجاح تسجيل الدخول في ملف Login قم بتحديث الصفحة باستخدام navigate من React Router بعد تعيين البيانات في localStorage. قد يكون لديك شيء مشابه للتالي: const onSubmit = async e => { e.preventDefault(); axios.post('/api/auth/login', formData) .then(res => { localStorage.setItem("user", JSON.stringify(res.data)); navigate("/", { replace: true }); // قم بتحديث الصفحة بشكل تلقائي بدون إضافة سجل إلى سجل التصفح }) .catch(error => setError(error.response.data.message)); } ثاميا في مكان تنفيذ عملية تسجيل الخروج (مثل ملف Logout الذي قدمته)، قم بحذف البيانات من localStorage ومن ثم قم بتوجيه المستخدم إلى صفحة تسجيل الدخول باستخدام navigate: const logout = () => { localStorage.removeItem("user"); // قم بحذف البيانات من localStorage navigate('/login', { replace: true }); // قم بتحديث الصفحة بشكل تلقائي بدون إضافة سجل إلى سجل التصفح } بهذه الطريقة سيتم تحديث الصفحة بشكل تلقائي بعد تسجيل الدخول أو تسجيل الخروج دون الحاجة إلى إعادة تحميل الصفحة يدويًا. اقتباس
السؤال
محمود سعداوي2
السلام عليكم.
أواجه في التنقل بين الصفحات حيث يتوجب علي تحديث الصفحة كلما أردت الحصول على الصفحة المطلوبة
في هذا المثال مثلا لا يمكن لصفحة تسجيل الدخول بعد النقر على تسجيل الخروج إلا بعد تحديث الصفحة.
كذلك بعد تسجيل الدخول لا يمككن التنقل لصفحة المحادثة إلا بعد تحديث الصفحة
Login
Logout
شكرا على المساعدة
2 أجوبة على هذا السؤال
Recommended Posts
انضم إلى النقاش
يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.