Reactjs 从useSelector()编辑局部变量时,Redux状态正在发生变化
我使用useSelector()获取状态,当我对局部状态变量应用一些过滤器时,我的全局状态正在发生变化。不知道为什么。下面是代码Reactjs 从useSelector()编辑局部变量时,Redux状态正在发生变化,reactjs,redux,react-redux,redux-store,Reactjs,Redux,React Redux,Redux Store,我使用useSelector()获取状态,当我对局部状态变量应用一些过滤器时,我的全局状态正在发生变化。不知道为什么。下面是代码 const filterVacations = (employees, status) => { if(status === 'Approved') { employees.forEach(item => { item.vacations = item.vacations.filter(vac => v
const filterVacations = (employees, status) => {
if(status === 'Approved') {
employees.forEach(item => {
item.vacations = item.vacations.filter(vac => vac.approved === true);
});
}
else if(status === 'Unapproved') {
employees.forEach(item => {
item.vacations = item.vacations.filter(vac => vac.approved === false);
});
}
return employees.filter(item => item.vacations.length > 0);
}
并按如下方式调用此函数:
const Vacations = () => {
const state = useSelector((state:State) => state);
const view = state.view;
const filter = state.filter;
const employees = state.employees;
employees = filterVacations(employees, filter);
return (
<>
//some component...
</>);
}
const Vacations=()=>{
const state=useSelector((state:state)=>state);
const view=state.view;
常量过滤器=state.filter;
const employees=state.employees;
employees=filterVacations(员工,过滤器);
返回(
//某些组件。。。
);
}
为什么国家在这里变异 这是因为您在说
const filter=state.filter时没有传递值代码>但是它的传递引用
例如,考虑一个书架,上面有JS书在图书馆里。当你访问图书馆时,图书馆不会给你书的副本,而是给你书的位置。所以,若你们撕开书页,把它放在原来的地方。图书管理员也能看到撕破的一页。但是如果你不想发生这种事。你需要拿到这本书的复印件,撕下书页,而书架上的书将保持原样
因此,当您想要复制数据并将其存储在变量中时,ES6引入了比以前笨拙的方法更简单的方法。所以这个const filter=state.filter代码>
将成为此const filter=[…state.filter];//这使数组的副本
我发现了问题。useSelector将返回嵌套对象的浅拷贝,因此会发生变异。解决方案是手动深度复制 过滤器只是一个布尔值。没有问题。问题在于雇员数组。spread操作符不会解决这个问题,因为它只是对嵌套数组进行浅层复制。问题是为什么它不断变化的全局redux状态??所有const view=state.view的逻辑相同;常量过滤器=state.filter;const employees=state.employees;我只是举了一个关于过滤器的例子。