渲染React组件的通用方法取决于两个道具

时间:2018-01-22 15:00:52

标签: javascript arrays reactjs ecmascript-6

我有一个组件可以获得两个道具,函数和节点(或带有标签文本的字符串),依赖于这些道具我用一些标签渲染图标。将来,我将添加更多按钮,并希望创建使该图标更灵活的通用方法。那么如何为此创建这样的通用方法呢?

const Wrapper = ({onRefresh, onExportToExcel, actionsLabel}) => {
   return 
    {onRefresh && !!actionsLabel.refresh &&
                    <InlineIconButton name='refresh'  label={actionsLabel.refresh} onClick={onRefresh} icon={<Autorenew/>} aria-label="Refresh"/>}
    {onExportToExcel && !!actionsLabel.exportToExcel &&
                    <InlineIconButton name='exportToExcel' label={actionsLabel.exportToExcel} onClick={onExportToExcel} icon={<FileDownload/>} aria-label="ExportToExcel"/>}
}

<Wrapper onRefresh={()=> {}} onExportToExcel ={()=> {}} actionLabel={refresh: 'refresh', exportToExcel: 'export'}>

2 个答案:

答案 0 :(得分:2)

也许可以这样做:

const EXPORT_EXCEL = { 
  key: "EXPORT_EXCEL", 
  label: "export",
  ariaLabel: "Export Excel",
  icon: <Autorenew/>,
  handler: params => { /* your function */ }
};
const REFRESH = { 
  key: "REFRESH", 
  label: "refresh",
  ariaLabel: "Refresh",
  icon: <FileDownload/>,
  handler: params => { /* your function */ } 
};

<Wrapper type={EXPORT_EXCEL} />;

const Wrapper = ({ type }) => {
      return <InlineIconButton name={type.key} label={type.label} onClick={type.handler} icon={type.icon} aria-label={type.ariaLabel ? type.ariaLabel : type.label} />;
  }
}

您甚至可以将EXPORT_EXCEL和REFRESH抛出到数组中。而不是让它们松散,把它们放在一个像这样的数组中:

const BUTTONS = [
  { 
    key: "EXPORT_EXCEL", 
    label: "export",
    ariaLabel: "Export Excel",
    icon: <Autorenew/>,
    handler: params => { /* your function */ }
  },
  { 
    key: "REFRESH", 
    label: "refresh",
    ariaLabel: "Refresh",
    icon: <FileDownload/>,
    handler: params => { /* your function */ } 
  },
];

然后循环创建Wrapper。

但是,这完全取决于您和您的偏好和应用程序的要求

答案 1 :(得分:0)

React背后的整个想法是能够为各种用途创建一个独特的组件。这就是React可组合性背后的整个哲学。不明白你为什么要包装它。