使用 Typescript 将 props 传递给由 styled-components 包装的 material-ui 按钮
Posted
技术标签:
【中文标题】使用 Typescript 将 props 传递给由 styled-components 包装的 material-ui 按钮【英文标题】:Passing props to material-ui button wrapped by styled-components with Typescript 【发布时间】:2021-10-13 02:49:03 【问题描述】:我使用 typescript 模板创建了 react 项目,并使用 styled-components 库中的 styled 方法设置了 Material-ui Button 组件的样式,如下所示:
import React from 'react';
import styled from 'styled-components';
import Button, ButtonProps from "@material-ui/core/Button";
type StyledButtonProps = ButtonProps & primary?: boolean
const styledButton = styled(Button)`
background-color: $(props: StyledButtonProps) => props.primary ? "palevioletred" : "white";
box-shadow: 0 4px 6px rgba(50, 50, 93, 0.11), 0 1px 3px rgba(0, 0, 0, 0.08);
padding: 7px 14px;
&:hover
background-color: aqua;
& .MuiButton-label
color: #070303;
` as React.ComponentType<StyledButtonProps>
export default styledButton;
我正在尝试传递确定颜色的主要布尔值。它通常可以工作,但是当我尝试使用如下所示的样式按钮时会出现警告消息:
<StyledButton primary=true>Styled Buton</StyledButton>
警告信息是:
这是为什么呢?我怎样才能摆脱这个警告?
【问题讨论】:
【参考方案1】:Styled-components 尝试将 primary=true
传递给 DOM,但 DOM 只接受字符串值 primary="true"
。因此,它会警告您将true
更改为"true"
,以便它可以成功呈现到DOM。
如果我们将primary=true
更改为primary="true"
,则主要属性将显示在 DOM 上,如下所示:
但我认为您不希望 primary
被渲染到 DOM,所以
使用 Transient 道具消除警告:
美元符号 ($) 前缀有助于样式组件避免将该属性传递给 DOM。 Read this for details
<StyledButton $primary=true>Styled Buton</StyledButton>
...
background-color: $(props: StyledButtonProps) =>
props.$primary ? "palevioletred" : "white";
...
这里是codesandbox for demo。
【讨论】:
以上是关于使用 Typescript 将 props 传递给由 styled-components 包装的 material-ui 按钮的主要内容,如果未能解决你的问题,请参考以下文章
使用 Typescript 将 props 传递给由 styled-components 包装的 material-ui 按钮
使用 TypeScript 时如何将 prop 传递给 material-ui@next 中的自定义根组件?
使用 Typescript 使用 getInitialProps 将 prop 传递到 Next.js 中的每个页面
将自定义道具传递给 TypeScript 中的 Redux 表单字段
MapDispatchToProps 导致父组件中的 Typescript 错误,期望 Actions 作为 props 传递