在this.props.children上设置React Set Default Props

时间:2018-04-26 14:52:35

标签: javascript reactjs react-props

我正在使用反应故事书,并想知道如何为组件设置默认道具?

我的应用程序中的我的组件是一个轨道并获取数据 - 一个图像。这是使用{this.props.children}设置的。

在我的rails组件中,我想设置默认道具,以便在数据提取失败时仍然呈现项目。

这是我的组件 - 向下滚动底部以设置defaultProps:

import React, { Component } from 'react';
import './index.css'; // styles from

// import Slider from 'react-slick';
import classNames from 'classnames';

import PrimaryButton from '../PrimaryButton';

export default class HeroRail extends Component{
  render() {
    const {title, icon, opacity, railActive} = this.props;
    const railStyle = {
      opacity:opacity
    };
    const iconStyle = {
      background: `center / contain url(${icon}) no-repeat`
    };
    const cName = classNames('HeroRail', {
      railActive:railActive
    });   

    console.log("props", this.props);

    return (
      <div className={cName} style={railStyle}>
        <div className={'rail-details'}>
          <div className={'top-details'}>
            <div className={'title-lockup'}>
              <div className={'icon'} style={iconStyle}></div>
              <h3 className={'rail-title'}>{title}</h3>
            </div>
            <PrimaryButton label={'View All'} light={true}/>
          </div>

          <div className={'rail-navigation'}>
            <PrimaryButton icon='' light={true} />
            <PrimaryButton icon='' light={true} />
          </div>
        </div>

        <div className={'rail-items'}>
          {this.props.children}
        </div>
      </div>
    );
  }
};

HeroRail.defaultProps = {

};

这是获取成功时儿童道具的样子。

enter image description here

3 个答案:

答案 0 :(得分:1)

您可以使用类名设置默认道具,如下所示。

class Greeting extends React.Component {
  render() {
    return (
      <h1>Hello, {this.props.name}</h1>
    );
  }
}

// Specifies the default values for props:
Greeting.defaultProps = {
  name: 'Stranger'
};

您可以参考此link from react's documentation了解详情。

答案 1 :(得分:0)

解决问题的一种方法是使用static propTypes

static propTypes = {
    children: PropTypes.node.isRequired,
}
希望我推荐的解决问题的另一种方法是,除非你已经获取了值,否则不会渲染组件

if(!this.props.children){
    return(<div>Loading ....... </div>
}
 return (
      <div className={cName} style={railStyle}>
        <div className={'rail-details'}>
          <div className={'top-details'}>
            <div className={'title-lockup'}>
              <div className={'icon'} style={iconStyle}></div>
              <h3 className={'rail-title'}>{title}</h3>
            </div>
            <PrimaryButton label={'View All'} light={true}/>
          </div>

          <div className={'rail-navigation'}>
            <PrimaryButton icon='' light={true} />
            <PrimaryButton icon='' light={true} />
          </div>
        </div>

        <div className={'rail-items'}>
          {this.props.children}
        </div>
      </div>
    );

答案 2 :(得分:0)

一种解决方法是导入“ prop-types”组件,请参见以下示例:-

import PropTypes from 'prop-types';

const propertyType = ({[name_of_property]}) => {
  <div><h1>{name_of_property}</h1></div>
};

propertyType.propTypes = {
  [name_of_property]: PropTypes.string,
};
propertyType.defaultProps ={
  [name_of_property]: [default_value],
};

请在可能的情况下阅读此内容:https://www.npmjs.com/package/prop-types