【问题标题】:React-Router Link entire (inline-)block instead of just text?React-Router 链接整个(内联)块,而不仅仅是文本?
【发布时间】:2017-05-09 08:09:13
【问题描述】:

我正在实现一个简单的 React 组件 (example 2 here: navigation menu),但添加了 React-Router 以让点击导航菜单激活不同的路由。我让它几乎可以正常工作:单击按钮的文本会将您带到不同的路线,但在inline-block单击其他地方 只会更改样式(激活class="active")但不会更改路由(onClick 监听器位于 li 标记上)。

如下所示,您可以单击Services 文本 来激活服务路由,但如果您单击About 块而不是块本身的文本, 它会将About 注册为活动但不会更改路由。

这是 React 和我的 css 中的相关代码:

类导航扩展 React.Component {

constructor() {
    super()
    this.state = {chosenIndex: 0, tabs: ['Home', 'Services', 'About', 'Contact us']}
    this.selectTab = this.selectTab.bind(this)
}

selectTab(e, i) {
    e.preventDefault()
    this.setState({chosenIndex: i})
}

render() {
        let buttons = this.state.tabs.map((tab, index) => {
            return (
                <li key={index} className={index === this.state.chosenIndex ? 'active' : 'inactive'} onClick={event => this.selectTab(event, index)}><Link to={nameToPath(tab)}>{tab}</Link></li>
            )
        })
        return (
            <BrowserRouter>
                <div>
                    <ul>
                        {buttons}
                    </ul>
                    <Match exactly pattern="/" component={Home} />
              <Match pattern="/services" component={Services} />
              <Match pattern="/about" component={About} />
              <Match pattern="/contactus" component={ContactUs} />
              <Miss component={Home} />
            </div>
            </BrowserRouter>
        )
    }

CSS:

html{
    font:24px normal Arial, sans-serif;
    color:#626771;
    background-color:#fff;
}

body{
    padding:60px;
    text-align: center;
}

ul{
    list-style:none;
    display: inline-block;
}

ul li{
    display: inline-block;
    padding: 10px 20px;
    cursor:pointer;
    background-color:#eee;
    text-decoration: none;
    color:#7B8585;
    transition:0.3s;
    font: bold 14px Arial;
}

ul li:hover {
    background-color:#beecea;
}

ul li.active {
    background-color:#41c7c2;
}

a {
    text-decoration: none;
    color: #7b8585;
    display: block;
}

ul li.active a {
    color: #fff;
}

p {
    padding-top:15px;
    font-size:16px;
}

【问题讨论】:

  • 没有完全调查,但我很确定这个页面包含你需要的所有东西:github.com/reactjs/react-router-tutorial/tree/master/lessons/…
  • 请附上您的selectTab功能代码。我不确定您是说应该在页面之间导航还是只是突出显示应用中的选项卡。
  • @PaulS 我刚刚将它添加到问题中。现在单击选项卡而不是文本只会更改突出显示;导航仅在单击文本本身时发生。如果单击导航“框”中的任何位置,我希望它能够导航。

标签: css react-router


【解决方案1】:

通过将display: block 添加到&lt;a&gt; 的CSS 中,应该足够简单以使用CSS 进行修复。

编辑:&lt;li&gt; 上的填充也应该移动到&lt;a&gt;display: block 不会将&lt;a&gt; 扩展到其父级的填充中,因此单击父级的填充不会向&lt;a&gt; 注册单击事件。但是,如果您将填充移动到&lt;a&gt;,然后单击填充会单击&lt;a&gt;,因此导航将按预期进行。

导航仅在您单击文本时发生,因为只有文本是由&lt;Link&gt; 呈现的&lt;a&gt; 标记的一部分。

默认情况下,&lt;a&gt; 是内联渲染的(请参阅下面 sn-p 中 &lt;li&gt;&lt;a&gt; 之间的样式差异)。

li {
  background: red;
  padding: 10px 20px;
  width: 50px;
}

a {
  background: blue;
  color: white;
  text-align: center;
}
<ul>
  <li>
    <a href='#'>Link</a>
  </li>
</ul>

但是,当您将 display: block; 添加到锚元素的 CSS 并将填充从列表元素移动到锚时,您会看到它扩展为占据整个 &lt;li&gt;

li {
  background: red;
  width: 100px;
}

a {
  background: blue;
  padding: 10px 20px;
  color: white;
  text-align: center;
  display: block;
}
<ul>
  <li>
    <a href='#'>Link</a>
  </li>
</ul>

【讨论】:

  • 我确实在a {} 中有display:block;,但它仍然不能解决问题...
  • 嗯,那我得仔细看看这个。如果我发现还有其他问题会更新。
  • 完全做到了!
【解决方案2】:

我不知道整个容器标签,但您只需将padding: relative 添加到您应用的文本或文本中即可...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-04
    • 2015-06-10
    • 2015-10-04
    • 2011-03-09
    • 2016-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多