【问题标题】:Creating Sticky Navbar with drop shadow in React js在 React js 中创建带有阴影的粘性导航栏
【发布时间】:2021-03-13 05:23:39
【问题描述】:

我尝试构建一个滚动时带有阴影的粘性导航栏。我尝试在导航上添加滚动,但它不起作用。

import React, { Component } from 'react'
import { MenuItems } from "./navbar"
import './navbar.css'
import { Button} from "../Button";

class Navbar extends Component {
  state = { clicked : false}
  scroll = {scrolled : false}
  handleScroll = () => {
    const offset = window.scrollY;
    if (offset > 200) {
      this.setState({scrolled : !this.scroll.scrolled})
    }
  }
  handleClick = () => {
    this.setState({ clicked: !this.state.clicked})
  }

  render() {
    return(
      <div onScroll={this.handleScroll}>
      <nav className={this.scroll.scrolled ? "NavbarItems" : "NavbarItems Scroll"}>
        <h1 className="navbar-logo">React <i className="fab fa-react"></i></h1>
        <div className="menu-icon" onClick={this.handleClick}>
          <i className={this.state.clicked ? "fas fa-times" : 'fas fa-bars'}></i>
        </div>
        <ul className={this.state.clicked ? 'nav-menu active' : 'nav-menu'}>
          {
            MenuItems.map((items, index) => {
              return (
                <li key = {index}><a className={items.cName} href={items.url}>
                  {items.title}
                </a></li>
              );
            })
          }
        </ul>
        <Button> Contact US </Button>
      </nav>
      </div>
    );
  }
}
export default Navbar

我做错了什么?不能那样做吗?我对 react 和 javascript 还很陌生,所以我猜这不是正确的方法。

如果有任何参考,请告诉我。这将是令人愉快的。

【问题讨论】:

    标签: javascript reactjs scroll


    【解决方案1】:

    我尝试了上面的解决方案,但它在滚动时不起作用,所以我尝试将逻辑放在 useEffect 中,并且效果很好。这是带有功能组件的代码:

      const Navbar = () => {
      const [scrolled, setScrolled] = useState(false);
    
      useEffect(() => {
        window.onscroll = function() {
          if (window.scrollY > 50) {
            setScrolled(true);
          } else {
            setScrolled(false);
          }
        };
      }, []);
    
      return (
        <div
          className={scrolled ? "navbar-container floatingNav" : "navbar-container"}
        > 
    

    【讨论】:

      【解决方案2】:

      您的状态不在构造方法中。当我们在 react js 中使用扩展类时,我们会在构造函数方法中初始化我们的状态。当我们使用功能组件时不需要这样做,从而降低复杂性,这也是功能组件受欢迎的众多原因之一。

      除此之外,我还做了更多,您可以在代码中看到 cmets 解释其他内容。

      class Navbar extends Component {
        constructor() {
          super(); // super allows you to access parent class's methods and allows us to use "this." in constructor().
          this.state = {
            clicked: false,
            scrolled: false,
          };
          // Note here too these bindings are necessary to make `this` work in the callback
          // In general, we use binding whenever we use "setState" when handling an event
          this.handleSroll = this.handleScroll.bind(this);
          this.handleClick = this.handleClick.bind(this);
        }
      
        handleScroll = () => {
          const offset = window.scrollY;
          if (offset > 200) {
            this.setState({ scrolled: !this.state.scrolled });
          }
        };
      
        handleClick = () => {
          this.setState({ clicked: !this.state.clicked });
        };
      
        render() {
          return (
            <div onScroll={this.handleScroll}>
              {/* Note here this.scroll.scrolled changes to this.state.scrolled */}
              <nav
                className={this.state.scrolled ? "NavbarItems" : "NavbarItems Scroll"}
              >
                <h1 className="navbar-logo">
                  React <i className="fab fa-react"></i>
                </h1>
                <div className="menu-icon" onClick={this.handleClick}>
                  <i
                    className={this.state.clicked ? "fas fa-times" : "fas fa-bars"}
                  ></i>
                </div>
                <ul className={this.state.clicked ? "nav-menu active" : "nav-menu"}>
                  {MenuItems.map((items, index) => {
                    return (
                      <li key={index}>
                        <a className={items.cName} href={items.url}>
                          {items.title}
                        </a>
                      </li>
                    );
                  })}
                </ul>
                <Button> Contact US </Button>
              </nav>
            </div>
          );
        }
      }
      
      export default Navbar;
      
      • 更多infosuper();

      • 为什么我们需要绑定[info]

      • 通过react官方docs了解事件处理

      我还建议您阅读有关功能组件的内容。

      【讨论】:

      • 为什么你有2个渲染??
      • @FARHANDIKAZAHRIRMUFTIGUENIA 修复了它,错误地发生了 :) 如果您有理解问题或有一些错误,请告诉我。
      • 有一个问题,我没有滚动任何东西,阴影已经掉了
      • @FARHANDIKAZAHRIRMUFTIGUENIA 这一定是一些逻辑错误,如果不对整个可重现的代码进行调试,将很难找到它。
      • @FARHANDIKAZAHRIRMUFTIGUENIA 我认为这可能是它尝试一下:{this.state.scrolled ? "NavbarItems" : "NavbarItems Scroll"} 应该是 {this.state.scrolled ? "NavbarItems Scroll" : "NavbarItems"} 因为如果 scrolled 是真的你需要添加 Scroll 类否则不是,你反之亦然
      【解决方案3】:

      您的状态应该在构造函数中:

      constructor(){
        super();
        this.state ={
            clicked : false,
            scrolled : false
         }
      }
      

      完全改变:

          import React, { Component } from 'react'
          import { MenuItems } from "./navbar"
          import './navbar.css'
          import { Button} from "../Button";
          
          class Navbar extends Component {
               constructor(){
                     super();
                     this.state ={
                         clicked : false,
                         scrolled : false
                      }
                   }
              handleScroll = () => {
                  const offset = window.scrollY;
                  if (offset > 200) {
                      this.setState({scrolled : !this.state.scrolled})
                  }
              }
              handleClick = () => {
                  this.setState({ clicked: !this.state.clicked})
              }
          
              render() {
                  return(
                      <div onScroll={this.handleScroll}>
                      <nav className={this.state.scrolled ? "NavbarItems" : "NavbarItems Scroll"}>
                          <h1 className="navbar-logo">React <i className="fab fa-react"></i></h1>
                          <div className="menu-icon" onClick={this.handleClick}>
                              <i className={this.state.clicked ? "fas fa-times" : 'fas fa-bars'}></i>
                          </div>
                          <ul className={this.state.clicked ? 'nav-menu active' : 'nav-menu'}>
                              {
                                  MenuItems.map((items, index) => {
                                      return (
                                          <li key = {index}><a className={items.cName} href={items.url}>
                                              {items.title}
                                          </a></li>
                                      );
                                  })
                              }
                          </ul>
                          <Button> Contact US </Button>
                      </nav>
                      </div>
                  );
              }
          }
          export default Navbar
      

      这能解决您的问题吗?

      【讨论】:

      • 我没有滚动任何东西,它显示了阴影。所以不,对不起
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-18
      • 1970-01-01
      • 2017-09-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多