javascript - 如何为传递给高阶组件的组件设置样式?
问题描述
代码示例: https ://codesandbox.io/s/confident-shadow-o84fn
所以我在上面的链接上有一个超级精简版和基本版我的问题。
本质上 - 我有一个无法修改的未设置样式的TextInput
组件,但被告知我需要使用。我创建了自己的高阶组件,它接受默认输入并根据自己的喜好对其进行修改。我添加了几个新的道具,支持文本等,这些都是建立在默认值之上的。
一切都按预期工作,但是,我无法像预期的那样使用 Styled Components 对传递的组件进行样式设置。
<Container />
并且<SupportingCopy />
都是我想要的样式(因为它们是新元素)。但是,除非我在我的内部添加通用input
样式,否则我Container
似乎无法实现我所需要的。
我尝试const NewStyledInput = styled(TextInput)
在我的内部添加类似的东西StyledInput
,但后来我遇到了渲染问题。
<TextInput />
当我拥有组件的其余部分时,最好的样式是什么?
在我的示例中 - 我想在输入时将输入的边框变为绿色isFocused
(true
就像支持文本一样)。我很欣赏这似乎很小 - 但是我已经从这个示例中删除了很多内容以使其更易于解释。
谢谢你的帮助!
const withStyles = TextInput => {
const StyledInput = ({ ...props }) => {
const { onFocusCallback, onBlurCallback } = props;
const [isFocused, setIsFocused] = useState(false);
const handleFocusBlur = () => {
setIsFocused(!isFocused);
};
return (
<Container>
// I want to style TextInput with Styled Components.
<TextInput
{...props}
onFocusCallback={handleFocusBlur}
onBlurCallback={handleFocusBlur}
isFocused={isFocused}
/>
<br />
<SupportingCopy isFocused={isFocused}>
Some additional text
</SupportingCopy>
</Container>
);
};
解决方案
我不确定为什么在这种情况下需要 HOC,所以它非常简单:
const Container = styled.div`
position: relative;
`;
const SupportingCopy = styled.label`
color: ${({ isFocused }) => (isFocused ? 'green' : 'inherit')};
font-size: 10px;
`;
const greenBorder = css`
border: 5px solid green;
`;
const MyNewStyledInput = styled(TextInput)`
padding: 10px;
${({ isFocused }) => isFocused && greenBorder};
`;
const StyledInput = props => {
const [isFocused, setIsFocused] = useState(false);
const onFocusCallback = useCallback(() => setIsFocused(p => !p), []);
return (
<Container>
<MyNewStyledInput
{...props}
isFocused={isFocused}
onFocusCallback={onFocusCallback}
/>
<br />
<SupportingCopy isFocused={isFocused}>
Some additional text
</SupportingCopy>
</Container>
);
};
推荐阅读
- python - Django Rest Framework 自定义只读字段依赖于相关模型
- javascript - Nuxtjs,来自 asyncdata 的 Express 调用数据库
- sql - 在查询计划中显示估计值与实际估计值
- unity3d - 我正在尝试使用 Time.deltaTime 统一制作一个计时器以重新加载。任何人都知道为什么这不起作用?
- python - 如何为 Django-Shop CartItems 使用十进制数量
- python - Mac - VSCode - 将 Python 文件转换为 PDF 错误
- laravel - Laravel 国家从下拉列表中选择不保存
- java - 启动服务器时出现错误 GlassFish 5.0.1:java.lang.NoClassDefFoundError: sun/security/util/CurveDB
- sql - PostgreSQL - 存储永不改变的数据
- python - 未腌制的张量流模型无法做出预测