ReactJS,功能组件。所以我想根据单击 <Link> 来设置状态

ReactJS, functional components. So I want to setState according to whatever <Link> is clicked

例如,我有一个菌株列表,每个菌株都在从 react-router-dom 导入的组件中。我希望这个 link 带我去 Route path='/strains/{strain}'。在此页面上,我只想呈现被单击的菌株的名称,但当单击一个 link 时,所有菌株的名称都会呈现。这是我的代码,显示了所有路线。

import React, {useEffect, useState} from 'react';
import { Route, Link } from 'react-router-dom';
import axios from 'axios';
import UserCreation from './components/UserCreation';
import Login from "./components/Login";
import StrainCard from './components/StrainCard';
import { Container } from "reactstrap";
import NavBarComponent from "./components/NavBarComponent";
import SavedStrain from './components/SavedStrain';
import Strain from './components/Strain';
import StrainDetails from './components/StrainDetails';

function App() {
  const [strains, setStrains] = useState([]);
  const [savedList, setSavedList] = useState([]);
  const [strain, setStrain] = useState([]);

  
  useEffect(() => {
    const getStrains = () => {
      axios
        .get('http://strainapi.evanbusse.com/CEIl7eN/strains/search/all')
        .then(response => {
          console.log(response);
          setStrains(response.data);
        })
        .catch(error => {
          console.error('Server Error', error.response);
        });
    }
    getStrains();
  }, []);


console.log(strains)

  useEffect(() => {
    setStrain(Object.keys(strains).slice(0, 20))
  }, [strains])

  console.log(strain)

  const addToSavedList = strain => {
    setSavedList([...savedList, strain]);
  };

  return (
    <Container className="App">
        <NavBarComponent />
      <Route exact path='/'>
        <Link to='/login'>Log in</Link>
      </Route>
        <Route exact path='/login'>
            <Login />
        </Route>
      <Route exact path='/signup'>
        <UserCreation />
      </Route>
      <Route exact path='/strains' render= { () => <StrainCard strains={strains} />} />
      <Route exact path='/strains/:strain' render = {(props) => <StrainDetails {...props} strains={strains} addToSavedList={addToSavedList} strain={strain} />} />
      <Route path='/savedstrains' render={() => <SavedStrain savedList={savedList} /> } />
    </Container>
  );
}

export default App;

这是我的代码,展示了如何渲染菌株的 Link。

import React, {useState, useEffect} from 'react';
import {Link, Route} from 'react-router-dom';
import {Card} from 'reactstrap';
import {Button} from "react-bootstrap";
//import SavedStrain from "./SavedStrain";

const Strain = ({strain, strains, type}) => {
    const [filteredStrains, setFilteredStrains] = useState([]);
    
    let x = strains[`${strain}`];
    console.log(x)

    const filterStrains = () => {
        if(x.race === type) {
            setFilteredStrains(strain);
        }
    }

    

    console.log(filteredStrains)

    useEffect(() => {
        filterStrains(); 
    }, [type])

    return (
        <div className='filteredContainer'>
            <Card className='card'>
                <Link to={`/strains/${strain}`}>
                    <div className="strain-card">
                        <div className="strain">
                            {`${filteredStrains}`} 
                        </div>
                    </div>
                </Link> 
            </Card> 
        </div>    
    )
}

export default Strain;

最后,这是我的代码,我只想根据单击的菌株 Link 显示一个菌株,而不是所有菌株。

import React, {useState, useEffect} from 'react';
import axios from 'axios';
import {Card} from 'react-bootstrap';

const StrainDetails = () => {
    const [strains, setStrains] = useState([]);
    const [details, setDetails] = useState([]);
    //const [strain, setStrain] = useState([]);

        
    useEffect(() => {
        const getStrains = () => {
            axios
              .get('http://strainapi.evanbusse.com/CEIl7eN/strains/search/all')
              .then(response => {
                console.log(response);
                setStrains(response.data);
              })
              .catch(error => {
                console.error('Server Error', error.response);
              });
          }
          getStrains();
    }, []);

    console.log(Object.values(strains).slice(0, 20))

    useEffect(() => {
        setDetails(Object.values(strains).slice(0, 20));
    }, [strains])

    console.log(details);

    let strain = Object.keys(strains).slice(0, 20).map(y => {return y});
    let x = Object.keys(strains).slice(0,20);

    // const addToSavedList = strain => {
    //     setSavedList([...savedList, strain]);
    //     console.log(savedList);
    //   };
    
    // const saveStrain = () => {
    //     addToSavedList(strain);
    // }

    return (
            <div className='container'>
                <Card>
                    <div className="strain-card">
                        <div className='name'>
                            strain: {strain}
                        </div>
                        {/* <div className='id'>
                            ID: {x.id.toString()}
                        </div>
                        <div className='type'>
                            Type: {x.race.toString()}
                        </div>
                        <div className='flavors'>
                            Flavors: {x.flavors.toString()}
                        </div>
                        <div className='effects'>
                            Medical effects: {x.effects.medical.toString()} <br />
                            Positive effects: {x.effects.positive.toString()} <br />
                            Negative effects: {x.effects.negative.toString()} <br />
                        </div> */}
                        {/* <Button className='save' onClick={saveStrain}>Save</Button> */}
                    </div>
                </Card>
            </div>
        )
    }

    export default StrainDetails;

例如,我只想显示 Alien Bubba 菌株,而不是所有菌株。 (我点击了Link外星人布巴)

image of what happens when one link is clicked on

你想要的是一种访问路由参数的方法(在你的情况下是应变),像这样在渲染回调中将路由器道具传递给你的组件

<Route exact path='/strains/:strain' render = {(props) => <Strain {...props} strains={strains} addToSavedList={addToSavedList} />} />

现在在您的 Strain 组件中,您可以像这样访问参数

const Strain = ({match}) => {
   console.log(match.params)
}