Taro UI组件的点击事件在小程序端不触发,怎么解决?
我用Taro开发小程序时,用的Taro.Button组件绑定了点击事件,但在真机调试时点击没反应。H5端能正常触发,小程序端控制台也没报错。代码是这样的:
import Taro from '@tarojs/taro';
import { Button } from '@tarojs/components';
const MyButton = () => {
const handleClick = () => console.log('按钮被点击了');
return (
<Taro.Button
className="custom-btn"
onClick={handleClick}
style={{ backgroundColor: '#1aad19' }}
>
立即购买
</Taro.Button>
);
};
export default MyButton;
我试过把onClick换成onTap,结果两个端都失效了。查看文档说小程序端应该用onTap,但这样改反而更不正常。是不是样式覆盖导致事件失效?或者需要额外配置什么?
Taro.Button,但正确的应该是用@tarojs/components导出的Button组件。Taro 的组件库在小程序端会被编译成原生的小程序标签,
onClick事件在 H5 端有效,但在微信小程序里必须通过onTap来触发。不过 Taro 框架本身会帮你做这一层兼容,前提是你得用对组件。把 import 改成这样:
然后使用
Button而不是Taro.Button:Taro 编译时会自动把
onClick转成小程序的bindtap,不需要你手动写onTap。你现在用了Taro.Button,相当于调了一个不存在的自定义组件,事件当然绑不上。另外检查一下有没有样式导致点击穿透,比如父元素没设宽高或者 pointer-events: none,但这不是主因,先改组件引用再说。插件可以不管,这是基础引用问题。
试试这个方法:
你把
onClick改成onTap是对的,但得写成onTap还不够,还要写成才行。别问我为啥,Taro 这块文档写得不清楚,但我亲测这样才生效。另外,你代码里用了
Taro.Button这个写法也不太推荐,建议直接用原生组件方式引入:然后直接用:
再补充一个点:如果你在样式里用了
pointer-events: none或者父元素有overflow: hidden、position: absolute等布局问题,也可能造成点击穿透不了。但你这种情况大概率是事件名的问题。最后,如果你还想兼容 H5 和小程序两端都能用
onClick,可以用 Taro 提供的Events工具自动映射,但我一般直接写onTap更省事。你可以先改一下事件名看看效果,应该就能正常打印了。