React-Call让你的React组件像异步函数一样调用

在React项目的开发过程中,很多时候像Toast 、Confirm 、Notification 、Drawer等等组件我们预期的是非必要可以不需要 ,只有在使用的时候才需要渲染。像window.confirm 一样的操作。 虽然很多React的组件库都实现了,比如Antd 的Modal 组件实现了Modal.confirm等。

但是平时我们不想引入组件库只想通过Tailwindcss或者原生的css写的时候就可以通过React-Call这个组件库就可以实现对应的功能:官网

创建Confirm组件

Confirm.tsx 复制代码
import { createCallable } from 'react-call'

interface Props {

    message: string

}

type Response = boolean

export const Confirm = createCallable<Props, Response>(({ call, message }) => (

    <div

    role="dialog"

    aria-modal="true"

    className="fixed inset-0 z-50 flex items-center justify-center bg-black/50 backdrop-blur-sm"

    >

    <div className="w-full max-w-sm rounded-lg border border-[var(--color-border)] bg-[var(--color-bg)] p-6 shadow-2xl">

    <p className="text-base text-[var(--color-fg)]">{message}</p>

    <div className="mt-6 flex items-center justify-end gap-3">

        <button

        type="button"

        onClick={() => call.end(false)}

        className="rounded-md border border-[var(--color-border)] px-4 py-2 text-sm font-medium text-[var(--color-fg-muted)] transition-colors hover:text-[var(--color-fg)]" >

            取消

        </button>

        <button

        type="button"

        onClick={() => call.end(true)}

        className="rounded-md bg-[var(--color-accent)] px-4 py-2 text-sm font-medium text-[var(--color-accent-fg)] transition-colors hover:bg-[var(--color-accent-hover)]"

        >

            继续

        </button>

    </div>

    </div>

    </div>

))

Confirm.displayName = 'Confirm'

将组件引入到root中

js 复制代码
import { Confirm } from './Confirm'

import { DeleteButton } from './DeleteButton'

export default function App() {

return (

<>

<Confirm />

<DeleteButton />

</>

)

}

在项目的任何地方引用创建的Comfirm组件

js 复制代码
import { useState } from 'react'

import { Confirm } from './Confirm'

export const DeleteButton = () => {

const [status, setStatus] = useState<'idle' | 'deleted' | 'cancelled'>('idle')

const handleClick = async () => {

    const accepted = await Confirm.call({

    message: '确定要删除这条数据?',

    })

    setStatus(accepted ? 'deleted' : 'cancelled')

}

return (

<div className="flex flex-col items-center gap-3">

    <button

    type="button"

    onClick={handleClick}

    className="rounded-md bg-red-600 px-4 py-2 text-sm font-medium text-white transition-colors hover:bg-red-700"

    >

        删除

    </button>

    <span className="font-mono text-xs text-[var(--color-fg-subtle)]">

    {status === 'idle' && '→ awaiting click...'}

    {status === 'deleted' && (

        <span className="text-[var(--color-accent)]">→ deleted</span>

    )}

        {status === 'cancelled' && '→ cancelled'}

    </span>

</div>

)

}
相关推荐
yivifu38 分钟前
中文古籍电子书注释集成
前端·javascript·python·beautifulsoup·epub
默_笙1 小时前
🛴 从散件到整机:DeepAgents 与 Agent 身上预留的那些"插槽"(前置介绍)
前端·javascript
zhangzeyuaaa2 小时前
深入理解 Ruby 运算符:本质、分类、坑点与重载实战
开发语言·前端·ruby
一木 之林2 小时前
DeepSeek Agent 开发(一)
开发语言·前端·javascript
树下水月3 小时前
Typora破解
linux·服务器·前端
用户5508492902563 小时前
CSS布局实战:从Flex到Grid的完整避坑指南
前端
用户5508492902563 小时前
前端接口请求层怎么封装?一个可落地的请求方案
前端
MetWeave3 小时前
跟着一条 SPECI 走流水线:从电报到界面
前端
Helix2504 小时前
Chrome 开发者工具进阶:长截图、网络调试与性能分析
前端·chrome·chrome devtools·使用技巧·性能分析·开发者工具·长截图
liangshanbo12154 小时前
面试题:Webpack 的 publicPath 有什么作用?
前端·webpack·node.js