#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:
Нам также нужно будет просмотреть ваш компонент входа в систему, потому что, похоже, он работает так, как задумано?
Может быть, ваше приложение перезагружается, поэтому контекст теряется?
Для перенаправления вы должны использовать функции 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>
);
}
Комментарии:
1. Я отредактировал свой вопрос и добавил login.js код. Не могли бы вы мне помочь?
2. Вы были правы, мое приложение перезагружалось, поэтому контекст был потерян. Я исправил это. Большое вам спасибо. Кроме того, я отредактировал свой login.js код. Дайте мне знать, есть ли лучший способ перенаправить из обработчика событий отправки. Еще раз, большое вам спасибо.
3. Я отредактировал, чтобы включить, как перейти на другую страницу / url @Purva Если вы посмотрите мой codesandbox, вы также заметите несколько вещей. Вам не нужно
usernm: usernm
, вам просто нужноusernm
. Вы также должны назвать егоusername
, чтобы его было легче читать. В любом случае у нас есть автозаполнение, так что писать больше не имеет большого значения 🙂 Вам также не нужно создавать функцию для передачи ваших компонентов в маршрут. При импорте это уже компонент, поэтому вы можете просто передать его (или сделать то, что я сделал в codesandbox)