【问题标题】:How to change style of a different component on button click in react?如何在按钮单击时更改不同组件的样式?
【发布时间】:2019-07-06 05:02:02
【问题描述】:

我想在单击按钮时将 100% 的宽度应用于我的导航栏。最初,它将是 0%(隐藏)。 为此,我使用一个状态来跟踪导航栏的宽度,但是,我的状态似乎不会在点击时改变。

class Navbar extends Component {
  constructor(){
    super();
    this.state = {
      sidenav: {
        width: '0%',
      }
    }
  }

  showNavBar = () => {
    this.setState({
      sidenav: {
        width: '100%',
      }
    })
  }

  render(){
    return(
      <div>
        <div className ="sidenav" style ={{width : this.state.sidenav.width}}>
          <NavLink exact to="/">Home</NavLink>
          <NavLink exact to="/about">About</NavLink>
          <NavLink exact to="/portfolio">Portfolio</NavLink>
          <NavLink exact to="/contacts">Contacts</NavLink>
          <div className="content">
            <Route exact path="/" component={Home} />
            <Route exact path="/about" component={About} />
            <Route exact path="/portfolio" component={Portfolio} />
            <Route exact path="/contacts" component={Contacts} />
            </div>
        </div>
        <NavbarButton onClick={this.showNavBar}/>
      </div>
    )
  }
};

谁能指出我哪里出错了?

编辑:

所以我按照你们发布的示例进行操作,并且只有当我在渲染函数中明确给出时才使其工作。

所以这是我的 NavBarbutton 代码,也许有人能看出它为什么错了?

const NavbarButton = (props) => {
  return (
    <button style = {style} onClick = {props.showNavBar}>☰</button>
  )
}

【问题讨论】:

  • 你有没有看到这个问题:stackoverflow.com/q/37827279/4636715
  • 您的状态没有改变或样式没有更新?在render() 函数中执行console.log(this.state) 以查看点击后统计信息是否正在更新。
  • 您的css 有问题。代码工作正常。检查这个我快速创建的代码框示例codesandbox.io/s/o7p3xw8jz

标签: javascript reactjs


【解决方案1】:

您的代码工作正常,即宽度从 0% 变为 100%。

这是从您提供的代码派生的代码框。

https://codesandbox.io/s/lx24555w8z

如果您想在点击时显示导航栏,则可能使用显示属性而不是宽度。

【讨论】:

    【解决方案2】:

    改用 CSS 显示属性。

    import React, { Component } from "react";
    
    class Navbar extends Component {
      constructor() {
        super();
        this.state = {
          showNavBar: false
        };
      }
    
      showNavBar = () => {
        this.setState({
          showNavBar: true
        });
      };
    
      render() {
        return (
          <div>
            <div
              className="sidenav"
              style={{ display: this.state.showNavBar ? "block" : "none" }}
            >
              <NavLink exact to="/">
                Home
              </NavLink>
              <NavLink exact to="/about">
                About
              </NavLink>
              <NavLink exact to="/portfolio">
                Portfolio
              </NavLink>
              <NavLink exact to="/contacts">
                Contacts
              </NavLink>
              <div className="content">
                <Route exact path="/" component={Home} />
                <Route exact path="/about" component={About} />
                <Route exact path="/portfolio" component={Portfolio} />
                <Route exact path="/contacts" component={Contacts} />
              </div>
            </div>
            <NavbarButton onClick={this.showNavBar} />
          </div>
        );
      }
    }
    
    export default Navbar;

    【讨论】:

      【解决方案3】:

      所以问题是因为我不知道如何正确地将道具传递给子组件。

       const NavbarButton = (props) => {
        return (
          <button style = {style} onClick = {props.showNavBar}>☰</button>
        )
      }
      

      我的代码应该是

      <NavbarButton showNavBar={this.showNavBar}/>
      

      天哪,我现在觉得自己好傻!

      【讨论】:

        猜你喜欢
        • 2013-04-17
        • 2019-02-04
        • 1970-01-01
        • 2019-05-09
        • 1970-01-01
        • 2021-05-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多