Redux,MapStateToProps/useSelector:改变这些值是否安全

Redux, MapStateToProps/useSelector: Is it safe to mutate those values

MapStateToProps 和 useSelector 都使用类似的回调 store => store.group 例如在 MapStateToProps 中像这样改变这些值是否安全:

const mapStateToProps = store => {
  const { group, level } = store;
  let { group } = store;
  if (level > 50) {
    group = `${group}-admin`;
  }
  return { group };
};

或正在使用选择器:

const group = useSelector(store => {
  const { group, level } = store;
  let { group } = store;
  if (level > 50) {
    group = `${group}-admin`;
  }
  return { group };
});

使用 useSelector 实际上也可以像这样在组件内部完成:

let [group, level] = useSelector(store => [store.group, store.level);
if (level > 50) {
  group = `${group}-admin`;
}
...

我的同事做了类似的事情,我不确定你是否应该在其中使用 let。我只是想知道这是可以接受的处理方式还是会导致问题?我不需要其他解决方案。我知道如何使用 const 代替。

redux 的作用之一是集中您的 state 逻辑:

发件人:https://redux.js.org/introduction/getting-started

The whole state of your app is stored in an object tree inside a single store. The only way to change the state tree is to emit an action, an object describing what happened. To specify how the actions transform the state tree, you write pure reducers.

所以当你做这样的事情时:

const group = useSelector(store => {
  const { group, level } = store;
  let { group } = store;
  if (level > 50) {
    group = `${group}-admin`;
  }
  return { group };
});

这应该被认为是不好的做法。 useSelector 钩子应该 return 你的状态的一部分而不改变它。你在 useSelector 调用中改变它,所以你 returning 了一些可能不在 state 对象中的东西。

来自 node_modules/react-redux/src/hooks/useSelector.js:

看到他们甚至将 selectedState = selector(storeState) 的结果命名为 selectedState。而且您没有在通话中选择 state。你正在改变结果。

虽然在您的示例中您只是改变了从 state 中读取的字符串,但这是一种不好的做法,因为有一天您可能会改变 state 对象而不通过 action/reducer派遣。这肯定会在某些时候破坏您的代码。

例如:

const group = useSelector((state) => {
  let { someObject } = state;
  if (someCondition) {
    someObject.someProperty = someValue  // YOU ARE MUTATING STATE OUTSIDE A REDUX REDUCER
  }
  return someObject;
});

我认为你应该做的:

SomeComponent.js

const { group, level } = useSelector((state) => state);
const newGroup = level > 50 ? `${group}-admin` : group;

如果您想要的是在 Redux 上更新 group 状态 属性,您应该改为分派一个由 reducer 处理的操作。