我想知道在React中链接整个元素的最佳方法是什么。
我尝试过的一件事是:
<article className="post" onClick={() => window.location = '/blog/' + this.props.post.slug}></article>
此方法导致整个页面重新加载。
我尝试过的另一种方法是使用Link
中的react-router-dom
:
<Link to={"/blog/" + this.props.post.slug}>
<article className="post"></article>
</Link>
尽管我不确定将整个元素包装在anchor
标记中是否是最佳实践,但这种方法似乎要好得多,因为我将不得不覆盖元素中任何文本的链接样式。 Link
是最好的方法,还是我还没有找到其他方法?有没有一种方法可以模拟锚标签的行为,而无需实际将整个元素包装在锚中?
答案 0 :(得分:1)
如何使用this.props.history
<article className="post" onClick={() => this.props.history.push(`/blog/${this.props.post.slug}`)}></article>
如果通过路由未呈现上述内容的组件,请使用withRouter
提供的react-router-dom
HOC。
答案 1 :(得分:1)
第二种方法更好。 我们经常将这种技术用于徽标。 只要react正在生成类似的标记,您就应该很好。 这对WCAG也有好处。
<a target="_blank" href="https://www.wikipedia.org">
Wikipedia
<img alt="(opens in new tab)" src="newtab.svg">
</a>
答案 2 :(得分:0)
链接是一个非常好的选择;但是,如果您不想修改CSS,则有多种选择:
此功能是
react-router-dom
v5.1中引入的,因此,如果您使用的是较旧版本的更新或选择下一个选项。
您可以在Route
呈现的任何组件上使用此钩子:
import {
useHistory,
BrowserRouter as Router,
Link,
Switch
} from "react-router-dom";
const Blog = ({ post: { slug } }) => {
const { push } = useHistory();
return (
<article className="post" onClick={() => push("/blog/" + slug)}></article>
);
};
const App = () => (
// ... get posts, etc.
<div className="App">
<Router>
<ul>
<li>
<Link to="/">Home</Link>
</li>
<li>
<Link to="/blog">Blog</Link>
</li>
<li>
<Link to="/shop">Shop</Link>
</li>
</ul>
<Switch>
<Route exact path="/" component={Home} />
<Route
path="/blog"
component={props => <Blog post={post} {...props} />}
/>
<Route path="/shop" component={Shop} />
</Switch>
</Router>
</div>
);
// See that we don't use BrowserRouter here
import { Router, Link, Switch } from "react-router-dom";
import { createBrowserHistory } from "history";
const history = createBrowserHistory();
const Blog = ({ post: { slug } }) => {
const { push } = history;
return (
<article className="post" onClick={() => push("/blog/" + slug)}></article>
);
};
const App = () => (
// ... get posts, etc.
<div className="App">
<Router history={history}>
<ul>
<li>
<Link to="/">Home</Link>
</li>
<li>
<Link to="/blog">Blog</Link>
</li>
<li>
<Link to="/shop">Shop</Link>
</li>
</ul>
<Switch>
<Route exact path="/" component={Home} />
<Route
path="/blog"
component={props => <Blog post={post} {...props} />}
/>
<Route path="/shop" component={Shop} />
</Switch>
</Router>
</div>
);
这是最通用的方法,因为您可以在Route
中未包含的组件中以及几乎任何地方使用它。出于这个原因,在utils或helpers文件夹中声明它并导出它是一种好方法(记住将history
对象传递给Router
)。