我有一个React应用程序和多个页面,正在导入到另一个component页面。所以我的一些页面会是这样的
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中,如下所示
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
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";
});
}但是,我在控制台中收到以下错误

如何修复此错误?
发布于 2020-12-01 22:14:01
:你正在以一种无反应的方式思考它。
尝试创建一个包含所有活动过滤器的状态,因此只需将函数addClass和removeClass更改为addSelectedFilter(filterValue)和removeSelectedFilter(filterValue)
然后,在你的返回中,你应该检查过滤器是否在数组中,根据这些条件来应用你的类,比如:
className={selectedFilters.includes("socks")? "bttn active" : "bttn"}另外,您应该将此selectedFilters存储为状态,这对您来说清楚吗?如果你需要一些帮助来处理这个添加和删除功能,请让我知道。
https://stackoverflow.com/questions/65092015
复制相似问题