React js中的条件属性

时间:2019-07-18 08:16:12

标签: javascript reactjs jsx react-props

我如何在react.js中接受条件属性

下面是我的搜索组件,如果要传递onSubmit函数,我希望InputGroup具有 onSubmit 属性,如果要传递onChange函数,我希望具有 onChange 属性

class QueryBar extends PureComponent {
  render() {
    const { placeholder, leftIcon, onSubmit, onChange, width } = this.props;
    return (
      <form
        style={{ width }}
        onSubmit={e => {
          e.preventDefault();
          onSubmit(e.target[0].value);
        }}
      >
        <InputGroup
          placeholder={placeholder}
          width={width}
          leftIcon="search"
          rightElement={
            <Button
              type="submit"
              icon={leftIcon}
              minimal={true}
              intent={Intent.PRIMARY}
            />
          }
        />
      </form>
    );
  }
}

QueryBar.propTypes = {
  width: PropTypes.number,
  placeholder: PropTypes.string,
  leftIcon: PropTypes.oneOfType(['string', 'element']),
  onSubmit: PropTypes.func
};

QueryBar.defaultProps = {
  placeholder: 'Search...',
  leftIcon: 'arrow-right',
  width: 360
};
export default QueryBar;

3 个答案:

答案 0 :(得分:1)

jsx元素也可以接受对象。初始化一个包含这两种情况的信息的对象,然后添加一个条件以添加一个函数(如果传入的道具中存在该函数)。

render() {
    const { placeholder, leftIcon, onSubmit, onChange, width } = this.props;
    const inputGroupProps = {
    placeholder,
    width,
    leftIcon: 'search',
    rightElement: (
        <Button
        type="submit"
        icon={leftIcon}
        minimal={true}
        intent={Intent.PRIMARY}
        />
      )
    }
    if (onChange) {
    inputGroupProps.onChange = onChange
    }
    if (onSubmit) {
        inputGroupProps.onSubmit = onSubmit
    }
    return (
    <form
        style={{ width }}
        onSubmit={e => {
        e.preventDefault();
        onSubmit(e.target[0].value);
        }}
    >
        <InputGroup {...inputGroupProps} />
    </form>
    );
}

虽然我不建议这样做,但从技术上来说,两者都可以,因为不会从父级传入但已变形的道具将是undefined。我不建议这样做,因为它不具有表达力,将来可能会使您感到困惑

<InputGroup
placeholder={placeholder}
width={width}
leftIcon="search"
rightElement={
    <Button
    type="submit"
    icon={leftIcon}
    minimal={true}
    intent={Intent.PRIMARY}
    />
}
onChange={onChange} // will be undefined and have no behavior if parent does not pass an onChange prop
onSubmit={onSubmit} // same for this one
/>

答案 1 :(得分:0)

如果null不存在,则可以传递null,即

<InputGroup
          placeholder={placeholder}
          width={width}
          leftIcon="search"
          onChange={onChangeFn?onChangeFn:null} 
          onSubmit={onSubmitFn ? onSubmitFn : null}
          rightElement={
            <Button
              type="submit"
              icon={leftIcon}
              minimal={true}
              intent={Intent.PRIMARY}
            />
          }
        />

将确保函数是否存在,然后调用函数,否则将没有任何作用。

答案 2 :(得分:0)

我会这样做:

想法是有一个对象optionalProps,这是一个空对象,其中包含任何可能的条件属性,当存在属性时,我们将其添加到该对象中,然后在InputGroup组件中应用它为{...optionalProps}的形式,它将提取所有添加到对象的属性,如果为null,则不返回任何内容。

我们可以采用另一种方法:onChange={onChange && onChange}

但是,请注意,对于不存在false的情况,这将返回onChange作为值。

  render() {
    const { placeholder, leftIcon, onSubmit, onChange, width } = this.props;
    let optionalProps = {};
    if(onChange){
      optionalProps['onChange'] = onChange;
    }
    if(onSubmit){
      optionalProps['onSubmit'] = onSubmit;
    }

    return (
      <form
        style={{ width }}
        onSubmit={e => {
          e.preventDefault();
          onSubmit(e.target[0].value);
        }}
      >
        <InputGroup
          placeholder={placeholder}
          width={width}
          leftIcon="search"
          {...optionalProps}
          rightElement={
            <Button
              type="submit"
              icon={leftIcon}
              minimal={true}
              intent={Intent.PRIMARY}
            />
          }
        />
      </form>
    );
  }