reactjs - React BrowserRouter: Plats är odefinierad
Jag försöker skicka ett objekt från en komponent till en annan med hjälp av state i location, men varje gång jag försöker läsa egenskapen hos state skriver det till mig att location är odefinierad.
Här är min App.tsx
import React, { Component } from "react";
import {BrowserRouter as Router, Redirect, Route} from 'react-router-dom';
import AdminPanel from "./components/admin-panel/admin-panel";
import UserPanel from "./components/user-panel/user-panel";
import OrderForm from "./components/order-form/order-form";
import Login from "./components/login/login";
import OrderSummary from "./components/order-summary/order-summary";
import Header from "./components/header/header";
import UserService from "./services/user-service";
import {LoginData} from "./types/types";
export default class App extends Component {
//User data information object creation
userService = new UserService()
state = {
isAuthorised: false
}
//userService.login() execution if succeed change isAuthorised state on true
login = async (data: LoginData) => {
if (await this.userService.login(data)) {
this.setState({
isAuthorised: true
})
}
}
render() {
const {isAuthorised} = this.state
const {userData} = this.userService
const {role, name} = userData
return (
<div>
<Header isAuthorised={isAuthorised} name={name}/>
<Router>
{
!isAuthorised && (<Redirect to='/' />)
}
<Route path="/" render={() => (
<Login login={this.login} isAuthorised={isAuthorised} role={role}/>
)} exact/>
<Route path="/admin-panel" component={AdminPanel} exact/>
<Route path="/user-panel" render={() => (
<UserPanel isAuthorised={isAuthorised} userData={userData} />
)} exact/>
<Route path="/order-form" render={() => (
<OrderForm {...userData} />
)} exact/>
<Route path="/order-summary" component={OrderSummary} exact/>
</Router>
</div>
);
}
}
Här är min komponent som skickar data:
import React, {useState} from "react";
import {Link} from "react-router-dom";
import {DefaultValues} from "react-hook-form";
import {FormValues} from "../../../types/types";
type AccordeonItem = {
title: string,
data: DefaultValues<FormValues>
}
export const AccordeonItem = ({ title, data }: AccordeonItem) => {
return (
<div className="p-4 pt-0">
<p className="text-gray-700">Some text</p>
<Link to={{ pathname: '/order-form', state: { savedOrder: data} }}>
Reorder
</Link>
</div>
);
};
Och slutligen, en komponent som ska ta emot data:
import React from "react";
import OrderFormElements from "../parts/form-elements/order-form-elements";
import {FormValues, UserData} from "../../types/types";
import CalculatorService from "../../services/calculator-service";
import {RouteComponentProps, withRouter} from "react-router-dom";
import { StaticContext } from 'react-router';
import {DefaultValues} from "react-hook-form";
type LocationState = {
savedOrder: DefaultValues<FormValues>
}
const OrderForm: React.FunctionComponent<UserData & RouteComponentProps<{}, StaticContext, LocationState>> = (userData: UserData, {location}: RouteComponentProps<{}, StaticContext, LocationState>) => {
const onSubmit = (data: FormValues) => {
const Calculator = new CalculatorService(userData)
console.log("Works",data)
}
return <OrderFormElements
mail={userData.mail}
savedOrderData={location.state.savedOrder}
onSubmit={onSubmit} />
}
export default withRouter(OrderForm)
Så som jag sa tidigare, här får jag ett fel att platsen är odefinierad
mail={userData.mail}
savedOrderData={location.state.savedOrder}
onSubmit={onSubmit} />
Det verkar som att jag använder rätt import från react-router-dom, men kan fortfarande inte lösa problemet.
Svar #1
För att skicka props som history till din route-komponent måste du använda routens render-props för att göra det.
Gör de nödvändiga ändringarna i din App.tsx-fil enligt följande.
<Route path="/order-form" render={props => (
<OrderForm {...props} {...userData} />
)} exact/>
Och ändra OrderForm-komponentens funktionsparametrar som följer för att få location-egenskapen.
const OrderForm: React.FunctionComponent<UserData & RouteComponentProps<{}, StaticContext, LocationState>> = (userData: UserData, location: RouteComponentProps<{}, StaticContext, LocationState>) => {
Hoppas att detta skulle lösa ditt problem.
