【发布时间】:2020-07-04 02:28:56
【问题描述】:
我试图澄清我对 React 中的布尔道具的一些困惑。
假设有 MyComponent 和几个布尔属性 prop1、prop2...
首先:布尔属性似乎和其他属性一样:您可以在defaultProps or in destructuring params 中定义默认值:
const MyComponent = ({ prop1, prop2 }) => (
...
);
MyComponent.defaultProps = {
prop1: false,
prop2: true,
}
或者(相当于……我认为)
const MyComponent = ({ prop1 = false, prop2 = true }) => (
...
)
不清楚的是如何传递值。再一次,自然的“React 风格”似乎是
<MyComponent prop1={ BOOLEAN_EXPRESION1 } prop2={ BOOLEAN_EXPRESION2 } />
...包括static literals (false/true)。
但是,it's also stated 认为传递布尔属性的正确(推荐?)方法是属性的存在/不存在,如 in HTML5。
因此,应该写<MyComponent prop1 />,而不是<MyComponent prop1={true} prop2={false} />。
我的问题是:
-
传递布尔道具的正确方法是什么?都可以接受吗?
-
如果 HTML5 样式是推荐(或正确)的方式,如何处理动态值?
-
如果 HTML5 样式可以接受,那么默认值呢? 在上面的例子中(
prop2默认为true),如果我写<MyComponent />,prop2会得到什么值?
已编辑:对于已接受的答案,我想添加我自己的提示:要与 HTML5 风格完美搭配,请设计您的布尔道具,以便它们 默认为 @ 987654340@。换句话说:默认为 true 的布尔属性应该被视为反模式。
【问题讨论】:
-
查看 React 文档如何处理 boolean props 的复选框。我不会推荐 html5 样式,因为您的默认值仅在默认值为 false 时才有效。 JSX 不是 html5
-
@HMR 这是我的印象,但在任何文档和 eslinter 中似乎都没有气馁,并且链接的答案有 42 个赞成...
-
这里要记住一点,OP:JSX不是html5
-
@leonbloy,好吧,让我们换个角度思考,忽略 HTML5 建立的规则,只关注 JSX。 JSX 有正好有两种传递 true 的方式,
<MyComponent prop />和<MyComponent prop={true} />和 正好有一种传递 false 的方式<MyComponent prop={false} />。我同意这是区分 HTML5 和 JSX 的奇怪之处,但是 JSX 是 JavaScript 的语法扩展,而不是 HTML,因此它不需要符合 HTML 的所有规则。 -
仅供参考,JSX 的所有规则和行为都列在 React 文档中,其中包括默认为 true 的工作方式 (reactjs.org/docs/jsx-in-depth.html#props-default-to-true)。这些文档没有从 HTML 继承任何东西,也不应该与 HTML 规范进行比较。
标签: reactjs boolean jsx react-props