Taro小程序 点击某元素以外的地方触发事件 - Kaiqisan

本文介绍如何在小程序中实现特定区域外点击关闭的效果。通过绑定点击事件到外部元素并利用递归遍历节点树来获取所有节点ID,进而判断点击位置是否符合预期。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

大家好,都吃晚饭了吗?我是Kaiqisan,是一个已经走出社恐的一般生徒,这个话题之前也讲过了,不过这次是要在小程序里面实现,这个模块的功能在小程序中出现得比较多,所以就在之前也用过一次,
它终归还是和web端有点不同,不过还好它并不太复杂。

(web端实现方法详见我的这篇博客-----------> 给个链接)

现在我们写好了这个页面

在这里插入图片描述
我们需要点击灰色的页面触发某事件,而点击白色区域不会(很多小程序内部的通知弹窗啥的都是这样的,点击弹窗以外的地方就可以实现弹窗的关闭)

html代码部分

<View className='main'>
    <View className='inner' id='app'>
    	<View className='inner2'>add</View>
        <Text>ddd</Text>
    </View>
</View>
  • 下一步,我们开始绑定点击事件
{/* main是主节点,长宽都是屏幕尺寸 */}
<View className='main' onClick={this.cancel.bind(this)}>
    <View className='inner'>
    	<View className='inner2'>add</View>
        <Text>ddd</Text>
    </View>
</View>

切记绑定事件一定要绑定到外部的元素上(因为这个事件监测是全屏监测)

  • 在书写事件之前要说明一件事情,在小程序的获取事件中,并不会获取当前事件所指向的DOM元素(target)以及其事件的冒泡顺序(path),而是只会获取当前触发事件的元素的id,所以在监听之前,我们需要获取外层元素内部的所有的节点id(内部很多子节点,它们各有自己的id,如果只是获取一个外层的id,整个监测的设计是不彻底的,容易导致不好的用户体验)
    在这里插入图片描述
    所以我们需要遍历这颗节点子树(我们这里使用了递归)
// ts版
	searchId(currentNode): void {
        let nowList: string[] = this.state.idList;
        nowList.push(currentNode.uid);
        this.setState({ // 修改idList ,如果您使用vue的话就直接修改this.idList即可
            idList: nowList
        });
        if (currentNode.childNodes.length) {
            for (let i = 0; i < currentNode.childNodes.length; i++) {
                this.searchId(currentNode.childNodes[i])
            }
        }
    }
// js版
	searchId(currentNode) {
        let nowList = this.state.idList;
        nowList.push(currentNode.uid);
        this.setState({ // 修改idList ,如果您使用vue的话就直接修改this.idList即可
            idList: nowList
        });
        if (currentNode.childNodes.length) {
            for (let i = 0; i < currentNode.childNodes.length; i++) {
                this.searchId(currentNode.childNodes[i])
            }
        }
    }

现在,我们所有的id信息都储存在 idList当中去了

在这里插入图片描述
图中为小程序默认给的id,如果您自己命名了某节点id,就不会再采用默认id

然后剩下的判断步骤就和web端的一模一样了

// ts版
	cancel(e: TaroEvent<any>) {
		// vue直接书写this.idList
        if (!this.state.idList.includes(e.target.id)) {
            console.log('ok'); // 里面执行符合条件的方法,最常见的就是关闭小窗口
        }
    }
// js版
	cancel(e) {
		// vue直接书写this.idList
        if (!this.state.idList.includes(e.target.id)) {
            console.log('ok'); // 里面执行符合条件的方法,最常见的就是关闭小窗口
        }
    }

最终实现效果

在这里插入图片描述

总结

本篇文章基于taro+react+ts,如果您不是使用上面的框架(或语言或打包工具)请麻烦您稍微切换一下!

<think>嗯,用户问的是Taro小程序中如何触发TabBar的点击事件。我需要先回忆一下Taro的相关文档。记得在Taro中,TabBar的配置是在app.config.js里设置的,每个页面需要对应到tabBar的list里。然后,用户点击TabBar的时候,默认会切换页面,但有时候可能需要手动触发一些逻辑。 首先,应该明确Taro本身有没有提供TabBar点击事件监听。比如在小程序原生开发中,可以通过onTabItemTap来监听,Taro应该也支持这个生命周期方法。需要确认一下在页面中如何使用,比如在类组件中使用componentDidShow或者函数组件中用useDidShow,或者直接使用onTabItemTap这个生命周期函数。 然后,用户可能需要的是在点击TabBar的时候执行一些自定义操作,比如重新加载数据,或者跳转到其他页面而不是默认的页面。这时候可能需要阻止默认的切换,或者结合跳转方法处理。不过要注意,Taro的switchTab只能跳转到tabBar定义的页面,所以可能需要先跳转再处理逻辑。 另外,用户可能想知道如何手动触发TabBar的点击事件,比如通过按钮点击来模拟TabBar的切换。这时候可能需要调用Taro.switchTab方法,并且可能需要触发对应页面的生命周期事件,比如onShow或者onTabItemTap。需要注意,直接调用switchTab可能不会触发onTabItemTap,因为这是页面的事件,而switchTab只是切换页面。 还有,需要提醒用户关于H5和微信小程序等不同平台的行为差异,比如H5下的一些限制。比如,H5中switchTab可能表现不同,或者事件监听的兼容性问题。可能需要用户进行平台判断或者特殊处理。 可能用户遇到的问题是在点击TabBar时,如何同时执行某些操作,比如发送统计信息,或者检查登录状态。这时候在onTabItemTap生命周期里处理这些逻辑,然后再跳转或者做其他事情。需要注意,如果跳转到其他页面可能需要使用reLaunch或者redirectTo,但switchTab只能跳转tabBar页面。 总结下来,步骤应该是: 1. 在页面的生命周期中监听TabBar点击事件,使用onTabItemTap。 2. 在事件处理函数中执行自定义逻辑,比如数据加载或跳转。 3. 使用Taro提供的API如switchTab来手动触发TabBar切换,并注意相关生命周期的触发情况。 4. 处理不同平台的兼容性问题,尤其是H5端。 需要确保示例代码正确,比如函数组件中使用useDidShow或者类组件中的componentDidShow,以及如何正确使用onTabItemTap。同时,提醒用户注意在switchTab后的页面生命周期执行顺序,比如onShow和onTabItemTap的触发时机可能不同。</think>在Taro小程序中,触发TabBar点击事件可以通过以下步骤实现: --- ### 一、基础概念 Taro的TabBar点击事件分为两种场景: 1. **用户主动点击TabBar**:自动触发页面切换和关联事件 2. **编程式触发点击**:通过API模拟TabBar点击行为 --- ### 二、监听TabBar点击事件 #### 方式1:使用页面生命周期 在**具体页面**的JS/TS文件中,通过`onTabItemTap`生命周期监听: ```javascript // 类组件写法 class Index extends Component { onTabItemTap(item) { console.log('被点击的Tab索引:', item.index) console.log('Tab页面路径:', item.pagePath) console.log('Tab显示文本:', item.text) } } // 函数组件写法 function Index() { useDidShow(() => { // 需要结合路由判断当前是否为目标Tab页 }) } ``` #### 方式2:全局事件监听(需要结合自定义状态管理) 适用于需要跨页面响应的场景: ```javascript // 在app.ts中 Taro.eventCenter.on('CUSTOM_TAB_CLICK', (index) => { console.log('Tab被点击:', index) }) ``` --- ### 三、主动触发TabBar点击 #### 方法1:通过路由API ```javascript // 切换到指定Tab页(会触发对应生命周期) Taro.switchTab({ url: '/pages/index/index' // 需在app.config.ts的tabBar.list中声明 }) ``` #### 方法2:模拟点击效果 ```javascript // 获取TabBar实例 const tabbar = Taro.getTabBar?.(this.$scope) if (tabbar) { // 编程式触发点击(需确保当前页面是Tab页) tabbar.onTabItemTap({ index: 0, // 要切换的Tab索引 pagePath: '/pages/index/index', text: '首页' }) } ``` --- ### 四、注意事项 1. **配置要求**: ```javascript // app.config.ts中必须正确定义tabBar export default { tabBar: { list: [{ pagePath: '/pages/index/index', text: '首页' }] } } ``` 2. **平台差异**: - 微信小程序:完整支持所有API - H5环境:`switchTab`实际使用history API实现 - React Native:需要自定义TabBar组件 3. **常见问题**: - 在非Tab页调用`getTabBar`会返回`null` - `onTabItemTap`仅在用户点击触发,编程切换不会触发 --- ### 五、典型应用场景 1. **红点通知**:结合全局状态更新徽标 2. **数据预加载**:切换Tab时预加载新数据 3. **权限控制**:点击未登录Tab时跳转登录页 需要根据具体需求选择监听方式或主动触发方式。建议优先使用官方生命周期API保持代码规范性。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kaiqisan

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值