Javascript 传播样式道具以反应子对象并将其应用于CSS文件

Javascript 传播样式道具以反应子对象并将其应用于CSS文件,javascript,html,css,reactjs,Javascript,Html,Css,Reactjs,我正在呈现组件下拉列表,它的行为类似于html下拉列表组件,但它是一个div有序和无序列表的集合。我正在尝试将样式传递给className元素,这些元素有dropdown.css文件来呈现样式,但我不确定如何从父组件一直以这些特定元素为目标。 如何瞄准 div className=“选择当前框” 使用style={{border:“1px solid#d4”}} 及 div className=“选择框列表” 与 代码Sandblox在这里->因此,如果您传递的道具名称相同,则使用React,它

我正在呈现组件下拉列表,它的行为类似于html下拉列表组件,但它是一个div有序和无序列表的集合。我正在尝试将样式传递给className元素,这些元素有dropdown.css文件来呈现样式,但我不确定如何从父组件一直以这些特定元素为目标。 如何瞄准

div className=“选择当前框”

使用
style={{border:“1px solid#d4”}}

div className=“选择框列表”


代码Sandblox在这里->

因此,如果您传递的道具名称相同,则使用React,它只选择最后传递的道具。所以用你的两个风格道具,它只会通过最后一个。但是,无论如何,使用名称样式可能不是最好的主意,因为它不是描述性的,并且也反映了实际的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>
复制道具是没有必要的,而且复制道具的方式实际上是有害的。如果您想在传入的道具中专门针对某个值,可以直接访问它(例如
props.myProp
,或者在本例中是
other.style
)或

因为您只想传递样式(现在是listStyles和currentStyles)和类名,所以我选择使用解构赋值将它们赋值给变量

export const Dropdown = ({
  list,
  currentStyles,
  listStyles,
  className,
  ...others
}) => { ... }
现在我们有了这些道具,我们希望将其传递到您的
下拉视图中,其中包含您想要针对的实际元素

<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}
/>
{
setActiveItem(activeItem);
}}
onMouseOver={(悬停)=>onMouseOver(悬停)}
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>
toggleList()}
style={currentStyles}
>...
我将沙箱分叉以包含一个工作示例。但是我没有在
DropdowView
中设置使用className属性的节点,因为不清楚哪个元素会有这个属性


因此,如果使用React传递同名道具,它将只选择最后传递的道具。所以用你的两个风格道具,它只会通过最后一个。但是,无论如何,使用名称样式可能不是最好的主意,因为它不是描述性的,并且也反映了实际的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>
复制道具是没有必要的,而且复制道具的方式实际上是有害的。如果您想在传入的道具中专门针对某个值,可以直接访问它(例如
props.myProp
,或者在本例中是
other.style
)或

因为您只想传递样式(现在是listStyles和currentStyles)和类名,所以我选择使用解构赋值将它们赋值给变量

export const Dropdown = ({
  list,
  currentStyles,
  listStyles,
  className,
  ...others
}) => { ... }
现在我们有了这些道具,我们希望将其传递到您的
下拉视图中,其中包含您想要针对的实际元素

<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}
/>
{
setActiveItem(activeItem);
}}
onMouseOver={(悬停)=>onMouseOver(悬停)}
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>
toggleList()}
style={currentStyles}
>...
我将沙箱分叉以包含一个工作示例。但是我没有在
DropdowView
中设置使用className属性的节点,因为不清楚哪个元素会有这个属性


我认为不必从父div中使用它们,您可以直接将这些样式用于这些元素,如下所示

但是如果您想使用来自父级的样式。然后可以使用特定的名称传递它们。像这样

<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"
    selectBoxCurrentStyle={{ border: "1px solid #D4D4D4" }}
    // this style is for className="select-box-list"
    selectBoxListStyle={{
        opacity: 1,
        display: "inherit",
        animationName: "none",
        cursor: "pointer"
    }}
/>


这里是链接

我认为,您可以直接将这些样式用于这些元素,而不是从父div使用它们

但是如果您想使用来自父级的样式。然后可以使用特定的名称传递它们。像这样

<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"
    selectBoxCurrentStyle={{ border: "1px solid #D4D4D4" }}
    // this style is for className="select-box-list"
    selectBoxListStyle={{
        opacity: 1,
        display: "inherit",
        animationName: "none",
        cursor: "pointer"
    }}
/>

这里是链接