Envelopper un lien react-router dans un bouton html

en utilisant la méthode suggérée: C'est le résultat: Un lien dans le bouton, Code entre les lignes de commentaire

je me demandais s'il y avait un moyen d'emballer un Link élément 'react-router' dans un HTML button tag en utilisant react.

j'ai actuellement Link composants de parcourir les pages de mon application, mais je tiens à la carte de la fonctionnalité mon code HTML bouton.

enter image description here enter image description here

34
demandé sur SherylHohman 2017-02-26 03:17:47

5 réponses

Oui.

Vous pouvez faire quelque chose comme ceci:

const WrappedLink = () => {
  return (
    <button>
      <Link style={{display: 'block', height: '100%'}} .... />
    </button>
  )
}

puis utiliser <WrappedLink /> au lieu de <Link />.

3
répondu Raphael Rafatpanah 2017-02-26 01:13:47

faire l'emballage dans le sens inverse et vous obtenez le bouton original avec le lien attaché. Aucun changement CSS requis.

 <Link to="/dashboard">
     <button type="button">
          Click Me!
     </button>
 </Link>

voici le bouton HTML. Il est également applicable aux composants importés de bibliothèques tierces comme la Sémantique de l'INTERFACE utilisateur-Réagir.

 import { Button } from 'semantic-ui-react'
 ... 
 <Link to="/dashboard">
     <Button style={myStyle}>
        <p>Click Me!</p>
     </Button>
 </Link>
47
répondu Naren Yellavula 2017-09-07 05:49:16

LinkButton composant - une solution pour Réagir Routeur v4

emboîter un html button dans un routeur React Link composant (ou vice-versa) fonctionne... mais c'est un hack... et vous obtenez html ce qui ne devrait jamais écrire:

<a stuff-here><button>label text</button></a>

cela peut entraîner des problèmes de mise en page ou de style, car les boutons ne sont généralement pas placés à l'intérieur des liens.

ce que vous voulez vraiment dans votre html est seulement un button balise:

<button>label text</button>

Voici la bonne façon d'obtenir un bouton cela fonctionne comme le routeur de réagir Link composant...

utilisez le routeur React withRouter HOC pour passer de ces accessoires de votre composant:

  • history
  • location
  • match
  • staticContext

LinkButton composant

Voici un LinkButton composant pour vous de copier/pâtes:

// file: /components/LinkButton.jsx
import React from 'react'
import PropTypes from 'prop-types'
import { withRouter } from 'react-router'

const LinkButton = (props) => {
  const {
    history,
    location,
    match,
    staticContext,
    to,
    onClick,
    // ⬆ filtering out props that `button` doesn’t know what to do with.
    ...rest
  } = props
  return (
    <button
      {...rest} // `children` is just another prop!
      onClick={(event) => {
        onClick && onClick(event)
        history.push(to)
      }}
    />
  )
}

LinkButton.propTypes = {
  to: PropTypes.string.isRequired,
  children: PropTypes.node.isRequired
}

export default withRouter(LinkButton)

Puis importer le composant:

import LinkButton from '/components/LinkButton'

Utiliser le composant:

<LinkButton to='/path/to/page'>Push My Buttons!</LinkButton>

Si vous avez besoin d'une méthode onClick:

<LinkButton
  to='/path/to/page'
  onClick={(event) => {
    console.log('custom event here!', event)
  }}
>Push My Buttons!</LinkButton>
25
répondu Beau Smith 2018-08-23 03:40:34

pourquoi ne pas simplement décorer l'étiquette de lien avec le même css qu'un bouton.

<Link 
 className="btn btn-pink"
 role="button"
 to="/"
 onClick={this.handleClick()}
Button1

16
répondu Chase James 2017-02-26 00:22:42

J'utilise Router et < Button/>. Aucun < /Lien>

<Button onClick={()=> {this.props.history.replace('/mypage')}}>
   HERE
</Button>
2
répondu Alan 2018-04-07 17:28:12