Надеюсь, вы все в порядке. Я новичок, чтобы реагировать на редукционный мир. Я учусь и работаю над проектом регистрации вызовов. У меня есть несколько вопросов, и было бы здорово, если бы кто-нибудь подсказал мне, делаю ли я это неправильно, или подскажет альтернативу.
Я использую JWT для аутентификации пользователя. После проверки данных пользователя. Я отправляю действие успеха, а в редюсере я устанавливаю состояние «аутентифицировано истинно» и отвечаю. Я также сохраняю токен и срок действия в localStorage.
В корневом файле, который является индексным файлом. Я проверяю, существует ли токен в localStorage, и если да, то отправляю вход в действие.
Все работает. Но я теряю другие значения, такие как ответ сервера. Когда он вошел в систему в первый раз. Как я могу справиться с этой проблемой?
Во-вторых, в правом верхнем углу есть начальный значок пользователя. Я получаю инициал, когда пользователь входит в систему, и он сохраняется в состоянии аутентификации. он работает нормально, но еще раз, если я обновляю страницу, она становится нулевой, и я теряю этот начальный код.
поэтому я попробовал другой способ и сохранил исходный файл в localStorage. Но панель навигации уже отображается на экране, и я не вижу инициалов, пока не обновлю страницу.
Я передал новый ключ в mapStateToProps. ii и сохранил в нем исходный файл из localStorage, и он работает нормально. Это правильный способ сделать это???
С уважением Встретить
const SignedInLinks = (props) => {
return (
<ul className = "right">
<li><NavLink to = "/signin" onClick=
{props.signOut}>Log Out</NavLink></li>
<li><NavLink className = "btn btn-floating pink lighten-1" to = "/">
{props.ii ? props.ii : null }
</NavLink></li>
</ul>
)}
const mapStateToProps = state => {
return {
auth: state.auth,
ii: window.localStorage.getItem('ui')
}
}
export default connect(mapStateToProps, { signOut })(SignedInLinks);




![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вместо того, чтобы использовать localStorage в mapStateToProps, инициализируйте свое состояние ii в своем редюсере, соответствующем этому состоянию, а затем передайте его своему компоненту через mapStateToProps. Что-то вроде этого.
const iiReducer = (state = window.localStorage.getItem('ui') || false, action) => {
/*.
.
. Other Logic
.
.*/
return state
}
а затем используйте его как обычно, как в магазине
const mapStateToProps = state => {
return {
auth: state.auth,
ii: state.ii
}
}
Надеюсь это поможет !
Я считаю, что у меня есть представление о том, в чем проблема (я тоже новичок в реагировании и редуксе, так что скажите мне, если я говорю ерунду).
Вы говорите, что храните токен в локальном хранилище (рекомендуется не делать этого, кстати, рекомендуется хранить его в файле cookie), и если в локальном хранилище найден действительный токен, вы входите в систему. Я предполагаю, что вы сохраняете ответ от сервера (включая значок) в состоянии приложения или в хранилище избыточности? Если это так, эта информация будет удалена при обновлении браузера (f5), поэтому больше не загружается.
Решение состоит в том, чтобы убедиться, что соответствующие данные загружаются при монтировании компонента, поэтому в вашем методе componentDidMount (если у вас его нет, создайте его) и установите состояние в этом методе.
Я храню ответ в хранилище избыточности. исходное состояние моего редуктора - const initState = { authError: null, authentication: false, data: {}, error: {}, msg: {} }; если успешно, то аутентифицировано: true, если нет, то authError: "вход не выполнен"
Вы не говорите глупости, приятель :) Я не уверен, какой из них является рекомендуемым способом хранения токена. Во многих статьях некоторые говорят, что нужно использовать localStorage, а в других — cookie. Я предпочитаю использовать sessionStorage, но не думаю, что здесь это необходимо. Вт