临摹微笑
因此,在 React 中,如果你传递同名的 props,它只会选择最后传递的那个。因此,使用您的两个样式道具,它只会通过最后一个。然而,无论如何使用名称样式可能都不是最好的主意,因为它不是描述性的,而且还反映了实际的 HTML 样式属性。在 App.js 文件中为两种不同的样式指定唯一的名称:<div className="App"> <Dropdown inputName="viola" list={[ { yard_id: "1", yard_name: "Yard 1" }, { yard_id: "2", yard_name: "Yard 2" } ]} // this style is for className="select-box-current" currentStyles={{ border: "1px solid #D4D4D4" }} // this style is for className="select-box-list" listStyles={{ opacity: 1, display: "inherit", animationName: "none", cursor: "pointer" }} /></div>现在我们需要通过组件树传递这两个属性,下一个文件是 Dropdown.js 文件。在我开始传递道具之前,我想对一些错误的、不完全相关的事情发表评论。export const Dropdown = ({ list, ...others }) => { const copiedProps = {}; Object.keys(others).forEach((key) => { // these are the props that need to get thru: if ("style" === key || "className" === key) { copiedProps[key] = others[key]; } }); ...复制道具是没有必要的,而且复制的方式实际上是有害的。如果您想专门针对传入 props 中的某个值,您可以直接访问它(例如props.myProp或在本例中other.style)或解构赋值。由于您只想传递样式(现在为 listStyles 和 currentStyles)和 className,因此我选择使用解构赋值将它们分配给变量。export const Dropdown = ({ list, currentStyles, listStyles, className, ...others}) => { ... }现在我们有了这些道具,我们希望将其传递到包含DropdownView您想要定位的实际元素的您的道具中。<DropdownView dropdownItems={dropdownItems} activeItem={activeItem} hover={hover} setActiveItem={(activeItem) => { setActiveItem(activeItem); }} onMouseOver={(hover) => onMouseOver(hover)} toggleList={() => toggleList(!hideList)} hideList={hideList} className={className} currentStyles={currentStyles} listStyles={listStyles}/>好的,现在我们有了我们想要的样式和类名。您所要做的就是像上面那样获取道具,然后将它们设置在元素上。<div className="select-box-current" tabIndex="0" autoFocus={true} onClick={() => toggleList()} style={currentStyles}>...</div>我分叉了沙箱以包含一个工作示例。但是我没有在 中设置使用 className 属性的节点,DropdowView因为不清楚哪个元素将具有该属性。https://codesandbox.io/s/hardcore-sun-yyx0g?file=/src/DropdownView.jsx