我正在使用样式化的组件来样式化我的链接。有时我还需要使用Link
中的react-router-dom
组件。
import { Link } from 'react-router-dom';
import { Anchor } from './src';
export const StyledLink = Anchor.withComponent(Link);
但是,以上代码在控制台中产生以下警告:
警告:收到
true
的非布尔属性unstyled
。如果要将其写入DOM,请改为传递一个字符串: unstyled =“ true”或unstyled = {value.toString()}。
unstyled
是一个传递给StyledLink
的道具,如下所示:
<StyledLink unstyled />
此警告由Link
组件生成,原因是unstyled
将Link
属性传递给DOM元素。
因此,问题是,如何防止Link
尝试向元素添加道具?
答案 0 :(得分:1)
Styled Component
的目的是为带有原始道具的透明组件提供服务(参考:https://www.styled-components.com/docs/basics#passed-props)。
您正在寻找的模式是一个HoC
(参考:https://reactjs.org/docs/higher-order-components.html),它返回一个样式化的(或基于道具不样式化的)组件。
答案 1 :(得分:0)
MosèRaguzzini是对的。您可能想尝试的解决方案是创建一个小的自定义组件,该组件使用样式化的组件来包装Link组件,该组件将必要的道具传递给您的样式化组件以及Link组件
答案 2 :(得分:0)
如果我正确地解决了问题。我使用官方文档页面https://www.styled-components.com/docs/api#typescript
中提供的解决方案styles.ts文件内部
export const StyledLink = styled(({ hoverColor, color, ...rest }) => React.createElement(Link, rest))<{
hoverColor?: string;
color?: string;
}>...
或内部style.tsx
export const StyledLink = styled(({ hoverColor, color, ...rest }) => <Link {...rest} />)<{
hoverColor?: string;
color?: string;
}>...
只需删除类型,相同的方法就应适用于ES6。
答案 3 :(得分:0)
今天我面临着类似的事情,我必须去除传递给样式组件的自定义道具,以生成条件CSS。 我正在使用样式组件和语义UI反应:
const TableHeaderCell = styled(({ hasBorderLeft, ...rest }) => <Table.HeaderCell {...rest} />)`
border-left: ${hasBorderLeft => (hasBorderLeft ? 'none' : '')};
`;
我摆脱了对未知道具的反应警告。像这样使用它:
<TableHeaderCell hasBorderLeft={hasBorderLeft} />