我想對某些用戶操作執(zhí)行導(dǎo)航,例如按鈕的 onSubmit。假設(shè)用戶單擊“添加聯(lián)系人”按鈕,我希望反應(yīng)路由器在主頁“/”中重定向。目前我面臨這個(gè)問題--> TypeError: Cannot readproperties of undefined (reading 'push').作為初學(xué)者,我非常感謝專家的幫助。
AddContacts.js
import React, { Component } from "react"; import { Consumer } from "../../context"; import TextInputGroup from "../layout/TextInputGroup"; import { v4 as uuidv4 } from "uuid"; import { useNavigate } from "react-router-dom"; 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.push("/"); }; 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 AddContacts;
這是 App.js 文件
import React, { Component } from "react"; import { BrowserRouter, Routes, Route, Link } from "react-router-dom"; import Contacts from "./components/contacts/Contacts"; import Header from "./components/layout/Header"; import AddContacts from "./components/contacts/AddContacts"; import About from "./components/pages/About"; import { Provider } from "./context"; import "bootstrap/dist/css/bootstrap.min.css"; import "./App.css"; function App() { return ( <Provider> <BrowserRouter> <div className="App"> <Header branding="Contact manager" /> <div className="container"> <Routes> <Route path="/" element={<Contacts />} />{" "} <Route path="/contact/add/*" element={<AddContacts />} />{" "} <Route path="about/*" element={<About />} />{" "} </Routes>{" "} </div>{" "} </div>{" "} </BrowserRouter>{" "} </Provider> ); } export default App;
如何在 React Router v6 中重定向
import { useNavigate } from "react-router-dom"; const navigate = useNavigate(); const handleClick = () => { navigate("/dashboard"); };
這是因?yàn)槟鷩L試從不存在的 navigate
屬性進(jìn)行導(dǎo)航,它是未定義的。
this.props.navigate.push("/");
useNavigate
掛鉤僅與函數(shù)組件兼容,因此如果您想要/需要將 navigate
與類組件一起使用,則必須轉(zhuǎn)換 AddContacts code> 到函數(shù)組件,或者滾動您自己的自定義
withRouter
高階組件來注入“路由道具”,例如來自 react-router-dom 的
v5.x 做到了。withRouter
HOC
我不會介紹如何將類組件轉(zhuǎn)換為函數(shù)組件。下面是一個(gè)自定義 withRouter
HOC 示例:
const withRouter = WrappedComponent => props => { const navigate = useNavigate(); // etc... other react-router-dom v6 hooks return ( <WrappedComponent {...props} navigate={navigate} // etc... /> ); };
并使用新的 HOC 裝飾 AddContacts
組件。
export default withRouter(AddContacts);
現(xiàn)在會將 navigate
屬性(以及您設(shè)置的任何其他屬性)傳遞給裝飾組件,并且 this.navigate
現(xiàn)在將已定義。
此外,導(dǎo)航 API 從 v5 更改為 v6,不再使用直接的 history
對象。 navigate
是一個(gè)函數(shù)而不是一個(gè)對象。要使用您調(diào)用函數(shù)并傳遞 1 或 2 個(gè)參數(shù),第一個(gè)是目標(biāo)路徑,第二個(gè)是帶有 replace
和/或 state
鍵的可選“選項(xiàng)”對象/值。
現(xiàn)在導(dǎo)航如下:
this.props.navigate("/");