0

Ich erstelle einen Blog mit drei Posts, die anfänglich als drei Karten angezeigt werden, auf die ein Benutzer klicken kann, um die Post-Komponente mit der Karte zu versehen. Im Moment nutze ich einen Reducer, um die notwendigen Details in den Karten jedes Posts zu ziehen.Wie kann ich mit react-router-dom einen Link zum Rendern einer allgemeinen Post-Komponente verwenden, die mit Requisiten gefüllt ist?

Hier ist mein Problem: Ich verwende drei einzelne Post-Komponenten (Post1, Post2 und Post3), die als Komponenten in jedem Route-Tag fungieren. Allerdings möchte ich meinen Code dynamischer gestalten und eine allgemeine Post-Komponente in jedem Route-Tag rendern und die Post-Komponente irgendwie mit Informationen aus dem spezifischen Reducers-Objekt füllen, das bereits verwendet wird, um Informationen zur Verwendung in jeder Karte abzurufen .

so, würde ich in der Lage sein mag, so etwas zu schreiben:

<Route exact exact path={`Post1`} component={Post}/> 

und dann, wenn die entsprechende Karte angeklickt wird, irgendwie, dass bestimmte Instanz Post wird Beitrag vom Minderer mit Requisiten machen Objekt speziell für Post1.

Gibt es eine Möglichkeit, dies zu tun ???

Hier ist mein Code für App.js:

class PostCards extends React.Component { 
    render() { 
     var createCards = this.props.cards.map((card, i) => { 
      return (
       <div style={{margin: '20px'}} key={i}> 
        <Link to={`/${card.title}`}> 
         <PostCard title={card.title} subtitle={card.subtitle} date={card.date} text={card.text} backgroundImage={card.image} detail={card.detail}/> 
        </Link> 
       </div> 
      ); 
     }); 
     return (
      <div style={{display: 'flex', flexDirection: 'row'}}>{createCards}</div> 
     ); 
    }; 
} 

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

export default connect(mapStateToProps)(PostCards); 

ein Beispiel für den Code für einen Post (Post1):

class App extends React.Component { 
    render() { 
     const blogPosts = { 
      Post1, 
      Post2, 
      Post3 
     }; 

     var createRoutes = this.props.cards.map((card, i) => { 
      return <Route key={i} exact path={`/${card.title}`} exact component={blogPosts[card.id]}/> 
     }); 
     return(
      <Switch> 
       <Route exact path='/' component={PostCards}/> 
       {createRoutes} 
      </Switch> 
     ); 
    } 
} 

function mapStateToProps(state) { 
    return { 
     cards: state.cards 
    } 
} 

export default withRouter(connect(mapStateToProps)(App)); 

Hier ist mein Code für die Liste der Karten ist

const Post1 =() => { 
    return (
     <div>hello this is post 1</div> 
    ); 
} 

export default Post1; 

und der Code für das Reduktions:

export default function() { 
    return [ 
     { id: 'Post1', 
      title: 'Post1', 
      subtitle: 'subtitle', 
      date: '1.1.17', 
      text: 'this is the post text for post 1', 
      image: 'url("../client/images/image.jpg")', 
      detail: 'this is the detail' 
     }, 

     { id: 'Post2', 
      title: 'Post2', 
      subtitle: 'subtitle', 
      date: '2.1.17', 
      text: 'this is the post text for post 2', 
      image: 'url("../client/images/image.jpg")', 
      detail: 'this is the detail' 
     }, 

     { id: 'Post3', 
      title: 'Post3', 
      subtitle: 'subtitle', 
      date: '3.1.17', 
      text: 'this is the post text for post 3', 
      image: 'url("../client/images/image.jpg")', 
      detail: 'this is the detail' 
     }, 
    ] 
} 

Antwort

1

Sie können eine Route mit Post-ID als Abfrageparameter erstellen:

<Route path='/:postId' component={Post}/> 

Dann in der Komponente Post Sie die URL params und basierend auf ihren Wert bestimmen, welche Daten Sie benötigen aus dem Speicher holen kann:

class Post extends Component { 
    componentDidMount() { 
    const postId = this.props.match.params.postId; 
    // fetch data based on postId 
    } 
    render() { 
    return (
     <div> 
     ... 
     </div> 
    ); 
    } 
} 
+0

danke für Ihre Antwort! Wenn Sie Post-ID sagen, meinen Sie, ich sollte den Wert der Post-ID verwenden, die im Reducer angegeben ist? – user74843

+0

hm .. ja, ich denke schon. Das ist die Logik, die du erreichen willst, oder? Planen Sie, nur drei statische Post-Objekte zu haben, oder ist es die Art der Posts, die durch die Werte Post1, Post2, Post3 und nicht durch die tatsächlichen IDs repräsentiert werden? – margaretkru

+0

Ich benutzte Route Params und zog alle notwendigen Informationen vom Reducer, indem ich jeden Post ID Wert auf seinen Positionswert änderte (zB: 0, für den ersten Post), und dann die postID const benutzte, um den spezifischen Post, den ich wollte, hinein zu nehmen ein Const-Post (const post = this.props.cards [postId];), nachdem ich "cards" aus meiner Reducer index.js Datei geholt habe. Jetzt kann ich Informationen aus einem bestimmten Beitrag verwenden (zB:

{post.title}
). Vielen Dank für deine Hilfe! – user74843

Verwandte Themen