Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Reactjs 从useSelector()编辑局部变量时,Redux状态正在发生变化_Reactjs_Redux_React Redux_Redux Store - Fatal编程技术网

Reactjs 从useSelector()编辑局部变量时,Redux状态正在发生变化

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

我使用useSelector()获取状态,当我对局部状态变量应用一些过滤器时,我的全局状态正在发生变化。不知道为什么。下面是代码

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;我只是举了一个关于过滤器的例子。