Rob*_*uch 4 css reactjs css-modules styled-components
当我想从样式化组件迁移到 CSS 模块时,出现了以下问题。
假设我有以下样式组件,它接受动态参数offset和动态 CSS 字符串theme:
const Li = styled.li`
&.selected {
background-color: grey;
}
margin-left: ${({ offset }) => offset}px;
${({ theme }) => theme};
`;
Run Code Online (Sandbox Code Playgroud)
在我的代码中,我会按以下方式使用它:
const Parent = () => (
<List>
{list.map((item) => (
<Item
key={item.id}
id={item.id}
selectedIds={[]}
offset={24}
theme={`
&.selected {
background-color: green;
}
`}
>
{item.name}
</Item>
))}
</List>
);
const Item = ({ id, offset = 0, theme, children }) => {
return (
<Li
theme={theme}
offset={offset}
className={selectedIds.includes(id) && 'selected'}
>
{children}
</Li>
);
};
Run Code Online (Sandbox Code Playgroud)
要求:现在我真的会保留Item的组件 API:传递一个number偏移量和一个样式字符串theme。所以基本上Parent组件中的所有内容都应该保持这种状态。
如何在Item内部转换组件以使用 CSS 模块而不是样式Li组件?
这可能是一种与过去不同的思维方式它可以工作
style={{ [`--offset`]: `${offset}px` }}
Run Code Online (Sandbox Code Playgroud)
style={{ [`--offset`]: `${offset}px` }}
Run Code Online (Sandbox Code Playgroud)
withSelected.item {
margin-left: var(--offset);
}
Run Code Online (Sandbox Code Playgroud)
所以你可以将它作为“主题”传递
theme={themes.withSelected}
Run Code Online (Sandbox Code Playgroud)
这是组件的外观
import styles from "./style.module.scss";
import themes from "./themes.module.scss";
const Parent = () => (
<ul>
{list.map((item) => (
<Item
key={item.id}
id={item.id}
selectedIds={[1]}
offset={24}
theme={themes.withSelected}
>
{item.name}
</Item>
))}
</ul>
);
const Item = ({ id, offset = 0, theme, children, selectedIds }) => {
return (
<li
className={`${styles.item} ${theme} ${
selectedIds.includes(id) && themes.selected
}`}
theme={theme}
style={{ [`--offset`]: `${offset}px` }}
>
{children}
</li>
);
};
Run Code Online (Sandbox Code Playgroud)
演示:https : //codesandbox.io/s/styledcomponent-to-css-modules-1kbqx
| 归档时间: |
|
| 查看次数: |
473 次 |
| 最近记录: |