Реакт-роутер и машинописная проблема "соответствия" в ссылке на маршрутизацию - PullRequest
0 голосов
/ 21 июня 2019

Поскольку я новичок как в реагировании, так и в машинописи, я прочитал несколько статей о том, как получить свойство match из реакции-маршрутизатора, работающего с использованием машинописи, и я не смог успешно это сделать. У меня нет параметров, которые я передаю, я просто хочу использовать match.url реагирующего маршрутизатора.

Итак, я вижу примеры того, что поле в файле login.tsx должно использовать {match.url}. Я попробовал демо реагировать на 4 маршрутизатора здесь: https://codesandbox.io/s/nn8x24vm60?from-embed, где они использовали {${match.url}/register}, но это тоже не сработало. Затем я увидел несколько постов, где люди говорили, что вы должны объявить интерфейс, но он был разделен между RouteComponent и Route, и большинство работало с параметрами. В основном, все, что я хочу, это когда я нажимаю на ссылку, чтобы переключиться на маршрут регистрации (он находится в register.tsx - здесь не показан, так как это простой файл с заголовком).

В настоящее время выдается следующее сообщение об ошибке:

    "Error  TS2739  (TS) Type '{}' is missing the following properties from type
 'Readonly<MyProps & RouteComponentProps<{}, StaticContext, any>>': register, history, location, match"

Любая помощь в том, что я делаю неправильно, будет принята.

файл app.tsx:

import React, { Component } from 'react';
import ReactDOM from 'react-dom';
import { BrowserRouter as Router, Redirect, Link, Route, Switch } from 'react-router-dom';
import { Home } from './home';
import { Register } from './register';
import { NavBar } from './navbar';

export class App extends React.Component<{}, {}> {
    render() {
        return (
            <Router>
                <div>
                    <NavBar/>            
                    <Switch>
                        <Route path="/" component={Home} />
                        <Route path="/register" component={Register} />               
                    </Switch>
                </div>
            </Router>
        );
    }
}

ReactDOM.render (, document.getElementById ('root'));

home.tsx file:

import React from 'react';
import { Login } from './login';
import { Jumbotron } from 'react-bootstrap';

const jumboStyle = {
    background: 'lightgray',
    height: '20%',
    width: '40%',
    margin: 'auto'
};


export class Home extends React.Component<{}, {}> {

    render() {
        return (

            <div>
                < Jumbotron style={jumboStyle}>
                    <h1>Welcome to the new League!</h1>
                    <h4>Please log in with your username and password to continue</h4>
                    <Login />
                    <br />
                    <br />
                </Jumbotron>

            </div>

        );
    }
}

файл login.tsx:

import React from 'react';
import {  Link, RouteComponentProps } from "react-router-dom";
import TextField from '@material-ui/core/TextField';
import Button from '@material-ui/core/Button';
import { Alert } from 'react-bootstrap';
import { Register } from './register';

interface IState {
    [key: string]: any; // or the type of your input
} 

interface MyProps {
    register: Register
}
const styles = {
    background: 'lightblue'
};

export class Login extends React.Component<MyProps & RouteComponentProps, IState> {

    constructor(props) {
        super(props);
        this.state = {
            username: '',
            password: '',
            authorized: false

        };
        this.handleChange = this.handleChange.bind(this);
        this.handleSubmit = this.handleSubmit.bind(this);

    }


    handleChange(event) {
        const target = event.target;
        const value = target.value;
        const name = target.name;

        this.setState({
            [name]:value
        });
    }
    handleSubmit(event) {
      //we are goingto submit the form to the database
        event.prevent.default();
    }

    render() {

        return (

            <div>
                <form noValidate autoComplete="off" onSubmit={this.handleSubmit} style={{ textAlign: 'center' }}>
                    <TextField
                        id="username"
                        name="username"
                        label="UserName"
                        helperText="Enter your Username"
                        value={this.state.username}
                        onChange={this.handleChange}
                        required={true}
                        style={styles}
                    />

                    <br />
                    <TextField
                        id="password"
                        name="password"
                        type="password"
                        helperText="Enter your password"
                        label="Password"
                        onChange={this.handleChange}
                        required={true}
                        style={styles}
                    />
                    <br />
                    <br />
                    <br/>
                    <Button
                        type="submit"
                        value="Submit"
                        variant="contained"
                        color="primary"

                    >Submit</Button>   
                    <br />
                    <br/>
                    <Alert variant="info">
                        <Alert.Heading>Don't Have An Account Setup?</Alert.Heading>
                        <div>
                            <Link to={`${this.props.match.url}/register`}>Register Here</Link>
                        </div>
                    </Alert>
                </form>


            </div>

        )

    }
}

Ответы [ 2 ]

0 голосов
/ 21 июня 2019

По умолчанию свойства react-router (например, match) автоматически добавляются в компонент, отображаемый маршрутом (в данном случае Home). Вы можете добавить их в свой компонент, используя оболочку withRouter. Затем вам нужно использовать обернутый компонент вместо внутреннего.

import {withRouter} from 'react-router';

...

class LoginInternal extends React.Component<MyProps & RouteComponentProps, IState> {

...

export const Login = withRouter(LoginInternal);
0 голосов
/ 21 июня 2019

Вам необходимо передать реквизиты из компонента Home в компонент Login.

<Login match={this.props.match}/>

Это должно работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...