在React+TypeScript中调用Lit Web Component回调函数的问题
问题描述
我使用Lit开发了一个接收函数作为输入属性的Web Component,在Vue 3中测试时successCallback回调函数可以正常触发,但在React+TypeScript项目中该回调却无法运行。以下是我的React代码:
import React, { FC } from 'react'; import '@webcomponents/widgets' declare global { namespace JSX { interface IntrinsicElements { 'webcomponents-widgets': WidgetProps } } } interface WidgetProps extends React.DetailedHTMLProps<React.HTMLAttributes<HTMLElement>, HTMLElement> { var1: string, successCallback: Function, } const App = () =>{ const onSuccessCallback = () =>{ console.log("add some logic here"); } return(<webcomponents-widgets var1="test" successCallBack={onSuccessCallback}></webcomponents-widgets>) }
请问如何让React组件中的该回调函数被触发?是否遗漏了相关配置?
解决方案
导致回调无法触发有两个核心问题,对应修复方式如下:
修正属性名拼写错误
你在JSX中传递的属性是successCallBack(Call的首字母大写),但接口定义的属性名是successCallback(callback为全小写后缀),两者不匹配。先将JSX中的属性名修正为successCallback。通过Ref手动传递函数属性
React对自定义元素的函数属性支持存在局限,不会自动将函数作为自定义属性绑定到元素上,需要通过ref配合useEffect手动赋值:
import React, { FC, useRef, useEffect } from 'react'; import '@webcomponents/widgets' declare global { namespace JSX { interface IntrinsicElements { 'webcomponents-widgets': WidgetProps } } } // 替换宽泛的Function类型为具体的函数类型,提升类型安全性 interface WidgetProps extends React.DetailedHTMLProps<React.HTMLAttributes<HTMLElement>, HTMLElement> { var1: string, successCallback: () => void, } const App = () =>{ const widgetRef = useRef<HTMLElement>(null); const onSuccessCallback = () =>{ console.log("add some logic here"); } useEffect(() => { if (widgetRef.current) { // 直接给自定义元素实例绑定回调属性 (widgetRef.current as any).successCallback = onSuccessCallback; } }, [onSuccessCallback]); return(<webcomponents-widgets ref={widgetRef} var1="test"></webcomponents-widgets>) }
补充说明:如果你的Lit组件是通过@property()装饰器定义的successCallback属性,其对应的HTML原生属性名为success-callback,但即使使用短横线形式在JSX中传递,React仍可能无法正确处理函数类型的属性,因此使用Ref手动绑定是更可靠的方案。
内容的提问来源于stack exchange,提问作者Sudeep Mishra
相关产品推荐
相关产品推荐

