【问题标题】:React - Typescript - How to function as prop to another componentReact - Typescript - 如何充当另一个组件的道具
【发布时间】:2022-06-11 01:34:49
【问题描述】:

共有三个组件Toggle、ToggleMenu、Wrapper

切换开关应该是通用的,并且用于不同的功能 Wrapper 应该只在切换打开时更改背景颜色

问题是如何将负责改变颜色的函数传递给切换菜单,它在切换切换时执行

应用程序

import React from 'react';
import { Wrapper } from './containers/wrapper';
import { Button } from './components/buttons/button';
import { ToggleMenu } from './components/settings/settings';
 
const App = () => {
  return (
    <>
    <Wrapper>
        <Button />
        <ToggleMenu />
    </Wrapper> 
    </>
  )
}

export default App;

切换菜单

import styled from "styled-components";
import { Toggle } from "../buttons/toggle";
import { WrapperProps } from "../../containers/wrapper";
import { test } from "./test"

const SettingsContainer = styled.div`
  margin: auto;
  width: 50%;
  height: 50%;
  display: flex;
  align-items: center;
  justify-content: center;
  background-color: white;
`;

const Container = styled.div`
  height: 50%;
  width: 50%;
  display: flex;
  justify-content: center;
  flex-direction: column;
  background-color: lime;
`;

const TogCon = styled.div`
  margin: 0.5em;
`;

export const ToggleMenu = (props: WrapperProps) => {
  return (
    <SettingsContainer>
      <Container>
        <TogCon>
          <Toggle toggleText={"Dark mode"} onChange={props.handleTheme}/>
        </TogCon>
        <TogCon>
          <Toggle toggleText={"Sth"} onChange={() => {console.log("Sth")}}/>
        </TogCon> 
      </Container>
    </SettingsContainer>
  );
};

包装器

import React, { useState } from "react";
import styled from "styled-components";

export type WrapperProps = {
  children?: React.ReactNode;
  color?: string;
  handleTheme?: () => void;
};

const Container = styled.div<WrapperProps>`
  width: 100%;
  height: 100%;
  top: 0;
  left: 0;
  position: fixed;
  background-color: ${props => props.color }
`

export const Wrapper = ({ children }: WrapperProps) => {

  const [theme, setTheme] = useState("black")

  const handleTheme = () => {
    theme === "black" ? setTheme("white"): setTheme("black")
  }

  return(
    <Container 
      color={theme}
      handleTheme={handleTheme}
    > { children } 
    </Container>
  );
}

【问题讨论】:

    标签: reactjs typescript react-hooks


    【解决方案1】:

    已通过 React.cloneElement

    解决
    export const Wrapper = (props: WrapperProps) => {
        
          const [theme, setTheme] = useState("black")
        
          const handleTheme = () => {
            theme === "black" ? setTheme("white"): setTheme("black")
          }
        
          const childrenWithProps = React.Children.map(props.children, child => {
            if (React.isValidElement(child)) {
              return React.cloneElement(child, { handleTheme });
            }
            return child;
          });
        
          return(
            <Container color={theme} > 
              { childrenWithProps }
            </Container>
          );
          }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-07-23
      • 2019-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多