Reactjs: проблема при обновлении контекстного API, общего для нескольких компонентов

#reactjs #react-hooks #use-state #react-component #context-api

#reactjs #реагирующие крючки #состояние использования #реагирующий компонент #реагировать-контекст

Вопрос:

В моем приложении react у меня есть страница входа в систему и панель мониторинга. Я хочу отобразить имя пользователя, полученное со страницы входа в панель управления с помощью контекстного API.

Ниже приведен мой App.js код:

 import React from 'react';
import {
  BrowserRouter as Router,
  Route
} from 'react-router-dom';
import Dashboard from './Dashboard';
import Login from './Login'


import {UserContextProvider} from './context/UserContextManagement'
const DashboardPage = () => (<Dashboard />);

const LoginPage = () => (<Login />);

function App() {
  return (
    
      <Router>
      <UserContextProvider>
        <Route path="/login" component={LoginPage} />
        <Route path="/dashboard" component={DashboardPage} />
        
        </UserContextProvider>
      
      </Router>
  );
}

export default App;
 

Ниже приведен мой Login.js Код:

 import {UserContext} from '../../context/UserContextManagement'

function Login() {

const {setUsernm}=React.useContext(UserContext);

        const handleSubmit = (e) => {
        e.preventDefault(); 
        window.location = '/dashboard';
      }


  return (
    <div>
        <form>
          <input type="text" onChange={e => {setUsernm(e.target.value)}}/>
          <input type="text" onChange={e => setPwd(e.target.value)} />
          <button type="submit">Sign In </button>
        </form>
      </div>
  );
}

export default Login;
 

Ниже приведено мое управление UserContextManagement:

 import React,{useState} from 'react'

export const UserContext = React.createContext();

//Customised Provider
export const UserContextProvider = ({children}) => {
    const [usernm, setUsernm] = useState("invalid"); //Due to Usestate, value is resetted
 
    return (
        <UserContext.Provider value={{ usernm: usernm, setUsernm: setUsernm }}>
            {children}
        </UserContext.Provider>
    )
}
 

Проблема: я могу обновить имя пользователя, используя setUsernm в login.js файл, но поскольку оба login.js и dashboard.js является ли маршрут в App.js используя то же UserContextProvider самое . UserContextProvider выполняется снова при перенаправлении с входа на панель мониторинга и из-за useState инициализации usernm сбрасывается в состояние по умолчанию, т. Е. Недопустимо.

Как определить useState таким образом, чтобы имя пользователя не сбрасывалось до значения по умолчанию?

Комментарии:

1. useState не сбрасывает значение, поскольку оно инициализируется этим значением только один раз при начальной загрузке приложения, поскольку оно находится в контексте. Он должен работать так, как вы намереваетесь, если ваше приложение не перезагружается. Возможно, это что-то в вашем Dashboard.js , что вызывает ошибку. Кстати, присвоение имени переменной usernm имени пользователя — плохая практика. Вы должны просто назвать его username . Это ничего не помогает назвать, usernm и это затрудняет чтение вашего кода. Сокращение подобных вещей, как правило, является плохой идеей. Лучше иметь читаемый код, чем сохранять два символа.

Ответ №1:

Нам также нужно будет просмотреть ваш компонент входа в систему, потому что, похоже, он работает так, как задумано?

Может быть, ваше приложение перезагружается, поэтому контекст теряется?

Codesandbox

Для перенаправления вы должны использовать функции react-router-dom.

Ваш логин должен быть повторно собран :

 import { useHistory } from 'react-router-dom'
function Login() {
   let history = useHistory()
   let {setUsername} = useContext(UserContext)

   function handleSubmit(e) {
     e.preventDefault(); 
     // Do the things you need
     history.push('/dashboard')
   }
   return (
   <div>
       <form>
         <input type="text" onChange={e => {setUsername(e.target.value)}}/>
         <input type="password" onChange={e => setPwd(e.target.value)} /> // Use password type
         <button type="submit" onClick={(e) => handleSubmit(e)>Sign In </button> // Probably gonna need to attach the function to onClick
       </form>
     </div>
   );
}
 

Документация в React-Router

Комментарии:

1. Я отредактировал свой вопрос и добавил login.js код. Не могли бы вы мне помочь?

2. Вы были правы, мое приложение перезагружалось, поэтому контекст был потерян. Я исправил это. Большое вам спасибо. Кроме того, я отредактировал свой login.js код. Дайте мне знать, есть ли лучший способ перенаправить из обработчика событий отправки. Еще раз, большое вам спасибо.

3. Я отредактировал, чтобы включить, как перейти на другую страницу / url @Purva Если вы посмотрите мой codesandbox, вы также заметите несколько вещей. Вам не нужно usernm: usernm , вам просто нужно usernm . Вы также должны назвать его username , чтобы его было легче читать. В любом случае у нас есть автозаполнение, так что писать больше не имеет большого значения 🙂 Вам также не нужно создавать функцию для передачи ваших компонентов в маршрут. При импорте это уже компонент, поэтому вы можете просто передать его (или сделать то, что я сделал в codesandbox)