エラー メッセージ「TypeError: Cannot read property of unknown (reading 'push)」が表示される')" は、送信ボタンをクリックするなどのユーザー アクションの後にリダイレクトしようとすると発生します。これは、リダイレクトに使用される navigate prop が未定義であることを示します。
関数コンポーネント内のナビゲーションには useNavigate フックを使用します。このフックは関数コンポーネントとのみ互換性があります。
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);
以前のバージョンの 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 サイトの他の関連記事を参照してください。