React Router v6 でリダイレクトしようとしたときの「TypeError: 未定義のプロパティを読み取れません (\'push\' を読み取っています)」を解決する方法は?

Linda Hamilton
リリース: 2024-10-30 14:55:03
オリジナル
973 人が閲覧しました

How to Resolve

React Router v6 を使用したプログラムによるナビゲーション: TypeError の解決

問題

エラー メッセージ「TypeError: Cannot read property of unknown (reading 'push)」が表示される')" は、送信ボタンをクリックするなどのユーザー アクションの後にリダイレクトしようとすると発生します。これは、リダイレクトに使用される navigate prop が未定義であることを示します。

Solution

1。関数コンポーネントへの変換

関数コンポーネント内のナビゲーションには useNavigate フックを使用します。このフックは関数コンポーネントとのみ互換性があります。

2.クラス コンポーネントのカスタム HOC を作成します

Custom withRouter HOC:

const withRouter = WrappedComponent => props => {
  const navigate = useNavigate();
  // etc... other react-router-dom v6 hooks

  return (
    <WrappedComponent
      {...props}
      navigate={navigate}
      // etc...
    />
  );
};
ログイン後にコピー

クラス コンポーネントを装飾します:

export default withRouter(AddContacts);
ログイン後にコピー

3. Navigate 関数を使用する

以前のバージョンの React Router で使用されていた履歴オブジェクトの代わりに、ナビゲーションに navigate 関数を使用します。構文は次のように変更されました:

this.props.navigate("/path");
ログイン後にコピー

AddContacts.js の完全な作業コード:

import React, { Component } from "react";
import { Consumer } from "../../context";
import TextInputGroup from "../layout/TextInputGroup";
import { v4 as uuidv4 } from "uuid";
import withRouter from "./withRouter"; // Custom HOC

class AddContacts extends Component {
  state = {
    name: "",
    email: "",
    phone: "",
    errors: {},
  };

  onSubmit = (dispatch, e) => {
    e.preventDefault();

    const { name, email, phone } = this.state;

    //Check for errors

    if (name === "") {
      this.setState({ errors: { name: "Name is required" } });
      return;
    }
    if (email === "") {
      this.setState({ errors: { email: "Email is required" } });
      return;
    }
    if (phone === "") {
      this.setState({ errors: { phone: "Phone is required" } });
      return;
    }

    const newContact = {
      id: uuidv4(),
      name,
      email,
      phone,
    };
    dispatch({ type: "ADD_CONTACT", payload: newContact });

    this.setState({
      name: "",
      email: "",
      phone: "",
      errors: {},
    });
    this.props.navigate("/"); // Navigate using custom HOC
  };

  onChange = (e) => this.setState({ [e.target.name]: e.target.value });
  render() {
    const { name, email, phone, errors } = this.state;

    return (
      <Consumer>
        {(value) => {
          const { dispatch } = value;

          return (
            <div className="card mb-3">
              <div className="card-header">Add Contacts</div>
              <div className="card-body">
                <form onSubmit={this.onSubmit.bind(this, dispatch)}>
                  <TextInputGroup
                    label="Name"
                    name="name"
                    placeholder="Enter Name..."
                    value={name}
                    onChange={this.onChange}
                    error={errors.name}
                  />
                  <TextInputGroup
                    label="Email"
                    name="email"
                    type="email"
                    placeholder="Enter Email..."
                    value={email}
                    onChange={this.onChange}
                    error={errors.email}
                  />
                  <TextInputGroup
                    label="Phone"
                    name="phone"
                    placeholder="Enter Phone..."
                    value={phone}
                    onChange={this.onChange}
                    error={errors.phone}
                  />
                  <input
                    type="submit"
                    value="Add Contact"
                    className="btn btn-light btn-block mt-3"
                  />
                </form>
              </div>
            </div>
          );
        }}
      </Consumer>
    );
  }
}

export default withRouter(AddContacts); // Export wrapped component
ログイン後にコピー

このソリューションにより、React Router v6 のクラス コンポーネントからのナビゲーションが可能になります。未定義のナビゲーション プロパティを示す最初のエラーにもかかわらず。

以上がReact Router v6 でリダイレクトしようとしたときの「TypeError: 未定義のプロパティを読み取れません (\'push\' を読み取っています)」を解決する方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート