javascript - 如何在单击交叉选项时从应用的过滤器中删除元素?- Reactjs/JavaScript
问题描述
我正在做一个 React 演示项目。这是演示
我使用两列创建了过滤器。现在我选择的任何过滤器都会显示在页面的顶部。现在我可以通过取消下拉菜单来删除过滤器。但我也想从显示过滤器的顶部区域删除过滤器。如您所见,在应用的过滤器顶部 div 中有一个交叉选项。当我单击任何应删除 div 的交叉选项时,也应删除相应的下拉菜单。
这是我整个页面的代码
import React from "react";
import { render } from "react-dom";
import { makeData } from "./Utils";
import Select from "react-select";
import "react-select/dist/react-select.css";
// Import React Table
import ReactTable from "react-table";
import "react-table/react-table.css";
import jsondata from "./sample";
class App extends React.Component {
constructor() {
super();
this.state = {
// data: makeData(),
data: jsondata,
filtered: [],
firstNameselect: [],
lastNameselect: []
};
this.uniqueOptions = this.uniqueOptions.bind(this);
this.handleFilter = this.handleFilter.bind(this);
}
onFilteredChangeCustom(value, accessor) {
console.log("accessor typeof " + typeof accessor);
console.log("The value is " + value);
let filtered = this.state.filtered;
console.log("the filtered items" + JSON.stringify(this.state.filtered));
let insertNewFilter = 1;
if (filtered.length) {
console.log("filtered.length " + filtered.length);
filtered.forEach((filter, i) => {
if (filter["id"] === accessor) {
if (value === "" || !value.length) filtered.splice(i, 1);
else filter["value"] = value;
insertNewFilter = 0;
}
});
}
if (insertNewFilter) {
filtered.push({ id: accessor, value: value });
}
this.setState({ filtered: filtered });
console.log("this.state.filtered " + JSON.stringify(this.state.filtered));
}
uniqueOptions = (objectsArray, objectKey) => {
var a = objectsArray.map((o, i) => {
return o[objectKey];
});
return a.filter(function(i, index) {
return a.indexOf(i) >= index;
});
};
handleFilter(item) {
console.log("Inside enter handleFilter");
console.log("console.log - > item.target.value " + item.target.value);
}
render() {
const { data } = this.state;
const a = this.state.filtered;
return (
<div>
<div className="applied-filter">
{this.state.filtered.length > 0 && (
<div className="applied-filter-text">Applied filters :</div>
)}
{a.map((obj, key) => {
return (
<div className="elliptical-applied-filter" key={key}>
{obj.id}: {obj.value.join(",\u00A0")}
{"\u00A0"}
<div
className="elliptical-applied-filter-cross"
onClick={this.handleFilter}
>
<input
type="image"
id="cross-icon"
src="https://image.flaticon.com/icons/png/128/126/126497.png"
alt="close"
/>
</div>
</div>
);
})}
</div>
<br />
<br />
Select FirstName :{" "}
<Select
style={{ width: "50%", marginBottom: "20px" }}
onChange={entry => {
this.setState(
{
firstNameselect: entry
},
() => {
console.log(
"this.state.firstNameselect " +
JSON.stringify(this.state.firstNameselect)
);
}
);
this.onFilteredChangeCustom(
entry.map(o => {
return o.value;
}),
"firstName"
);
}}
value={this.state.firstNameselect}
multi={true}
options={this.uniqueOptions(this.state.data, "firstName").map(
(name, i) => {
return { id: i, value: name, label: name };
}
)}
/>
Select LastName :{" "}
<Select
style={{ width: "50%", marginBottom: "20px" }}
onChange={entry => {
this.setState(
{
lastNameselect: entry
},
() => {
console.log(
"this.state.lastNameselect " +
JSON.stringify(this.state.lastNameselect)
);
}
);
this.onFilteredChangeCustom(
entry.map(o => {
return o.value;
}),
"lastName"
);
}}
value={this.state.lastNameselect}
multi={true}
options={this.uniqueOptions(this.state.data, "lastName").map(
(name, i) => {
return { id: i, value: name, label: name };
}
)}
/>
<ReactTable
data={data}
filtered={this.state.filtered}
onFilteredChange={(filtered, column, value) => {
this.onFilteredChangeCustom(value, column.id || column.accessor);
}}
defaultFilterMethod={(filter, row, column) => {
const id = filter.pivotId || filter.id;
if (typeof filter.value === "object") {
return row[id] !== undefined
? filter.value.indexOf(row[id]) > -1
: true;
} else {
return row[id] !== undefined
? String(row[id]).indexOf(filter.value) > -1
: true;
}
}}
columns={[
{
Header: "Name",
columns: [
{
Header: "First Name",
accessor: "firstName"
},
{
Header: "Last Name",
id: "lastName",
accessor: d => d.lastName
}
]
},
{
Header: "Info",
columns: [
{
Header: "Age",
accessor: "age"
}
]
}
]}
defaultPageSize={10}
className="-striped -highlight"
/>
<br />
</div>
);
}
}
render(<App />, document.getElementById("root"));
请查看此演示以了解我想要实现的目标。
单击十字图标 lastName 椭圆 div 时 this.state.lastNameselect 应该是空白的,并且 this.state.filtered 中的相应子对象也应该被删除
同样,当单击十字图标 firstName 椭圆 div 时,this.state.firstNameselect 应该是空白的,并且 this.state.filtered 中的相应子对象也应该被删除。
我怎样才能实现这个功能?请帮忙。我需要一个通用的解决方案。现在我有 2 个下拉菜单,将来我会有更多。例如,如果我们单击姓氏的十字图标,则姓氏条目应设置为空白。名字应该保持原样。名字的点击图标也会发生同样的情况
解决方案
您需要添加handleFilter
更改语句,因为您已经拥有所有值,您可以将其传递给事件并使用它来过滤它,我试图使其对名字和姓氏都通用。这将从状态中删除条目并以删除的条目进行响应。
检查这个
handleFilter(item) {
var itemName =
item.id === "firstName" ? "firstNameselect" : "lastNameselect";
console.log(item);
this.setState({
...this.state,
[itemName]: this.state.firstNameselect.filter(
a => item.value.indexOf(a.value) < 0
),
filtered: this.state.filtered.filter(a => {
if (item.id === a.id) {
return false;
}
return true;
})
});
}
推荐阅读
- android - 地理位置不适用于华为设备上的 WebChromeClient
- python - VSCode Code Runner 在第一次运行时未激活虚拟环境,但适用于同一终端中的后续运行
- c - 在函数原型设计中使用分而治之的错误来查找数组中的最小和最大元素
- python-3.x - 使用包含代理的 python 下载文件的问题
- bootstrap-4 - 使用引导程序将两个按钮与中心对齐
- excel - 如何将代码链接到命令按钮?
- python - pygame 中的属性错误“AttributeError: 'Star' object has no attribute 'add_internal”
- python - uwsgi ssl 问题错误不可用修饰符请求:22
- python - How to draw lines using Polyline and use coordinates from a pandas dataframe
- c - C bulk write multiple values at once