javascript - 数据更改时不会触发 useEffect
问题描述
我用过滤器创建了一个表。每件事都运作良好。后来,我想将过滤器从材质 ui 更改为 Core ui。我创建了一个过滤器并尝试在移动之前对其进行测试。但它没有用。useEffect 无论如何都不会触发的问题。我什至尝试放置变量 x 并在单击发生时将其递增,并将其作为参数放入 useEffect 中。但什么也没发生。
函数 renderTableData(每次我选择过滤器时都会渲染我的表)函数 onSiteChange(当我选择过滤器时触发函数)函数 UpdateTableData(将第一次提供我的表)
谢谢你
******************************** RENDER TABLE *********************
const renderTableData = () => {
return (
<div className="selectTable">
<div
className="ag-theme-alpine"
style={{
height: "75vh",
width: "110wh",
alignContent: "center",
alignItems: "center",
alignSelf: "center",
}}
>
<AgGridReact
rowData={dataFiltred}
rowHeight={rowHeight}
rowStyle={{ textAlign: "center" }}
>
<AgGridColumn field="Pseudo"></AgGridColumn>
<AgGridColumn field="Site"></AgGridColumn>
<AgGridColumn field="Langue"></AgGridColumn>
<AgGridColumn field="Actif_Inactif"></AgGridColumn>
<AgGridColumn field="Date_Formation"></AgGridColumn>
<AgGridColumn field="Formateur"></AgGridColumn>
<AgGridColumn field="Nature_Formation"></AgGridColumn>
<AgGridColumn field="Durée"></AgGridColumn>
<AgGridColumn field="Action"></AgGridColumn>
</AgGridReact>
</div>
</div>
);
};
// ********************************* logic *********************
function onSiteChange(value, type) {
if (type === "Site") {
value.forEach((elem) => {
rowData.forEach((data) => {
if (data["Site"] === elem["value"]) {
dataSiteFiltred.push(data);
}
});
});
console.log(dataSiteFiltred);
if (dataSiteFiltred.length) {
dataFiltred = [];
dataSiteFiltred.forEach((elem94) => {
dataFiltred.push(elem94);
});
}
}
}
function updateTableData() {
if (!dataFiltred.length) {
rowData.forEach((elem) => {
dataFiltred.push(elem);
});
}
}
updateTableData();
useEffect(
() => {
renderTableData();
console.log("fired");
},
[dataFiltred],
[dataSiteFiltred]
);
解决方案
您没有使用任何状态,或更改不会导致重新渲染和 useEffect 相应的状态或道具
您将需要将您的dataFiltred
和dataSiteFiltred
存储在一个状态中,然后对其进行更新以导致重新渲染/使用效果。
像这样的东西:
const [dataFiltred, setDataFiltred] = useState([]);
并像这样更新您的状态:
setDataFiltred([...dataFiltred, elem94]);
useEffect 只接受一个依赖数组
因此,如果您想同时查看两个数组,请执行以下操作:
useEffect(
() => {
renderTableData();
console.log("fired");
},[dataFiltred, dataSiteFiltred]
);
如果在数组更改后它没有激活 useEffect,你可以考虑使用 Array.length
useEffect(
() => {
renderTableData();
console.log("fired");
},[dataFiltred.length, dataSiteFiltred.length]
);
推荐阅读
- powershell - 如何检查是否安装了chrome扩展
- apache-spark - 不安全模式下的 Elasticsearch pyspark 连接
- javascript - 计算特定 y 坐标的圆边缘的两个 x 坐标
- apache-spark - 在工人类路径中添加 spark.jars
- excel - 根据下拉列表中的选择从 Excel 数据透视表中获取数据
- spring - spring boot 2.3.1中如何自定义spring security消息
- python - 模块 google.cloud 没有属性 storage
- arrays - 根据月份和年份字符串对数组进行排序
- javascript - 创建和删除`
- c# - Unity 中的相对输入但全局移动