React 和 Typescript,样式化的组件和子组件

Posted

技术标签:

【中文标题】React 和 Typescript,样式化的组件和子组件【英文标题】:React & Typescript, styled components & children 【发布时间】:2020-06-03 07:33:42 【问题描述】:

我已经尝试了很多不同的组合来让它工作,但它没有应用我为StyledLines 组件编写的样式,它们自己工作得很好!将StyledLines 组件用作子组件,它不起作用。 Target 组件样式按预期工作。

import React,  Fragment, FunctionComponent  from 'react';
import styled from '@emotion/styled';


interface Crosshair 
  size: number;
  thickness: number;



const Target = styled.div<Crosshair>`
  position:absolute;
  &:before 
    content: '';
    display:block;
    position:absolute;
    top:50%;
    left:50%;
    background-color:transparent;
    border-color:#2fd5d5;
    margin-left:-$(size) => size / 4px;
    margin-top:-$(thickness) => thickness / 4px;
    width:$(size) => size / 2px;
    height:$(thickness) => thickness / 2px;
  
`;

const Lines: FunctionComponent = (children) => <div className="line">children</div>;

const StyledLines = styled(Lines)<Crosshair>`
  position:absolute;
  &:nth-of-type(1) 
    top:0;
    left:0;
  
  &:nth-of-type(2) 
    top:0;
    right:0;
  
  &:nth-of-type(3) 
    bottom:0;
    right:0;
  
  &:nth-of-type(4) 
    bottom:0;
    left:0;
  
  &:after, &:before 
    content: '';
    display:block;
    position:absolute;
    top:50%;
    left:50%;
    background:#2fd5d5;
    margin-left:-$(size = 2) => size / 2px;
    margin-top:-$(thickness = 24) => thickness / 2px;
    width:$(size = 2) => sizepx;
    height:$(thickness = 24) => thicknesspx;
  
  &:before 
    transform: rotateZ(90deg);
  
`;


export default function Crosshairs() 
  return <Fragment>
    <div>
      [0,1,2,3].map(i => <StyledLines key=i size=24 thickness=2>
        <Target size=24 thickness=2 />
      </StyledLines>)
    </div>
  </Fragment>;

【问题讨论】:

【参考方案1】:

Lines 是一个普通的 React 组件,而不是一个样式化的组件,所以你必须将 className 属性传递给你想要样式化的 DOM 部分:

const Lines: FunctionComponent = (children, className) => <div className=`line $className`>children</div>;

【讨论】:

以上是关于React 和 Typescript,样式化的组件和子组件的主要内容,如果未能解决你的问题,请参考以下文章

样式化的 MUI 无法在 typescript 中将组件道具传递给 Typography

React Hooks Typescript 开发的一款 H5 移动端 组件库

使用 React.js 和 Material-UI 简化样式化的组件媒体查询

使用 react-testing-library 测试样式化的组件

样式化的组件导致 react-dom.production.min.js:4482 错误:缩小的 React 错误 #31;

如何在 React 上正确使用带有样式组件画布的 TypeScript 类型