#javascript #mern
#javascript #mern
Вопрос:
Я получаю сообщение об ошибке при демонстрации одного продукта на экране, ошибка указывается как-
Unhandled Rejection (TypeError): Cannot read properties of undefined (reading 'params')
Код, вызывающий ошибку, является
function ProductScreen({ match }) {
const [product, setProduct] = useState({})
useEffect(() => {
const fetchProduct = async () => {
const { data } = await axios.get(`/api/products/${match.params.id}`)
setProduct(data)
}
fetchProduct()
}, [match])
Я предполагаю, что ошибка match.params.id , Но мне трудно устранить ошибку.Кто-нибудь может знать исправление этой ошибки?
Комментарии:
1. Какую
react-rotuer-dom
версию вы используете?? Если вы используетеv6
, то оно не проходитhistoryProps
.2. Ну, текущая версия, которую я использую, — » «react-router-dom»: «^ 6.0.2″, »
Ответ №1:
Вы передали props в ProductScreen
, но props.match
не определено.
Попробуйте указать props.match
непустое значение, тогда оно должно работать.
Комментарии:
1. Я попытался указать конкретный идентификатор вместо ‘$ {match.params.id }’, это сработало, но так как будут разные продукты, и мы не можем открыть конкретный продукт для всех из них
Ответ №2:
Затем используйте другие способы, такие как useNavigate
hook, для доступа к истории и навигации. Обратитесь к официальному документу. v6.0.2
не передает реквизиты истории и in match.params.id
, match
is undefined
, и именно поэтому вы получаете эту ошибку, когда пытаетесь получить доступ match.params
, поскольку undefined
не можете иметь свойство.
Вы должны обработать это по-другому.
Приведенный выше код показывает ошибку — «‘data’ не определен.eslintno-undef» и «‘data’ объявлен, но его значение никогда не считывается.ts(6133) «
Вы получаете эту ошибку, потому const
что block scoped
if (match) {
const { data } = await axios.get(`/api/products/${match.params.id}`)
}
setProduct(data)
Константы ограничены областью блока, так же, как переменные, объявленные с использованием ключевого слова let . Значение константы не может быть изменено путем переназначения (т. Е. С помощью оператора присваивания), и оно не может быть повторно объявлено (т. Е. Через объявление переменной).
Вы можете справиться с этим с помощью,
let data;
if (match) {
({ data } = await axios.get(`/api/products/${match.params.id}`))
}
setProduct(data)
Я бы посоветовал вам ознакомиться с основами для лучшего понимания.