如何将没有值的道具传递给组件

cod*_*aff 27 javascript reactjs react-jsx

如何将没有价值的道具传递给反应组件?

<SomeComponent disableHeight> {/* here */}
    {({width}) => (
        <AnotherComponent
            autoHeight {/* and here */}
            width={width}
            height={300}
            {...otherProps}
        />
    )}
</SomeComponent>
Run Code Online (Sandbox Code Playgroud)

注意 - 没有为这些道具指定默认道具值.

我似乎无法找到任何引用,但通过观察true默认情况下分配给它们的属性的值.

Chr*_*ris 53

传递的内容被编译器解释为布尔属性.在编写纯HTML时也是如此; 没有值的属性被解释为布尔值true.由于JSX是用于编写HTML的语法糖,因此它具有相同的行为是有道理的.

官方的React文档包含以下内容:

布尔属性

这通常在使用HTML表单元素时出现,其中包含disabled,required,checked和readOnly等属性.省略属性的值会导致JSX将其视为true.要传递false,必须使用属性表达式.

// 这两个在JSX中是等效的,用于禁用按钮

<input type="button" disabled />;
<input type="button" disabled={true} />;
Run Code Online (Sandbox Code Playgroud)

// 这两个在JSX中是等效的,因为没有禁用按钮

<input type="button" />;
<input type="button" disabled={false} />;
Run Code Online (Sandbox Code Playgroud)

JSX:

<div>
  <Component autoHeight />
  <AnotherComponent autoHeight={null} />
</div>
Run Code Online (Sandbox Code Playgroud)

JS:

React.createElement(
  "div",
  null,
  React.createElement(Component, { autoHeight: true }),
  React.createElement(AnotherComponent, { autoHeight: null })
);
Run Code Online (Sandbox Code Playgroud)

这里查看这个babel demo .


正如ctrlplusb所说,如果你想传递一个"空道具",你可以简单地给它值null或甚至undefined.

所以你可以这样做:

<SomeComponent disableHeight={null}>
    {({width}) => (
        <AnotherComponent
            autoHeight={null}
            width={width}
            height={300}
            {...otherProps}
        />
    )}
</SomeComponent>
Run Code Online (Sandbox Code Playgroud)

虽然我会注意到,把它当作undefined是可能完全不必要的,因为阅读this.props.autoHeightAnotherComponent总会给你undefined,如果你不管通过明确其作为autoHeight={undefined}或不尽然.null在这种情况下,传递可能更好,因为您通过声明它具有......"无值"(即null)的值来明确传递道具.

  • 请注意不要混淆 HTML 属性和 DOM 的“HTMLElement”接口的属性。React DOM 直接使用元素_property_,它确实是一个布尔值,设置为“true”/“false”。但是所谓的 HTML“布尔属性”不能具有 true 值。可以缺少指示 _false_ 或指示 _true_,它可以没有值、空值或“与属性规范名称匹配的 ASCII 不区分大小写的值,没有前导或尾随空格” ”。JSX 有自己的第三套规则,这些规则已被正确引用。 (2认同)
  • JSX 在某些方面模仿 HTML 标记,在其他方面模仿 HTML DOM 接口。我不认为开发人员能够轻易地“读懂字里行间”这个主题。标记和 DOM API 之间的关系是一个常见的混淆来源。误解:“布尔值和其他类型在那里没有意义”。DOM API 使用强类型(在 JS 中体现),并且 HTML 规范本身定义了“布尔属性”以及它如何映射到(严格布尔)DOM 接口属性。HTML/DOM 数据的类型和流的细微差别对于许多人来说很重要,当然足以保证附录注释。 (2认同)

ctr*_*usb 9

是的,JSX看到的属性没有=因为布尔值为true.

一种选择是简单地设置空值:

<Foo name="Bob" surname={null} />
Run Code Online (Sandbox Code Playgroud)

您还可以通过对象动态构建属性包,并仅在需要时添加属性.例如:

render() {
  const propBag = {
    width: width,
    height: 300
  };
  if (someCondition) {
    propBag.something = 'bob';
  }

  return (
    <FooComponent {...propBag} {..otherProps} />
  );
}
Run Code Online (Sandbox Code Playgroud)