Javascript 传播样式道具以反应子对象并将其应用于CSS文件
我正在呈现组件下拉列表,它的行为类似于html下拉列表组件,但它是一个div有序和无序列表的集合。我正在尝试将样式传递给className元素,这些元素有dropdown.css文件来呈现样式,但我不确定如何从父组件一直以这些特定元素为目标。 如何瞄准 div className=“选择当前框” 使用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,它
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"
}}
/>
这里是链接