在我看来,管理多个条件 props 的最佳方法是 @brigand 的 props object 方法。但可以对其进行改进以避免为每个条件属性添加一个if 块。
ifVal 助手
随意重命名 (iv, condVal, cv, _, ...)
如果满足条件,您可以定义一个辅助函数来返回一个值或另一个值:
// components-helpers.js
export const ifVal = (cond, trueValue=true, falseValue=null) => {
return cond ? trueValue : falseValue
}
如果cond 是true(或truthy),则返回trueValue - 或true。
如果cond 是false(或falsy),则返回falseValue - 或null。
这些默认值(true 和 null)通常是允许将 prop 传递或不传递给 React 组件的正确值。您可以将此函数视为“改进的 React 三元运算符”。如果您需要对返回值进行更多控制,请对其进行改进。
让我们将它与许多道具一起使用。
构建(复杂的)道具对象
// your-code.js
import { ifVal } from './components-helpers.js'
// BE SURE to replace all true/false with a real condition in you code
// this is just an example
const inputProps = {
value: 'foo',
enabled: ifVal(true), // true
noProp: ifVal(false), // null - ignored by React
aProp: ifVal(true, 'my value'), // 'my value'
bProp: ifVal(false, 'the true text', 'the false text') // 'my false value',
onAction: ifVal(isGuest, handleGuest, handleUser) // it depends on isGuest value
};
<MyComponent {...inputProps} />
这种方法类似于使用classnames utility 有条件地管理类的流行方法,但适用于道具。
为什么要使用这种方法
即使有许多条件 props,您也将拥有清晰易读的语法:每个新 prop 只需在对象声明中添加一行代码。
通过这种方式,您可以替换重复运算符(...,&&,? :,...)的语法噪音,当您有很多道具时,这可能会非常烦人,使用简单的函数调用。
作为开发人员,我们的首要任务是编写最显而易见的代码来解决问题。
太多次我们为我们的自我解决问题,在不需要的地方增加了复杂性。
我们的代码应该简单明了,对我们今天、明天对我们和我们的伙伴来说都是如此。
仅仅因为我们可以做某事并不意味着我们应该做某事
我希望这个迟到的回复会有所帮助。