Material-UI :使用 Array.map() 时将道具传递给 useStyles
Material-UI : Pass props to useStyles when using Array.map()
我在 Material-UI 中对将道具传递给 makeStyles 做了一些研究,并且 有将道具作为变量传递的解决方案。但如果我也可以将数组值传递给样式,那就太好了。例如,无法使用 makeStyles 设置背景图像的 url。
const useStyles = makeStyles((theme) => ({
root: {
borderRadius: props => props.raidus
backgroundImage: props => `url(${props.urls[0]})` // failure -- This will set every url to first image
}
}));
export default App = () = {
const urls = [
'path/image-1.jpg',
'path/image-2.jpg',
'path/image-3.jpg',
];
const props = {
radius: 10,
urls: urls
};
const classes = useStyles(props);
return (
<div>
{urls.map((url, index) => {
<div
key={index}
className={classes.root} // <--- I want it handled here
// styles={{ background: `url(${url})` }} // <--- alternative way
/>
)}
</div>
);
};
或者,背景图像的 url 可以使用 内联样式 设置(如注释掉的行所示),但我希望它们在 Material-UI 中的样式中进行处理。这可以在 class root
内完成吗?任何帮助将不胜感激。
使用 $ 进行设置:
backgroundImage: (props) => `url(${props.url[0]})`
样本:HERE
您需要另一个组件来检索 url
并将其传递给 useStyles()
const urls = ["path/image-1.jpg", "path/image-2.jpg", "path/image-3.jpg"];
const useStyles = makeStyles(theme => ({
root: {
borderRadius: props => props.radius,
backgroundImage: props => `url(${props.url})`
}
}));
function MyComponent(props) {
const { url } = props;
const styleProps = {
radius: 10,
url
};
const classes = useStyles(styleProps);
return (
<div
className={classes.root}
>
{url}
</div>
);
}
export default function App() {
return (
<div>
{urls.map((url, index) => (
<MyComponent key={index} url={url} />
))}
</div>
);
}
工作示例(检查来自开发工具的 background-image 属性)
非常感谢 Babak Yaghoobi !!我一直在尝试所有可能的方法,而你的方法是唯一有效的:)
import { mobile, mobileM } from "../responsive";
//
//data.js
export const sliderItems = [
{id: 0,
img: "../img-store/oladimeji-odunsi-2.jpg",
title: "AUTUMN COLLECTION",
desc: "DON'T COMPROMISE ON STYLE! GET FLAT 30% OFF FOR NEW ARRIVALS.",
bg: "F9DA8F",
fColor: "121212",
mobileFColor: "ffffff",
button: "shop now",
component: "productList",
},
];
//--------
const Slide = styled.div`
width: 100vw;
height:100vh;
display: flex;
align-items: center;
background-image: none;
//color PROPS
background-color: #${(props) => props.bg};
color: #${(props) => props.fColor};
${mobile({
backgroundImage: (props) => `url(${props.small})`,
backgroundSize: "cover",
backgroundRepeat: "no-repeat",
backgroundColor: "transparent",
backgroundPosition: "center",
color: (props) => `#${props.mobileFColor}`
})}
`;
const Slider = () => {
return (
<Container>
<Wrapper slideIndex={slideIndex}>
{sliderItems.map((items) => (
<Slide
bg={items.bg}
fColor={items.fColor}
mobileFColor={items.mobileFColor}
key={items.id}
small={items.img}
>
<InfoContainer>
<Title>{items.title}</Title>
<Desc>{items.desc}</Desc>
<Link to={items.component}>
<Button fColor={items.fColor}> {items.button}
</Button>
</Link>
</InfoContainer>
</Slide>
))}
</Wrapper>
</Container>
);
};
export default Slider;
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/0.14.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/0.14.0/react-dom.min.js"></script>
我在 Material-UI 中对将道具传递给 makeStyles 做了一些研究,并且
const useStyles = makeStyles((theme) => ({
root: {
borderRadius: props => props.raidus
backgroundImage: props => `url(${props.urls[0]})` // failure -- This will set every url to first image
}
}));
export default App = () = {
const urls = [
'path/image-1.jpg',
'path/image-2.jpg',
'path/image-3.jpg',
];
const props = {
radius: 10,
urls: urls
};
const classes = useStyles(props);
return (
<div>
{urls.map((url, index) => {
<div
key={index}
className={classes.root} // <--- I want it handled here
// styles={{ background: `url(${url})` }} // <--- alternative way
/>
)}
</div>
);
};
或者,背景图像的 url 可以使用 内联样式 设置(如注释掉的行所示),但我希望它们在 Material-UI 中的样式中进行处理。这可以在 class root
内完成吗?任何帮助将不胜感激。
使用 $ 进行设置:
backgroundImage: (props) => `url(${props.url[0]})`
样本:HERE
您需要另一个组件来检索 url
并将其传递给 useStyles()
const urls = ["path/image-1.jpg", "path/image-2.jpg", "path/image-3.jpg"];
const useStyles = makeStyles(theme => ({
root: {
borderRadius: props => props.radius,
backgroundImage: props => `url(${props.url})`
}
}));
function MyComponent(props) {
const { url } = props;
const styleProps = {
radius: 10,
url
};
const classes = useStyles(styleProps);
return (
<div
className={classes.root}
>
{url}
</div>
);
}
export default function App() {
return (
<div>
{urls.map((url, index) => (
<MyComponent key={index} url={url} />
))}
</div>
);
}
工作示例(检查来自开发工具的 background-image 属性)
非常感谢 Babak Yaghoobi !!我一直在尝试所有可能的方法,而你的方法是唯一有效的:)
import { mobile, mobileM } from "../responsive";
//
//data.js
export const sliderItems = [
{id: 0,
img: "../img-store/oladimeji-odunsi-2.jpg",
title: "AUTUMN COLLECTION",
desc: "DON'T COMPROMISE ON STYLE! GET FLAT 30% OFF FOR NEW ARRIVALS.",
bg: "F9DA8F",
fColor: "121212",
mobileFColor: "ffffff",
button: "shop now",
component: "productList",
},
];
//--------
const Slide = styled.div`
width: 100vw;
height:100vh;
display: flex;
align-items: center;
background-image: none;
//color PROPS
background-color: #${(props) => props.bg};
color: #${(props) => props.fColor};
${mobile({
backgroundImage: (props) => `url(${props.small})`,
backgroundSize: "cover",
backgroundRepeat: "no-repeat",
backgroundColor: "transparent",
backgroundPosition: "center",
color: (props) => `#${props.mobileFColor}`
})}
`;
const Slider = () => {
return (
<Container>
<Wrapper slideIndex={slideIndex}>
{sliderItems.map((items) => (
<Slide
bg={items.bg}
fColor={items.fColor}
mobileFColor={items.mobileFColor}
key={items.id}
small={items.img}
>
<InfoContainer>
<Title>{items.title}</Title>
<Desc>{items.desc}</Desc>
<Link to={items.component}>
<Button fColor={items.fColor}> {items.button}
</Button>
</Link>
</InfoContainer>
</Slide>
))}
</Wrapper>
</Container>
);
};
export default Slider;
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/0.14.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/0.14.0/react-dom.min.js"></script>