【问题标题】:Open/Closed Principle in ReactJSReactJS 中的开闭原则
【发布时间】:2021-06-13 21:00:51
【问题描述】:

假设我有两个与同一域相关的不同列表,例如:

const [peopleList, setPeopleList] = useState([])
const [equipmentList, setEquipmentList] = useState([])

我只定义了一个处理程序来处理这些列表上的更改:

const handleListChange = (e, type) => {
  type === 'people' 
    ? setPeopleList(e.target.value)
    : setEquipmentList(e.target.value)
}

并将其传递给不同的组件:

<Component onChange={e => handleListChange(e, type)} />

我不遵守开放/封闭原则,因此如果我有第三个选项,我将不得不更改我的处理程序以处理新选项。

我的问题是:对于这些类型的情况是否有更好的构造/最佳实践?

提前致谢。

【问题讨论】:

  • 有效吗?如果是这样 - 当您需要添加第三个选项时,请稍后再考虑。一个问题 - 你总是显示两个列表还是只显示一个列表?
  • 它确实有效,我只是想改进我的结构。两个列表同时显示。

标签: javascript reactjs solid-principles


【解决方案1】:

你可以定义一个状态:

const [state, setState] = useState({
  people: [],
  equipment: [],
  // ... etc
});

并在处理程序中使用type 作为动态键:

const handleListChange = (e, type) => {
  setState(prevState => ({
    ...prevState,
    [type]: e.target.value;
  }));
};

这将使处理程序更加通用/通用。

我会 curry type 参数,这样您就不需要在匿名回调中代理事件对象。

const handleListChange = type => e => {
  setState(prevState => ({
    ...prevState,
    [type]: e.target.value;
  }));
};

...

<Component onChange={handleListChange(type)} />

【讨论】:

  • 感谢您的回答,这肯定是一个改进。
  • @WilliamGuimarães 太棒了!如果您发现它有帮助和/或有用,请不要忘记投票。如果它充分解决了您的问题,那么我邀请您接受它。让我知道是否有任何其他问题。干杯。
猜你喜欢
  • 2017-12-01
  • 2018-06-18
  • 1970-01-01
  • 1970-01-01
  • 2021-11-06
  • 2016-09-12
  • 2010-12-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多