با کلیک بر روی React Component، متن را در کلیپ بورد کپی کنید

✨ در یوتیوب تماشا کنید | 🐙 گیت هاب | 🎮 نسخه ی نمایشی
بیایید یک کامپوننت React زیبا بسازیم که با کلیک کردن، متن را در کلیپ بورد کپی می کند. یک نماد کپی را در پایان نشان می دهد که نشان می دهد می توانید با متن تعامل داشته باشید، هنگامی که ماوس را نگه دارید روشن تر می شود و با کلیک کردن، نماد کپی به یک نماد بررسی تبدیل می شود.
این CopyText
کامپوننت همان خصوصیات را دریافت می کند Text
جزء پلاس content
ویژگی که باید حاوی متنی برای کپی باشد. برای کسب اطلاعات بیشتر در مورد قابل استفاده مجدد Text
جزء، این پست را بررسی کنید.
import { Text } from "lib/ui/Text"
import { CopyIcon } from "./icons/CopyIcon"
import styled from "styled-components"
import { getColor } from "./theme/getters"
import copy from "copy-to-clipboard"
import { defaultTransitionCSS } from "./animations/transitions"
import { useState } from "react"
import { Match } from "./Match"
import { CheckIcon } from "./icons/CheckIcon"
interface CopyTextProps extends React.ComponentProps<typeof Text> {
content: string
}
const IconWr = styled(Text)`
margin-left: 4px;
${defaultTransitionCSS};
color: ${getColor("textSupporting3")};
`
const Container = styled(Text)`
cursor: pointer;
&:hover ${IconWr} {
color: ${getColor("contrast")};
}
`
type IconToShow = "copy" | "copied"
export const CopyText = ({ content, children, ...rest }: CopyTextProps) => {
const [iconToShow, setIconToShow] = useState<IconToShow>("copy")
return (
<Container
onMouseLeave={() => setIconToShow("copy")}
onTouchEnd={() => setIconToShow("copy")}
onClick={() => {
copy(content)
setIconToShow("copied")
}}
{...rest}
>
{children}
<IconWr as="span">
<Match
value={iconToShow}
copy={() => <CopyIcon />}
copied={() => <CheckIcon />}
/>
</IconWr>
</Container>
)
}
این Container
کامپوننت استایل های را تغییر می دهد Text
جزء با اضافه کردن نشانگر به همراه افکت شناور که رنگ آن را تغییر می دهد IconWr
جزء. داخل از Container
ما بچه ها و IconWr
مؤلفه ای که بسته به آن نماد کپی یا علامت چک را نشان می دهد iconToShow
حالت. این Match
کامپوننت یک کمک کننده ساده است که محتوا را بر اساس value
ویژگی. جایگزین بهتری برای switch
بیانیه.
import { ReactNode } from "react"
type MatchProps<T extends string | number | symbol> = Record<
T,
() => ReactNode
> & {
value: T
}
export function Match<T extends string | number | symbol>(
props: MatchProps<T>
) {
const render = props[props.value]
return <>{render()}</>
}
برای تجربه کاربری بهتر، ما آیکون کپی را به نماد چک در هنگام کلیک تغییر میدهیم و زمانی که کاربر ماوس را روی انگشت خود از صفحه لمسی خارج میکند، آن را به نماد کپی بازنشانی میکنیم.