Как вы получаете доступ к совпадению в контейнере React-Redux? - PullRequest
0 голосов
/ 31 марта 2020

Во-первых, спасибо всем, кто читает это и хочет помочь!

Я пытаюсь создать веб-приложениеact-redux, и у меня возникают проблемы с доступом к идентификатору из URL. в контейнере. URL-адрес выглядит следующим образом: websitename.com/games/:game_id Мне нужно получить доступ к этому: game_id, чтобы я мог использовать его в действии с избыточностью для вызова моего API, но я не могу понять, как получить доступ к использование матча. Когда я пытаюсь скомпилировать, я получаю следующую ошибку:

. / Src / Containers / GameDetails. js Строка 9:19: «match» не определено no-undef

Мое приложение настроен со следующей структурой: Main. js содержит маршруты:

import React from "react";
import {Switch, Route, withRouter, Redirect} from "react-router-dom";
import {connect} from "react-redux";
import Homepage from "../components/Homepage";
import AuthForm from "../components/AuthForm";
import {authUser} from "../store/actions/auth";
import {removeError} from "../store/actions/errors"
import withAuth from "../hocs/withAuth";
import GameForm from "./GameForm";
import GamePage from "../components/GamePage";

const Main = props => {
    const {authUser, errors, removeError, currentUser} = props;
    return (
        <div className="container">
            <Switch>
                <Route path="/" exact render={props => <Homepage currentUser={currentUser} {...props} /> } />
                <Route 
                    path="/signin" exact
                    render={props => {
                        return(
                            <AuthForm 
                                removeError={removeError}
                                errors={errors}
                                onAuth={authUser}
                                buttonText="Log in" 
                                heading="Welcome Back." 
                                {...props} 
                            />
                        )
                    }} />
                <Route 
                    path="/signup" exact
                    render={props => {
                        return(
                            <AuthForm
                                removeError={removeError}
                                errors={errors}
                                onAuth={authUser}
                                signUp
                                buttonText="Sign me up" 
                                heading="Join Weekly Matchup today." 
                                {...props} 
                            />
                        )
                    }} 
                />
                <Route 
                    path="/games/new" exact
                    component={withAuth(GameForm)}
                />
                <Route
                    path="/games/:game_id" 
                    render={props => {
                        return(
                            <GamePage 
                                currentUser={currentUser}
                                {...props} 
                            />
                        )
                    }}
                />
                <Redirect to="/" />
            </Switch>
        </div>
    )
}

function mapStateToProps(state){
    return {
        currentUser: state.currentUser,
        errors: state.errors
    };
}

export default withRouter(connect(mapStateToProps, {authUser, removeError})(Main));

GamePage. js - это компонент, содержащий контейнер GameDetails:

import React from "react";
import { Link } from "react-router-dom";
import GameDetails from "../containers/GameDetails";

const GamePage = ({ currentUser }) => {


    if (!currentUser.isAuthenticated) {
        return (
            <div className="home-hero">
                <h1>You must sign in or sign up in order to vote for matchups and view comments.</h1>
            </div>
        );
    }
    return (
        <div>
            <div className="home-hero">
                <GameDetails />
            </div>
        </div>
    )
}

export default GamePage;

И GameDetails. js - это то место, где я пытаюсь получить идентификатор из URL-адреса, чтобы использовать его в своем действии редукса:

import React, { Component } from "react";
import { connect } from "react-redux";
import { Link } from "react-router-dom";
import { getGameDetails } from "../store/actions/games";

class GameDetails extends Component {

    componentDidMount() {
        const game_id = match.params.game_id;
        this.props.getGameDetails(game_id);
    }
    render() {
        const { match, game } = this.props;

        return (
            <div className="home-hero">
                <div className="offset-1 col-sm-10">
                        <h4>You are viewing the Game Page for game.title</h4>
                </div>
            </div>
        );
    }
}

function mapStateToProps(state) {
    return {
        game: state.game
    };
}

export default connect(mapStateToProps, { getGameDetails })(
    GameDetails
);

Я все еще новичок в реакции и редукции, поэтому я ценю любая помощь, которую вы можете предложить. Спасибо за ваше время и терпение!

Ответы [ 3 ]

0 голосов
/ 31 марта 2020

1 раствор

import React from "react";
import { Link } from "react-router-dom";
import GameDetails from "../containers/GameDetails";

const GamePage = ({ currentUser, ...routeProps }) => {


    if (!currentUser.isAuthenticated) {
        return (
            <div className="home-hero">
                <h1>You must sign in or sign up in order to vote for matchups and view comments.</h1>
            </div>
        );
    }
    return (
        <div>
            <div className="home-hero">
                <GameDetails {...routeProps} />
            </div>
        </div>
    )
}

export default GamePage;

2 раствор

import React, { Component } from "react";
import { connect } from "react-redux";
import { Link, withRouter } from "react-router-dom";
import { getGameDetails } from "../store/actions/games";

class GameDetails extends Component {

    componentDidMount() {
        const game_id = match.params.game_id;
        this.props.getGameDetails(game_id);
    }
    render() {
        const { match, game } = this.props;

        return (
            <div className="home-hero">
                <div className="offset-1 col-sm-10">
                        <h4>You are viewing the Game Page for game.title</h4>
                </div>
            </div>
        );
    }
}

function mapStateToProps(state) {
    return {
        game: state.game
    };
}

export default withRouter(
  connect(mapStateToProps, { getGameDetails })(GameDetails)
);
0 голосов
/ 31 марта 2020

Попробуйте что-нибудь подобное в GameDetails. js и GamePage. js

import React from "react";
import { Link } from "react-router-dom";
import GameDetails from "../containers/GameDetails";

const GamePage = ({ currentUser, ...props }) => {


if (!currentUser.isAuthenticated) {
    return (
        <div className="home-hero">
            <h1>You must sign in or sign up in order to vote for matchups and view comments.</h1>
        </div>
    );
}
return (
    <div>
        <div className="home-hero">
            <GameDetails {...props} />
        </div>
    </div>
)
}

export default GamePage;

import React, { Component } from "react";
import { connect } from "react-redux";
import { Link } from "react-router-dom";
import { getGameDetails } from "../store/actions/games";

class GameDetails extends Component {

componentDidMount() {
    const {game_id}= this.props.match.params.game_id;
    this.props.getGameDetails(game_id);
}
render() {
    const { match, game } = this.props;

    return (
        <div className="home-hero">
            <div className="offset-1 col-sm-10">
                    <h4>You are viewing the Game Page for game.title</h4>
            </div>
        </div>
    );
}
}

function mapStateToProps(state) {
return {
    game: state.game
};
}

export default connect(mapStateToProps, { getGameDetails })(
GameDetails
);
0 голосов
/ 31 марта 2020

Я полагаю, вы используете экспортированный компонент так же, как <Route path="/games/:game_id" component={GameDetails} /> mapStateToProps, получите 2 аргумента state и ownProps.

function mapStateToProps(state, ownProps) {
    const { match: { params: { game_id } } } = ownProps; // you able to use game_id inside mapStateToProps
    return ({ game: state.game });
}
...