اذهب إلى المحتوى
  • 0

التنقل بين الصفحات باستعمال react router dom v6

محمود سعداوي2

السؤال

السلام عليكم.

أواجه في التنقل بين الصفحات حيث يتوجب علي تحديث الصفحة كلما أردت الحصول على الصفحة المطلوبة

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>
  );
}

Capture.JPG.c63f1fc88733232f08ac075fc0286b84.JPGفي هذا المثال مثلا لا يمكن لصفحة تسجيل الدخول بعد النقر على تسجيل الخروج إلا بعد تحديث الصفحة.

كذلك بعد تسجيل الدخول لا يمككن التنقل لصفحة المحادثة إلا بعد تحديث الصفحة

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">&copy; {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

شكرا على المساعدة

رابط هذا التعليق
شارك على الشبكات الإجتماعية

Recommended Posts

  • 0

السلام عليكم.
أقترح عليك حل وهو استخدام 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;

 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0

لمشكلة التي تواجهها تحدث بسبب استخدام متغير 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 }); // قم بتحديث الصفحة بشكل تلقائي بدون إضافة سجل إلى سجل التصفح
}

 بهذه الطريقة سيتم تحديث الصفحة بشكل تلقائي بعد تسجيل الدخول أو تسجيل الخروج دون الحاجة إلى إعادة تحميل الصفحة يدويًا.

رابط هذا التعليق
شارك على الشبكات الإجتماعية

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...