React Router Link 中的 Material-UI 组件触发链接

Posted

技术标签:

【中文标题】React Router Link 中的 Material-UI 组件触发链接【英文标题】:Material-UI component in React Router Link triggering the link 【发布时间】:2017-03-15 23:41:18 【问题描述】:

我在 react-router 中使用 material-ui 组件。当我想显示应该作为链接元素工作的列表项时,我遇到了一个问题,但其中还包含一个不应触发父链接的子菜单。确实如此,但我不知道如何禁用它。

var iconMenu =
    <IconMenu iconButtonElement=<IconButton><MoreVertIcon /></IconButton>>
      <MenuItem primaryText='change name' onTouchTap=this.edit/>
      <MenuItem primaryText='delete' onTouchTap=this.delete />
    </IconMenu>


<ListItem
          key=i
          containerElement=<Link to=`/items/$item.id` />
          rightIconButton=iconMenu
/>

当我单击iconMenu 按钮时,我不希望&lt;Link to=`/items/$item.id` /&gt; 被触发,所以我留在页面中。但确实如此。那么我该如何解决这个问题呢?我尝试添加事件处理程序来运行stopPropagation(),但没有成功...

谢谢!

【问题讨论】:

你必须使用&lt;Link&gt;吗?也许,作为一种解决方法,您可以使用在激活 ListItem onTouchTap 和 navigate programatically using React Router 时调用的函数 @CésarLandesa 不是。但我们之前使用过它,这会导致一些其他相关问题...... 【参考方案1】:

对于 React Router v4,添加

onTouchTap=() =&gt; this.props.history.push(`/items/$item.id`)

ListItem,而不是containerElement

使用import withRouter from 'react-router-dom'export default withRouter(Foo)history 添加到组件的props。

【讨论】:

【参考方案2】:

首先,我要承认我不喜欢material-ui,因此不推荐给考虑使用它开始项目的人。背后的原因是您牺牲了太多时间来定制组件以满足您的需求——这种解决方案与 React 的想法相反。它还使用你总是必须在组件文件中覆盖的内联样式,而不是在你的 scss 或更少。这很糟糕。我什至没有提到所有使用 JS 处理的 UI 交互操作,这些操作可能会使您的性能受到影响。

另一个简短的提及是react-router。不幸的是,我也不是它的粉丝。伙计们,why do you change the API in every next release? Why is it so damn difficult to just reset the location queries?看看FlowRouter,看看应该实现一个多么棒的路由API。

无论如何,我的解决方案是在&lt;Link /&gt; 组件周围实现一个包装器,并将&lt;IconMenu /&gt; 移到&lt;Link /&gt; 包装器之外:

<li key=i>
  <ListItem
          key=i
          containerElement=<Link to=`/items/$item.id` />
  />
  iconMenu
</li>

【讨论】:

why do you change the API in every next release? 欢迎来到 JS 世界。 那么material-ui的替代品有哪些呢?要求:库应组件丰富,组件设计应统一 @chenop 对于material-ui v1.0,您应该使用:component=Link to=`/items/$item.id`,而不是使用containerElement 引用组件。见:material-ui-1dab0.firebaseapp.com/component-demos/buttons

以上是关于React Router Link 中的 Material-UI 组件触发链接的主要内容,如果未能解决你的问题,请参考以下文章

Antd Menu组件应该如何结合react-router Link组件?

如何使用 react-router Link 访问 React 打字稿中的 props.location?

React Router Link 中的 Material-UI 组件触发链接

如何使用 React-Router 的服务器端渲染中的 <Link> 标签更改 StaticRouter 的位置道具

二、router-link跳转路由 ------ 2019-09-09

React 和 React-Router:通过函数调用进行路由,参数传递到路由中,而不是单击 <Link>