React useEffect Hook 抱怨缺少依赖
React useEffect Hook complains about missing dependency
我有两个相互通信的组件。在组件 A 中,我有一个位置列表,每当用户单击此组件中的一个位置时,都会根据单击的位置过滤组件 B 中的属性列表。这行得通,到目前为止一切顺利。但是在组件 B 中,我使用一个 useEffect 挂钩来检查通过组件 A 的 props 到达它的 selectedLocation 变量,这样我就可以更新状态。在这个 useEffect() 调用中,VS Code 抱怨说“React useEffect Hook 缺少依赖项”...dataState”。但是我当然不能将 dataState 放入依赖项数组中,因为它会导致无限循环。而且顺便说一下,dateState 是通过 useState Hook 管理的。这是我的 useEffect 钩子:
// If there is a new selected location from the treeview, update the grid state
useEffect(() => {
const newState: State = {
...dataState,
filter: {
logic: 'and',
filters: [
{
field: 'location',
operator: 'contains',
value: selectedLocation,
},
],
},
};
setDataState(newState);
}, [selectedLocation]);
如有任何帮助,我们将不胜感激。
尝试这样设置 dataState
:
useEffect(() => {
setDataState(oldDataState => ({
...oldDataState ,
filter: {
logic: 'and',
filters: [
{
field: 'location',
operator: 'contains',
value: selectedLocation,
},
],
},
}));
}, [selectedLocation]);
这样它将被视为 parameter
而不是依赖项。
实际上,"...dataState"
未在您的 B 组件中定义。所以它显示 缺少依赖关系 你需要这样的参考:
useEffect(() => {
setDataState(dataState=> ({...dataState, filter: {
logic: 'and',
filters: [
{
field: 'location',
operator: 'contains',
value: selectedLocation,
},
],
},
}));
}, [selectedLocation]);
您也可以通过创建另一个状态来实现
const [newDataState,setNewDataState]=useState();
useEffect(() => {
const newState: State = {
...dataState,
filter: {
logic: 'and',
filters: [
{
field: 'location',
operator: 'contains',
value: selectedLocation,
},
],
},
};
setNewDataState(newState);
}, [selectedLocation,datastate]
);
现在在第二个 useEffect 中使用 newDataState 作为依赖项并设置原始状态的状态。
useEffect=()=>{
setDataState(newDataState);
},[newDataState]
我有两个相互通信的组件。在组件 A 中,我有一个位置列表,每当用户单击此组件中的一个位置时,都会根据单击的位置过滤组件 B 中的属性列表。这行得通,到目前为止一切顺利。但是在组件 B 中,我使用一个 useEffect 挂钩来检查通过组件 A 的 props 到达它的 selectedLocation 变量,这样我就可以更新状态。在这个 useEffect() 调用中,VS Code 抱怨说“React useEffect Hook 缺少依赖项”...dataState”。但是我当然不能将 dataState 放入依赖项数组中,因为它会导致无限循环。而且顺便说一下,dateState 是通过 useState Hook 管理的。这是我的 useEffect 钩子:
// If there is a new selected location from the treeview, update the grid state
useEffect(() => {
const newState: State = {
...dataState,
filter: {
logic: 'and',
filters: [
{
field: 'location',
operator: 'contains',
value: selectedLocation,
},
],
},
};
setDataState(newState);
}, [selectedLocation]);
如有任何帮助,我们将不胜感激。
尝试这样设置 dataState
:
useEffect(() => {
setDataState(oldDataState => ({
...oldDataState ,
filter: {
logic: 'and',
filters: [
{
field: 'location',
operator: 'contains',
value: selectedLocation,
},
],
},
}));
}, [selectedLocation]);
这样它将被视为 parameter
而不是依赖项。
实际上,"...dataState"
未在您的 B 组件中定义。所以它显示 缺少依赖关系 你需要这样的参考:
useEffect(() => {
setDataState(dataState=> ({...dataState, filter: {
logic: 'and',
filters: [
{
field: 'location',
operator: 'contains',
value: selectedLocation,
},
],
},
}));
}, [selectedLocation]);
您也可以通过创建另一个状态来实现
const [newDataState,setNewDataState]=useState();
useEffect(() => {
const newState: State = {
...dataState,
filter: {
logic: 'and',
filters: [
{
field: 'location',
operator: 'contains',
value: selectedLocation,
},
],
},
};
setNewDataState(newState);
}, [selectedLocation,datastate]
);
现在在第二个 useEffect 中使用 newDataState 作为依赖项并设置原始状态的状态。
useEffect=()=>{
setDataState(newDataState);
},[newDataState]