Javascript 如何在React中正确更新类名?
在向下滚动时,我添加和删除了某些类。我想在向上滚动时恢复类。如何仅使用ReactJS完成 我已经使用事件侦听器更改了类Javascript 如何在React中正确更新类名?,javascript,reactjs,react-bootstrap,Javascript,Reactjs,React Bootstrap,在向下滚动时,我添加和删除了某些类。我想在向上滚动时恢复类。如何仅使用ReactJS完成 我已经使用事件侦听器更改了类 主要概念是NavBar的内容应该显示在中心,当我们向下滚动时,显示在DIV中的网站名称应该显示在NavBar上,中间的内容应该向左移动,显示网站名称的DIV应该消失。 当我们使用网站名称向上滚动到div时,所有内容都应该恢复到向下滚动之前的状态 import React, { Component } from 'react'; import '../Styles/Navbar.
主要概念是NavBar的内容应该显示在中心,当我们向下滚动时,显示在DIV中的网站名称应该显示在NavBar上,中间的内容应该向左移动,显示网站名称的DIV应该消失。 当我们使用网站名称向上滚动到div时,所有内容都应该恢复到向下滚动之前的状态
import React, { Component } from 'react';
import '../Styles/Navbar.css';
export class Navbar extends Component {
handleScrollToElement(event) {
let linkPosition = document.querySelector('.collapse');
let brandName = document.querySelector('.navbar-brand');
if (window.pageYOffset > 250){
linkPosition.classList.remove('justify-content-center');
linkPosition.classList.add('justify-content-end');
brandName.classList.remove('invisible');
brandName.classList.add('visible');
}
}
componentDidMount() {
window.addEventListener('scroll', this.handleScrollToElement);
}
componentWillUnmount() {
window.removeEventListener('scroll', this.handleScrollToElement);
}
render() {
return (
<div>
<nav className='navbar navbar-expand-sm bg-dark navbar-dark fixed-top'>
<a className='navbar-brand invisible' href='#'>Website Name</a>
<button className='navbar-toggler' type='button' data-toggle='collapse' data-target='#navbarSupportedContent' aria-controls='navbarSupportedContent' aria-expanded='false' aria-label='Toggle navigation'>
<span className='navbar-toggler-icon'></span>
</button>
<div className='collapse navbar-collapse justify-content-center' id='navbarSupportedContent'>
<ul className='navbar-nav'>
<li className='nav-item active'>
<a className='nav-link' href='#'>Home</a>
</li>
<li className='nav-item'>
<a className='nav-link' href='#'>Item 2</a>
</li>
<li className='nav-item'>
<a className='nav-link' href='#'>About Us</a>
</li>
<li className='nav-item'>
<a className='nav-link' href='#'>Contact</a>
</li>
</ul>
</div>
</nav>
<div className='container-fluid hpage'>
<div className='inner'>
<h1 className='htext' >WEBSITE TITLE</h1>
</div>
</div>
</div>
)
}
}
export default Navbar;
import React,{Component}来自'React';
导入“../Styles/Navbar.css”;
导出类导航栏扩展组件{
handleScrollToElement(事件){
让linkPosition=document.querySelector('.collapse');
让brandName=document.querySelector('.navbar brand');
如果(window.pageYOffset>250){
linkPosition.classList.remove('justify-content-center');
linkPosition.classList.add('justify-content-end');
brandName.classList.remove('invisible');
brandName.classList.add('visible');
}
}
componentDidMount(){
window.addEventListener('scroll',this.handleScrollToElement);
}
组件将卸载(){
window.removeEventListener('scroll',this.handleScrollToElement);
}
render(){
返回(
-
-
-
-
网站标题
)
}
}
导出默认导航栏;
使用React.js时,应尽可能避免直接的DOM操作。如果您确实需要对DOM的引用,则应该使用
我会将linkPosition
和brandName
的classNames
设置为constructor
中的状态,并在handleScrollToElement
中更新它们
无论何时更改这些状态
变量,都将调用渲染
函数并更新视图
由于scroll
事件在短时间内引发了大量事件,因此我也担心性能问题。因此,我在代码中添加了防止重新渲染未更改的视图
您还可以考虑取消调用的滚动事件处理程序函数,以减少调用<代码> SETSTATE< /COD> < < /P>的数量。
import React,{Component}来自'React';
导入“../Styles/Navbar.css”;
导出类导航栏扩展组件{
建造师(道具){
超级(道具);
此.state={
linkPositionClassName:“验证资源中心”,
brandNameClassName:“不可见”,
};
}
handleScrollToElement(事件){
如果(window.pageYOffset>250){
这是我的国家({
linkPositionClassName:“证明内容结束”,
brandNameClassName:'可见',
});
}否则{
这是我的国家({
linkPositionClassName:“验证资源中心”,
brandNameClassName:“不可见”,
});
}
}
shouldComponentUpdate(下一步,下一步状态){
const{linkPositionClassName,brandNameClassName}=this.state;
//只有当至少一个状态发生更改时,组件才需要重新渲染
返回nextState.linkPositionClassName!==linkPositionClassName | | nextState.brandNameClassName!==brandNameClassName;
}
componentDidMount(){
window.addEventListener('scroll',this.handleScrollToElement);
}
组件将卸载(){
window.removeEventListener('scroll',this.handleScrollToElement);
}
render(){
返回(
-
-
-
-
网站标题
)
}
}
导出默认导航栏;
是否也可以发布可以运行的工作剪贴?谢谢。一个问题是导航栏中滚动前的内容没有正确居中,可以添加任何css?默认的linkPositionClassName
是居中的。您可能需要查看css中的类名。