提案された方法を使用すること: これは結果です:ボタンの中のリンク 、 コメント行の間にコードを書く
Reactを使用して、HTMLのLink
タグで'react-router'
からのbutton
要素をラップする方法があるかどうか疑問に思いました。
私は現在、アプリ内のページをナビゲートするためのLink
コンポーネントを持っていますが、その機能を自分のHTMLボタンにマッピングしたいと思います。
はい。
あなたはこのようなことをすることができます:
const WrappedLink = () => {
return (
<button>
<Link style={{display: 'block', height: '100%'}} .... />
</button>
)
}
その後、<WrappedLink />
の代わりに<Link />
を使用します。
これはWebブラウザで表示されますが、次の点に注意してください。
⚠️ html button
内にhtml a
をネストする(またはその逆)ことは無効です
逆方向に折り返すと、リンクが添付された元のボタンが表示されます。 CSSを変更する必要はありません。
<Link to="/dashboard">
<button type="button">
Click Me!
</button>
</Link>
こちらのボタンはHTMLボタンです。また、Semantic-UI-Reactのようなサードパーティのライブラリからインポートされたコンポーネントにも適用できます。
import { Button } from 'semantic-ui-react'
...
<Link to="/dashboard">
<Button style={myStyle}>
<p>Click Me!</p>
</Button>
</Link>
これはWebブラウザで表示されますが、次の点に注意してください。
⚠️ html button
内にhtml a
をネストする(またはその逆)ことは無効です
LinkButton
コンポーネント - React Router v4のためのソリューションまず、この質問に対する他の多くの回答についてのメモです。
<button>
と<a>
の入れ子は、有効なHTMLではありません。 ⚠️React Routerのbutton
コンポーネントにhtmlのLink
をネストすること(またはその逆)を示唆するここでの答えはすべて、意味のあるもの、アクセス可能なもの、または有効なhtmlというものではありません。
<a stuff-here><button>label text</button></a>
<button><a stuff-here>label text</a></button>
☝ クリックしてこのマークアップをvalidator.w3.orgで検証します ☝
ボタンは通常リンク内に配置されないため、これはレイアウト/スタイルの問題につながる可能性があります。
<button>
コンポーネントでhtmlの<Link>
タグを使用する。Html button
タグだけが欲しいのなら…
<button>label text</button>
…そして、React RouterのLink
コンポーネントのように機能するボタンを取得する正しい方法は…
React Routerの withRouter HOCを使用して、これらのプロップをコンポーネントに渡します。
history
location
match
staticContext
LinkButton
コンポーネントこれは、/パスタをコピーするためのLinkButton
コンポーネントです。
// 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)
次にコンポーネントをインポートします。
import LinkButton from '/components/LinkButton'
コンポーネントを使用してください:
<LinkButton to='/path/to/page'>Push My Buttons!</LinkButton>
OnClickメソッドが必要な場合
<LinkButton
to='/path/to/page'
onClick={(event) => {
console.log('custom event here!', event)
}}
>Push My Buttons!</LinkButton>
ボタンと同じCSSでリンクタグを飾るだけでは不十分です。
<Link
className="btn btn-pink"
role="button"
to="/"
onClick={this.handleClick()}
>
Button1
</Link>
私はRouterと<Button />を使います。いいえ<Link />
<Button onClick={()=> {this.props.history.replace('/mypage')}}>
HERE
</Button>
あなたがreact-router-dom
とmaterial-ui
を使っているならば、あなたは使うことができます...
import { Link } from 'react-router-dom'
import Button from '@material-ui/core/Button';
<Button component={Link} to="/open-collective">
Link
</Button>
もっと読むことができます ここ 。
スタイル付きのコンポーネントを使用すると、これを簡単に実現できます。
まずスタイルボタンをデザインする
import styled from "styled-components";
import {Link} from "react-router-dom";
const Button = styled.button`
background: white;
color:red;
font-size: 1em;
margin: 1em;
padding: 0.25em 1em;
border: 2px solid red;
border-radius: 3px;
`
render(
<Button as={Link} to="/home"> Text Goes Here </Button>
);
詳細--- スタイル付きコンポーネントのホーム
解決策の多くは、物事を複雑にすることに焦点を当てています。
WithRouterを使用することは、App内の他の場所にリンクするボタンのように単純なものに対する非常に長い解決策です。
あなたがS.P.A.に行くつもりなら(単一ページのアプリケーション)、私が見つけた最も簡単な答えはボタンの同等のclassNameと一緒に使うことです。
これにより、アプリケーション全体を再ロードせずに共有状態/コンテキストを維持できます。
import { NavLink } from 'react-router-dom'; // 14.6K (gzipped: 5.2 K)
// Where link.{something} is the imported data
<NavLink className={`bx--btn bx--btn--primary ${link.className}`} to={link.href} activeClassName={'active'}>
{link.label}
</NavLink>
// Simplified version:
<NavLink className={'bx--btn bx--btn--primary'} to={'/myLocalPath'}>
Button without using withRouter
</NavLink>