我正在和Reaction一起做一个项目,我正在做一个简单的history.push()
,只是为了导航到另一个组件.除了导航到另一个组件之外,我还希望使用history.push({state: []})
来获取一些数据.
要访问另一个组件的数据,我使用useLocation()
并使用Location.State访问它.
我在应用程序上切换了语言(语言逻辑设置为setLocalStorage()
),突然location.state
得到了undefined
.
我在一些文章中读到location.state
在重新渲染时得不到定义.我没有找到明确规定这一点的东西,甚至在react-router-dom
文档中也没有.同样,当我重新加载页面时,location.state
不会变成undefined
.
我的问题是,为什么在重新呈现页面时会发生这种情况. 这样传递数据是不是最好的做法?如果不是,将其传递给另一个组件以避免这些错误的最佳实践是什么?
下载中心
import React, { useState } from 'react';
import { Link } from 'react-router-dom';
import { Dropdown } from 'react-bootstrap';
import classNames from 'classnames';
import enFlag from './flags/uk.jpg';
import italyFlag from './flags/italy.jpg';
import { useTranslation } from 'react-i18next';
// get the languages
const Languages = [
{
name: 'English',
flag: enFlag,
short_name: 'en'
},
{
name: 'Italian',
flag: italyFlag,
short_name: 'it'
}
];
const 下载中心 = () => {
const [dropdownOpen, setDropdownOpen] = useState<boolean>(false);
const [selectedLanguage, setSelectedLanguage] = useState(
localStorage.getItem('defaultLang') !== null
? Languages.find(function (item: { name: string; flag: string; short_name: string }) {
return item.short_name == localStorage.getItem('defaultLang');
})
: Languages[0]
);
const [t, i18n] = useTranslation('common');
/*
* toggle language-dropdown
*/
const toggleDropdown = () => {
setDropdownOpen(!dropdownOpen);
};
const changeLanguage = async (lang: any) => {
i18n.changeLanguage(lang.short_name);
setSelectedLanguage(lang);
localStorage.setItem('defaultLang', lang.short_name);
};
return (
<Dropdown show={dropdownOpen} onToggle={toggleDropdown}>
<Dropdown.Toggle
id='dropdown-languages'
as='a'
onClick={toggleDropdown}
className={classNames('nav-link waves-effect waves-light', {
show: dropdownOpen
})}>
<img src={selectedLanguage.flag} alt={selectedLanguage.name} height='16' />
</Dropdown.Toggle>
<Dropdown.Menu className='dropdown-menu dropdown-menu-end'>
<div onClick={toggleDropdown}>
{(Languages || []).map((lang, i) => {
return (
<Link
to='#'
onClick={() => changeLanguage(lang)}
className='dropdown-item notify-item'
key={i + '-lang'}>
<img src={lang.flag} alt={lang.name} className='me-1' height='12' />
<span className='align-middle'>{lang.name}</span>
</Link>
);
})}
</div>
</Dropdown.Menu>
</Dropdown>
);
};
export default 下载中心;