基于滚动React JS切换类

Fer*_*o B 8 javascript events dom-events twitter-bootstrap reactjs

我正在使用bootstrap 4导航栏,并希望在ig 400px向下向下滚动后更改背景颜色.我正在查看反应文档并找到了一个onScroll但却找不到那么多信息.到目前为止我有

我不知道我是否正在使用正确的事件监听器或如何设置高度等.

我并没有真正设置内联样式

  import React, { Component } from 'react';

   class App extends Component {

   constructor(props) {
    super(props);

      this.state = {  scrollBackground: 'nav-bg' };
      this.handleScroll = this.handleScroll.bind(this);
   }


   handleScroll(){
      this.setState ({
         scrollBackground: !this.state.scrollBackground
       })
    }

 render() {
 const scrollBg = this.scrollBackground ? 'nav-bg scrolling' : 'nav-bg';

 return (
   <div>

       <Navbar inverse toggleable className={this.state.scrollBackground} 
                                  onScroll={this.handleScroll}>
        ...
      </Navbar>

    </div>
   );
  }
}

export default App;
Run Code Online (Sandbox Code Playgroud)

gle*_*yes 17

添加滚动侦听器的componentDidMount()一种方法是使用生命周期方法.以下示例应该给你一个想法:

import React from 'react';
import { render } from 'react-dom';

class App extends React.Component {
  state = {
    isTop: true,
  };

  componentDidMount() {
    document.addEventListener('scroll', () => {
      const isTop = window.scrollY < 100;
      if (isTop !== this.state.isTop) {
          this.setState({ isTop })
      }
    });
  }
  render() {
    return (
      <div style={{ height: '200vh' }}>
        <h2 style={{ position: 'fixed', top: 0 }}>Scroll {this.state.isTop ? 'down' : 'up'}!</h2>
      </div>
    );
  }
} 

render(<App />, document.getElementById('root'));
Run Code Online (Sandbox Code Playgroud)

当您的scrollY位置为100及以上时,这会将文本从"向下滚动"更改为"向上滚动".

编辑:应该避免在每个滚动上更新状态的过度杀伤.仅在布尔值更改时更新它.


Pou*_*aei 7

对于那些在2019年阅读此问题的人,我采取了@glennreyes的答案并使用React Hooks重写了它:

  const [scroll, setScroll] = useState(0)

  useEffect(() => {
    document.addEventListener("scroll", () => {
      const scrollCheck = window.scrollY < 100
      if (scrollCheck !== scroll) {
        setScroll(scrollCheck)
      }
    })
  })
Run Code Online (Sandbox Code Playgroud)

请记住,useState具有两个元素的数组,首先是状态对象,其次是更新它函数

大致而言,useEffect可帮助我们替换componentDidmount,当前编写的函数不会进行任何清理,因为在这种情况下没有必要。

如果发现清理非常必要,则可以在useEffect内部返回一个函数。

您可以在这里全面阅读。

更新:

如果你们想使其模块化甚至进行清理,则可以执行以下操作:

  1. 创建一个自定义钩子,如下所示;

    import { useState, useEffect } from "react"
    
    export const useScrollHandler = () => {
    // setting initial value to true
    const [scroll, setScroll] = useState(1)
    
    // running on mount
    useEffect(() => {
      const onScroll = () => {
        const scrollCheck = window.scrollY < 10
        if (scrollCheck !== scroll) {
          setScroll(scrollCheck)
        }
      }
    
    // setting the event handler from web API
    document.addEventListener("scroll", onScroll)
    
    // cleaning up from the web API
     return () => {
       document.removeEventListener("scroll", onScroll)
      }
    }, [scroll, setScroll])
    
    return scroll
    
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 找到的任何组件调用它

    const component = () => {
    
    // calling our custom hook
    const scroll = useScrollHandler()
    
    ....... rest of your code
    
    }
    
    Run Code Online (Sandbox Code Playgroud)


小智 7

 const [scroll, setScroll] = useState(false);

 useEffect(() => {
   window.addEventListener("scroll", () => {
     setScroll(window.scrollY > specify_height_you_want_to_change_after_here);
   });
 }, []); 
Run Code Online (Sandbox Code Playgroud)

然后你可以根据滚动改变你的班级或任何东西。

<nav className={scroll ? "bg-black" : "bg-white"}>...</nav>

Run Code Online (Sandbox Code Playgroud)


小智 5

更好了

import React from 'react';
import { render } from 'react-dom';

class App extends React.Component {
    constructor(props) {
    super(props);

    this.state = {
      isTop: true
    };
    this.onScroll = this.onScroll.bind(this);
  }

  componentDidMount() {
    document.addEventListener('scroll', () => {
      const isTop = window.scrollY < 100;
      if (isTop !== this.state.isTop) {
        this.onScroll(isTop);
      }
    });
  }

  onScroll(isTop) {
    this.setState({ isTop });
  }

  render() {
    return (
      <div style={{ height: '200vh' }}>
        <h2 style={{ position: 'fixed', top: 0 }}>Scroll {this.state.isTop ? 'down' : 'up'}!</h2>
      </div>
    );
  }
} 

render(<App />, document.getElementById('root'));
Run Code Online (Sandbox Code Playgroud)