繁体   English   中英

将 jquery 转换为 react-addclass 和 removeclass 函数而无需切换

[英]Converting jquery to react - addclass and removeclass functions without toggling

我正在尝试为画廊列表创建 2 个网格调整大小按钮。 一种用于较小的网格 (.museum-grid),另一种用于大型网格 (.large-grid)。

当我单击#museum-grid-btn 时,我想执行以下操作:

  • addclass .museum-grid 到 #gallery-list
  • 从#gallery-list 中删除类 .large-grid
  • addclass .grid-active 到 #museum-grid-btn
  • 从#museum-grid-btn 中删除类 .grid-active

当我点击 #large-grid-btn 时,我想做相反的事情:

  • 将class .large-grid 添加到#gallery-list
  • 从#gallery-list 中删除类 .museum-grid
  • addclass .grid-active 到 #large-grid-btn
  • 从#museum-grid-btn 中删除类 .grid-active

我是这样做的,而不是将切换 bc 用于界面目的,我觉得允许切换网格大小按钮选择会很奇怪。 我想点击一个网格大小,然后如果我再次点击它,相同的状态会保持不变。 只有当我单击另一个选项时,我才希望更改网格大小。 这反映在 jquery 中。 我很难弄清楚如何将其转换为反应,因为它不像切换那么简单; 虽然也许我忽略了一种更简单的方法。

这是我为此所拥有的 jquery

$(document).ready(function(){
       
    $('#museum-grid-btn').on('click', function(e) {
        $('#gallery-list').addclassName("museum-grid");
        $('#gallery-list').removeclassName("large-grid");
        $('#museum-grid-btn').addclassName("grid-active");
        $('#large-grid-btn').removeclassName("grid-active");
        e.preventDefault();
        });
    $('#large-grid-btn').on('click', function(e) {
        $('#gallery-list').addclassName("large-grid");
        $('#gallery-list').removeclassName("museum-grid");
        $('#large-grid-btn').addclassName("grid-active");
        $('#museum-grid-btn').removeclassName("grid-active");
        e.preventDefault();
        });
      
});

和 html

<body>
    <section id="main"> 
        <div id="the-gallery">
            <div id="search">
                <input type="search" id="gallery-search" name="q" placeholder="#">
                <div id="filter-btn" class="control-btn">
                    <button id="filter-icon"><img src="img/gallery-filter.svg"/></button>
                </div>
                <div id="large-grid-btn" class="control-btn">
                    <button id="large-grid-icon"><i class="fas fa-th-large"></i></i></button>
                </div>
                <div id="museum-grid-btn" class="control-btn grid-active">
                    <button id="museum-grid-icon"><i class="fas fa-th"></i></button>
                </div>
            </div> 
            <ul id="gallery-list" class="museum-grid">
                <li class="gallery-item">
                    <img src="img/00001.jpg">
                    <div class="listing-title-row">
                        <h2>#00001</h2>
                        <div class="listing-views"><i class="fas fa-eye"></i> 1.5k</div><div class="listing-likes"><a><i class="fas fa-heart"></i></a> 100</div>
                    </div>
                </li>
                <li class="gallery-item">
                    <img src="img/00002.jpg">
                    <div class="listing-title-row">
                        <h2>#00002</h2>
                        <div class="listing-views"><i class="fas fa-eye"></i> 1.5k</div><div class="listing-likes"><a><i class="fas fa-heart"></i></a> 100</div>
                    </div>
                </li>
                <li class="gallery-item">
                    <img src="img/00003.jpg">
                    <div class="listing-title-row">
                        <h2>#00003</h2>
                        <div class="listing-views"><i class="fas fa-eye"></i> 1.5k</div><div class="listing-likes"><a><i class="fas fa-heart"></i></a> 100</div>
                    </div>
                </li>
                <li class="gallery-item">
                    <img src="img/00004.jpg">
                    <div class="listing-title-row">
                        <h2>#00004</h2>
                        <div class="listing-views"><i class="fas fa-eye"></i> 1.5k</div><div class="listing-likes"><a><i class="fas fa-heart"></i></a> 100</div>
                    </div>
                </li>
                <li class="gallery-item">
                    <img src="img/00005.jpg">
                    <div class="listing-title-row">
                        <h2>#00005</h2>
                        <div class="listing-views"><i class="fas fa-eye"></i> 1.5k</div><div class="listing-likes"><a><i class="fas fa-heart"></i></a> 100</div>
                    </div>
                </li>
                <li class="gallery-item">
                    <img src="img/00006.jpg">
                    <div class="listing-title-row">
                        <h2>#00006</h2>
                        <div class="listing-views"><i class="fas fa-eye"></i> 1.5k</div><div class="listing-likes"><a><i class="fas fa-heart"></i></a> 100</div>
                    </div>
                </li>
                <li class="gallery-item">
                    <img src="img/00007.jpg">
                    <div class="listing-title-row">
                        <h2>#00007</h2>
                        <div class="listing-views"><i class="fas fa-eye"></i> 1.5k</div><div class="listing-likes"><a><i class="fas fa-heart"></i></a> 100</div>
                    </div>
                </li>
                <li class="gallery-item">
                    <img src="img/00008.jpg">
                    <div class="listing-title-row">
                        <h2>#00008</h2>
                        <div class="listing-views"><i class="fas fa-eye"></i> 1.5k</div><div class="listing-likes"><a><i class="fas fa-heart"></i></a> 100</div>
                    </div>
                </li>
                <li class="gallery-item">
                    <img src="img/00009.jpg">
                    <div class="listing-title-row">
                        <h2>#00009</h2>
                        <div class="listing-views"><i class="fas fa-eye"></i> 1.5k</div><div class="listing-likes"><a><i class="fas fa-heart"></i></a> 100</div>
                    </div>
                </li>
                <li class="gallery-item">
                    <img src="img/00010.jpg">
                    <div class="listing-title-row">
                        <h2>#00010</h2>
                        <div class="listing-views"><i class="fas fa-eye"></i> 1.5k</div><div class="listing-likes"><a><i class="fas fa-heart"></i></a> 100</div>
                    </div>
                </li>
            </ul>
        </div>     
    </section>
</body>
  • .grid-active 更改所选按钮的样式以指示它已被选中。
  • .museum-grid 和 .large-grid 改变网格列表项的大小

在反应模板中激活此功能的合适方法是什么? 我熟悉使用 usestate 并在 onClick 上制作切换功能,但是如果我想执行上述操作怎么办? 我欣赏和指导。

补充资料:

我是个新手,所以我不能 100% 确定这是一个功能组件还是类组件。 我只是想让它工作。 我已经做了一些工作来使用切换来扩展和关闭过滤器菜单。 这是我的 tsx 文件中的代码。 也许你可以告诉我我正在使用哪个 - 功能组件或类组件?

import React, { useState } from "react";
 
function VisionExplorer() {
  
  // Creating a state for the filter pane.
  const [filterToggled, setFilterToggled] = useState(false);
  const ToggleFilter = ()=>{
    filterToggled ? setFilterToggled(false) : setFilterToggled(true);
  }

<main id="main" className={filterToggled ? "filter-open" : ""}>

<div id="filter-btn" className="control-btn" onClick={ToggleFilter}>
   <button id="filter-icon">
      <img src="/assets/images/gallery-filter.svg" />
   </button>
</div>

这段代码将过滤器打开类切换到主 div,我使用 css 打开和关闭过滤器窗格。 我使用过滤器按钮上的切换。 这是函数还是类组件?

你可以在 React 中使用 state 来协助处理。

不知道你用的是函数组件还是类组件。

下面是一个使用函数组件的例子:

const ComponentA = () => {
    // Set up a state variable to control the mode (Normal / Large) of the component.
    // mode will be the value stored for the current render.
    // setMode is a function that lets you update mode.
    // https://reactjs.org/docs/hooks-state.html
    const [mode, setMode] = useState('Normal');

    // On large button click handler.
    const onLargeClick = () => {
        // When setMode is called the component will rerender with the new value.
        setMode('Large');
    };

    // On normal button click handler
    const onNormalClick = () => {
        // When setMode is called the component will rerender with the new value.
        setMode('Normal');
    };

    return (
        <>
            { /* Swap size related class name based on mode value */ }
            <div 
                className={mode === 'Large' ? 'classLarge' : 'classNormal'}
            >
                Text
            </div>
            { /* Swap active class name for normal button based on mode value */ }
            <div 
                onClick={onNormalClick}
                className={mode === 'Normal' ? 'classActive' : undefined}
            >
                Normal
            </div>
            { /* Swap active class name for large button based on mode value */ }
            <div 
                onClick={onLargeClick}
                className={mode === 'Large' ? 'classActive' : undefined}
            >
                Large
            </div>
        </>
    )
};

注意:您可以查看像clsx这样的包,而不是对类名使用三元语句。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM