扩展Material-UI组件(React / Typescript)

时间:2019-11-10 18:11:07

标签: reactjs typescript material-ui

我正在尝试将material-ui组件扩展为具有自定义属性的我自己的组件。我正在使用带有打字稿的reactjs。

以下代码是我的试用版:

import React from 'react';
import clsx from 'clsx';
import { makeStyles } from '@material-ui/core';
import { Theme } from '@material-ui/core/styles/createMuiTheme';
import Tabs, { TabsProps } from '@material-ui/core/Tabs';

export interface Iprops extends TabsProps {
  /* how to add a variant ? */
}

const useStyles = makeStyles((theme: Theme) => ({
    root: {
       // styles
     }
}));

export const BasicTabs = (props: Iprops) => {
    const classes = useStyles(props);
    if (props.variant === 'test') {
        return (
            <Tabs
                {...props}
                className={clsx(classes.root, props.className)}
            />
        );
    }
    return (
        <Tabs {...props} />
    );
};

因此,我现在想做的是,当变体为“测试”时,返回一个自定义样式的按钮。

所以,我的第一个问题是
1。如何为按钮添加新的变体?

第二个问题是
2。我应该让像这样的孩子通过吗

<Tabs {...props}>{props.children}</Tabs>

每当我扩展材质用户界面组件时,总是如此吗?

1 个答案:

答案 0 :(得分:0)

import React from 'react'
import TextField, { StandardTextFieldProps } from '@material-ui/core/TextField'

/**
 * Extend properties
 */
export interface PasswordProps extends StandardTextFieldProps {
    custom: string
}

/**
 * Password input
 * @param props Properties
 */
export const PasswordField: React.FunctionComponent<PasswordProps> = (props) => {
    props = Object.assign({ type: 'password' }, props)
    return (
        <TextField {...props}>
            {props.children}
        </TextField>
    )
}

对于您的问题: A.扩展道具,将变体添加到所需的界面。 B.是的,总是像React官方的“组成模型” https://reactjs.org/docs/composition-vs-inheritance.html

所建议的那样