如何将其他道具添加到作为道具传入的React元素?

sme*_*sme 8 javascript jsx reactjs

我将一个反应元素作为道具传递给另一个元素.在接收prop的子元素中,我需要为该元素设置其他道具.

例如:

家长班

class Menu Extends React.Component {
    render() {
        return(
            <div className="Menu">
                <MenuItem icon={<MdInbox />} />
                <MenuItem icon={<MdDrafts />} />
                <MenuItem icon={<MdTrash />} />
            </div>
        );
    }
}
Run Code Online (Sandbox Code Playgroud)

儿童班

class MenuItem Extends React.Component {
    render() {
        return(
            <div className="MenuItem">
                {this.props.icon} // I want to set the icon's size prop here
            </div>
        );
    }
}
Run Code Online (Sandbox Code Playgroud)

this.props.icon是一个React元素(<MdInbox />,<MdTrash />等),它允许一个属性size.我想sizeMenuItem类中设置属性,而不是像这样在父类中传递prop : <MenuItem icon={<MdInbox size={24} />}. 我更喜欢在MenuItem课堂上只在一个地方设置大小.

Den*_*nis 18

传入组件构造函数而不是实例:

class Menu extends React.Component {
    render() {
        return(
            <div className="Menu">
                <MenuItem icon={MdInbox} />
                <MenuItem icon={MdDrafts} />
                <MenuItem icon={MdTrash} />
            </div>
        );
    }
}
Run Code Online (Sandbox Code Playgroud)

儿童班:

class MenuItem extends React.Component {
    render() {
        // This constant must begin with a capital,
        // it’s how React distinguishes HTML elements from components.
        const Icon = this.props.icon;
        return(
            <div className="MenuItem">
                <Icon size={24} />
            </div>
        );
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 谢谢!至于添加其他道具,可以使用**React.cloneElement**,即:`React.cloneElement(Icon, { onClick: this.open, size: 24 })`。 (2认同)

Vad*_*sov 12

您可以使用React.cloneElementAPI设置图标大小

class MenuItem Extends React.Component {
    render() {
        return(
            <div className="MenuItem">
                {React.cloneElement(this.props.icon, { size: 24 })}
            </div>
        );
    }
}
Run Code Online (Sandbox Code Playgroud)