首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用JavaScript在React中过滤图像

使用JavaScript在React中过滤图像
EN

Stack Overflow用户
提问于 2020-12-01 22:05:23
回答 1查看 36关注 0票数 0

我有一个React应用程序和多个页面,正在导入到另一个component页面。所以我的一些页面会是这样的

代码语言:javascript
运行
复制
export default class Product1 extends React.Component {
  render() {
    return (
       <div className="product-box filterDiv shoes">
          <h2>Shoes 1</h2>
          <img className="product-image" src={product1} alt="" />
          <h5>$23.99</h5>
       </div>
    )
  }
}

其他页面是一样的,只是重命名为Product2, Product3...,并在className中添加/更改了类别。这些页面被导入到主页面product.js中,如下所示

代码语言:javascript
运行
复制
export default class Shop extends React.Component {
   render() {
      return (
         <div id="myBtnContainer">
             <button className="bttn active" onClick="filterSelection('all')">
            Show All
          </button>
          <button className="bttn" onClick="filterSelection('shoes')">
            Shoes
          </button>
          <button className="bttn" onClick="filterSelection('shirts')">
            Shirts
          </button>
          <button className="bttn" onClick="filterSelection('socks')">
            Socks
          </button>
          <button className="bttn" onClick="filterSelection('hats')">
            Hats
          </button>
        </div>

        <div className ="container">
            <Product1 />
            <Product2 />
            <Product3 />
        </div>
    )
  }
}

然后在product.js下面是过滤器按钮的JavaScript

代码语言:javascript
运行
复制
filterSelection("all");
function filterSelection(c) {
  var x, i;
  x = document.getElementsByClassName("filterDiv");
  if (c === "all") c = "";
  // add the "show" class (display:block) to the filtered elements
  // and remove the "show" class from the elements that are not selected
  for (i = 0; i < x.length; i++) {
    RemoveClass(x[i], "show");
    if (x[i].className.indexOf(c) > -1) AddClass(x[i], "show");
  }
}

// show filtered elements
function AddClass(element, name) {
  var i, arr1, arr2;
  arr1 = element.className.split(" ");
  arr2 = name.split(" ");
  for (i = 0; i < arr2.length; i++) {
    if (arr1.indexOf(arr2[i]) === -1) {
      element.className += " " + arr2[i];
    }
  }
}

// hide elements that are not selected
function RemoveClass(element, name) {
  var i, arr1, arr2;
  arr1 = element.className.split(" ");
  arr2 = name.split(" ");
  for (i = 0; i < arr2.length; i++) {
    while (arr1.indexOf(arr2[i]) > -1) {
      arr1.splice(arr1.indexOf(arr2[i]), 1);
    }
  }
  element.className = arr1.join(" ");
}

// add active class to the current control button and highlight it
var btnContainer = document.getElementById("myBtnContainer");
var btns = btnContainer.getElementsByClassName("bttn");
for (var i = 0; i < btns.length; i++) {
  btns[i].addEventListener("click", function () {
    var current = document.getElementsByClassName("active");
    current[0].className = current[0].className.replace(" active", "");
    this.className += " active";
  });
}

但是,我在控制台中收到以下错误

如何修复此错误?

EN

回答 1

Stack Overflow用户

发布于 2020-12-01 22:14:01

:你正在以一种无反应的方式思考它。

尝试创建一个包含所有活动过滤器的状态,因此只需将函数addClass和removeClass更改为addSelectedFilter(filterValue)和removeSelectedFilter(filterValue)

然后,在你的返回中,你应该检查过滤器是否在数组中,根据这些条件来应用你的类,比如:

代码语言:javascript
运行
复制
className={selectedFilters.includes("socks")? "bttn active" : "bttn"}

另外,您应该将此selectedFilters存储为状态,这对您来说清楚吗?如果你需要一些帮助来处理这个添加和删除功能,请让我知道。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65092015

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档