如何将没有值的道具传递给反应组件?
<SomeComponent disableHeight> {/* here */}
{({width}) => (
<AnotherComponent
autoHeight {/* and here */}
width={width}
height={300}
{...otherProps}
/>
)}
</SomeComponent>
注意 - 没有为这些道具指定默认道具值。
我似乎无法找到任何关于此的参考,但通过观察这些属性的值,默认情况下它们会被分配到true
。
答案 0 :(得分:44)
您传递的内容被编译器解释为布尔属性。在编写纯HTML时也是如此;没有值的属性被解释为布尔值true
。由于JSX是用于编写HTML的语法糖,因此它具有相同的行为。
官方React documentation有以下内容:
布尔属性
使用带有属性的HTML表单元素时,通常会出现这种情况 像禁用,必需,检查和阅读。 省略属性的值会导致JSX将其视为true。至 传递false必须使用属性表达式。
// 这两个在JSX中等效用于禁用按钮
<input type="button" disabled />; <input type="button" disabled={true} />;
// 这两个在JSX中等效,因为没有禁用按钮
<input type="button" />; <input type="button" disabled={false} />;
<强> JSX:强>
<div>
<Component autoHeight />
<AnotherComponent autoHeight={null} />
</div>
<强> JS:强>
React.createElement(
"div",
null,
React.createElement(Component, { autoHeight: true }),
React.createElement(AnotherComponent, { autoHeight: null })
);
检查这个的babel演示,here。
正如ctrlplusb所述,如果你想传递一个&#34;空道具&#34;您可以简单地将其赋予null
甚至undefined
的价值。
所以你可以这样做:
<SomeComponent disableHeight={null}>
{({width}) => (
<AnotherComponent
autoHeight={null}
width={width}
height={300}
{...otherProps}
/>
)}
</SomeComponent>
虽然我会注意到将其作为undefined
传递可能完全没有必要,因为从this.props.autoHeight
阅读AnotherComponent
将始终为您提供undefined
,无论您是否明确将其传递为autoHeight={undefined}
或根本没有。在这种情况下传递null
可能更好,因为你明确地传递了道具,声明它的值为......&#34;没有值&#34; (即null
)。
答案 1 :(得分:8)
是的JSX认为没有=
的属性是布尔值true。
一个选项是简单地设置空值:
<Foo name="Bob" surname={null} />
您还可以通过对象动态构建属性包,并仅在需要时添加属性。例如:
render() {
const propBag = {
width: width,
height: 300
};
if (someCondition) {
propBag.something = 'bob';
}
return (
<FooComponent {...propBag} {..otherProps} />
);
}
答案 2 :(得分:1)
<Amp.AmpAccordion animate="">
复制并粘贴上面的链接:
任何带有空字符串的属性都将呈现到DOM中而没有值。
W3C相关文档:https://www.w3.org/TR/html5/syntax.html#elements-attributes
空属性语法
只是属性名称。该值隐式为空字符串。在下面的示例中,禁用属性使用空属性语法给出:
<input disabled>如果使用空属性语法的一个属性后面是另一个属性,则必须有一个空格字符将两者分开。