如何在react-bootstrap中更改选项卡上调用事件

问题描述 投票:0回答:4

我已经使用 React-Bootstrap 在我的 React 应用程序中实现了导航选项卡。

像这样:

<Tabs defaultActiveKey={1}>
  <Tab eventKey={1} title="Log in">
    {/* Irrelevant code */}
  </Tab>
  <Tab eventKey={2} title="Sign up">
    {/* Irrelevant code */}
  </Tab>
</Tabs>

现在在更改选项卡时我想调用以下函数:

changeTab(login) {
  if (login)
    this.setState({ heading: "Log in" })
  else
    this.setState({ heading: "Sign up" })
}

其中

login
是一个布尔值,当选择
true
选项卡时将为
Log in
,当选择
false
选项卡时为
Sign up

我怎样才能做到这一点?

编辑:

我发现你可以在单击选项卡时调用一个函数,如下所示:

<Tabs defaultActiveKey={1} onClick={()=>this.changeTab()}>
  <Tab eventKey={1} title="Log in">
    {/* Irrelevant code */}
  </Tab>
  <Tab eventKey={1} title="Sign up">
    {/* Irrelevant code */}
  </Tab>
</Tabs>

但是我怎么知道点击了哪个选项卡呢?我需要它根据单击的选项卡来更改状态。

reactjs tabs react-bootstrap
4个回答
23
投票

您需要在

onSelect
组件中使用
Tabs

像这样:

<Tabs defaultActiveKey={1} onSelect={this.handleSelect()}>
  <Tab eventKey={1} title="Log in">
    {/* Irrelevant code */}
  </Tab>
  <Tab eventKey={2} title="Sign up">
    {/* Irrelevant code */}
  </Tab>
</Tabs>

然后将其设为您的

handleSelect
功能:

handleSelect(key) {
  if (key === 1)
    this.setState({ heading: "Log in" })
  else
    this.setState({ heading: "Sign up" })
}

对于多个处理程序,您可以执行以下操作:

handleSelect(key) {
  {
    1: this.setState({ heading: "Log in" }),
    2: this.setState({ heading: "Sign up" }),
    3: this.setState({ heading: "Something Else" }),
  }[key]
}

4
投票
<Tab.Container id="" defaultActiveKey={key} onSelect={this.handleSelect}>
   <Nav variant="tabs">
        <Nav.Item>
        <Nav.Link eventKey={'1'}>Staking</Nav.Link>
        </Nav.Item>

        <Nav.Item>
        <Nav.Link eventKey={'2'}>Providers</Nav.Link>
        </Nav.Item>

        <Nav.Item>
        <Nav.Link eventKey={'3'}>Overview</Nav.Link>
        </Nav.Item>
    </Nav>
    <Tab.Content>
        <Tab.Pane eventKey={'1'}>
         <Row>
             <Col>
              1111
             </Col>
         </Row>
        </Tab.Pane>
    </Tab.Content>
    <Tab.Content>
        <Tab.Pane eventKey={'2'}>
        <div>22222</div>
        </Tab.Pane>
    </Tab.Content>
    <Tab.Content>
        <Tab.Pane eventKey={'3'}>
        <div>333</div>
        </Tab.Pane>
    </Tab.Content>
 </Tab.Container>

现在在您所在的州添加初始值为“1”的“key”字段

  constructor(props) {
    super(props);
    this.state = {
     key: '1'
    };
  }

然后写一个函数

  handleSelect = (key) => {
      console.log(key,';;',typeof key)
      if(key === '1') {
          console.log('ll', key)
      } else if(key === '2') {
        console.log('ll', key)
      } else if(key === '3') {
        console.log('ll', key)
      }
  }

最初,当页面加载时,不会调用该函数,因此您可以在第一个选项卡、componentDidMount 或任何其他函数中进行 API 调用或您想要执行的任何操作,并将其放置在第一个选项卡中,即我写下 1111 的位置,此后,当您单击另一个选项卡时,将调用 handleSelect 函数,并根据键值并使用 if..else 语句来执行特定选项卡的特定任务。

希望这有帮助。如果有任何问题请在评论部分告诉我们。


1
投票

这里,你可以像

Barry Michael Doyle
所说的那样使用onSelect。让我给你发一个示例代码,让你更清楚。

function Example() {

    return (
        <Tabs defaultActiveKey="home" id="uncontrolled-tab-example"
        className="mb-3" onSelect={(e) => handleClick(e)}>
        
            <Tab eventKey="homeTab" title="Home">
            </Tab>
            <Tab eventKey="profileTab" title="Profile">
            </Tab>
            <Tab eventKey="contactTab" title="Contact">
            </Tab>
            
        </Tabs>
    );

    function handleClick(e) {
        console.count(e);
        
        //result will be the eventKey of the tab you clicked on.
        
        // `homeTab` (when clicked on home tab)
        // `profileTab` (when clicked on profile tab)
        // `constactTab` (when clicked on Contact tab)
    }

}


0
投票
             <Tab.Content>
                    <Tab.Pane eventKey="first">
                        <Row>
                            {
                                projects.map( (project, index) => {
                                    return{
                                       <p>{project.title}</p>
                                
                                    }
                                })
                            }
                        </Row>
                    </Tab.Pane>
                </Tab.Content>
© www.soinside.com 2019 - 2024. All rights reserved.