React.js, как получить свойства в пути URL?

Я пытаюсь получить uid и токен через путь URL-адреса, используя match в моем приложении React. Но я получил ошибку:

Uncaught TypeError: n не определен

и это мой фрагмент кода:

const ResetPasswordConfirm = ( {match, reset_password_confirm} ) => {
    ...
    const onSubmit = e=> {
    e.preventDefault();

    const uid = match.params.uid;
    const token = match.params.token;

    reset_password_confirm(uid, token, new_password, re_new_password);
    setRequestSent(true);
    };
};

Согласно этой теме: https://stackoverflow.com/questions/70609785/uncaught-typeerror-match-is-undefined#:~:text=react%2Drouter%2Ddom%20v5,render%20or%20children%20prop% 20 функций. В нем говорится, что это может иметь какое-то отношение к версии реактивного маршрутизатора, поэтому я попытался использовать useParams(), но мне было трудно его реализовать...

Я также пытался использовать matchPath, но могу найти несколько примеров.

Может ли кто-нибудь помочь мне с этой проблемой, пожалуйста?

Обновлять:

версия реактивного маршрутизатора: 6.8.0

ResetPasswordConfirm работает в моем контейнерном пакете.

import React, { useState } from "react";
import { Navigate, useParams } from 'react-router-dom';
import { connect } from 'react-redux';
import { reset_password_confirm } from '../actions/auth';

const ResetPasswordConfirm = ( {match, reset_password_confirm} ) => {

    const [requestSent, setRequestSent] = useState(false);
    const [formData, setFormData] = useState({
        new_password: '',
        re_new_password: ''
    });
    
const { new_password, re_new_password } = formData;

const onChange = e => setFormData({ ...formData, [e.target.name]: e.target.value });

const onSubmit = e=> {
    e.preventDefault();

    const uid = match.params.uid;
    const token = match.params.token;

    reset_password_confirm(uid, token, new_password, re_new_password);
    setRequestSent(true);
};

// Is the user sending the request?
// Redirect them to the home page
if (requestSent) {
    return <Navigate to='/'/>
}

return (
  <div className = "container mt-5">
    <form onSubmit = {e => onSubmit(e)}>
        {/* <div className = "form-group">
            <input className = "form-control" type = "email" placeholder = "Email" name = "email" value = {email} onChange = {e => onChange(e)} required></input>
        </div>
        <div className = "form-group">
            <input className = "form-control" type = "password" placeholder = "Password" name = "password" value = {password} onChange = {e => onChange(e)} minLength='6' required></input>
        </div>
        <button className = "btn btn-primary" type = "submit">Login</button> */}
        <div className = "form-group">
            <label htmlFor = "exampleInputPassword1">Password</label>
            <input 
            type = "password" 
            className = "form-control" 
            id = "exampleInputPassword1" 
            placeholder = "New Password"
            name = "new_password"
            value = {new_password}
            onChange = {e => onChange(e)}
            minLength='6'
            required></input>
        </div>
        <div className = "form-group">
            <label htmlFor = "exampleInputPassword1">Password</label>
            <input 
            type = "password" 
            className = "form-control" 
            id = "exampleInputPassword1" 
            placeholder = "Confirm New Password"
            name = "re_new_password"
            value = {re_new_password}
            onChange = {e => onChange(e)}
            minLength='6'
            required></input>
        </div>
        <button type = "submit" className = "btn btn-primary">Reset Password</button>
    </form>
  </div>  
);
};

export default connect(null, { reset_password_confirm }) (ResetPasswordConfirm);

Извините за вопрос о лоу-фай. Я постараюсь сделать лучше.

Я попытался использовать useParams для получения своего uid.

const onSubmit = e => {
...
let{uid} = useParams()
}

В чем именно проблема, которая не решена, следуя сообщению, на которое вы ссылаетесь? Где рендерится ResetPasswordConfirm и какая версия react-router-dom установлена? Можете ли вы отредактировать , чтобы включить эти детали и более полный минимально воспроизводимый пример?

Drew Reese 31.01.2023 10:20

Вы также можете найти этот ответ полезным.

Drew Reese 31.01.2023 10:23

Привет @DrewReese, спасибо за ваш ответ, извините за мой неясный вопрос, я только что отредактировал его. Я просмотрел этот документ, reactrouter.com/en/main/hooks/use-params. Но кажется, я не использовал его правильно

xi chen 31.01.2023 10:49
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
4
55
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В react-router-dom маршрутизируемых компонентах больше нет пропсов маршрута, т. е. нет вложенных пропсов match. Вы будете использовать хук useParams для доступа к параметрам пути маршрута в RRDv6. Вы не можете использовать хуки React во вложенных обратных вызовах, они должны вызываться в теле функции компонента React или в пользовательских хуках React. Используйте хук useParams в теле компонента и деструктурируйте параметры пути uid и token. Поскольку вы используете хуки, вы также можете импортировать и использовать useNavigate хук и выполнять действие навигации в конце обработчика onSubmit формы вместо того, чтобы ставить в очередь обновление состояния.

import React, { useState } from "react";
import { useParams, useNavigate } from 'react-router-dom';
import { useDispatch } from 'react-redux';
import { reset_password_confirm } from '../actions/auth';

const ResetPasswordConfirm = () => {
  const dispatch = useDispatch();
  const navigate = useNavigate();
  const { uid, token } = useParams();

  const [formData, setFormData] = useState({
    new_password: '',
    re_new_password: ''
  });
    
  const onChange = e => setFormData(formData => ({
    ...formData,
    [e.target.name]: e.target.value
  }));

  const onSubmit = e => {
    e.preventDefault();

    const { new_password, re_new_password } = formData;

    dispatch(reset_password_confirm(uid, token, new_password, re_new_password));
    navigate("/");
  };

  return (
    ...
  );
};

export default ResetPasswordConfirm;

Большое спасибо! You can't use React hooks in nested callbacks, they must be called in the function body of a React component or in custom React hooks. Я запомню это. Я также обязательно буду использовать useNavigate, спасибо, Дрю!

xi chen 31.01.2023 11:49

Другие вопросы по теме