uni-app input事件穿透问题

发布于 1周前 作者 yuanlaile 来自 Uni-App

uni-app input事件穿透问题

开发环境 版本号 项目创建方式
Windows win10 CLI

测试过的手机:

  • iphone 11

示例代码:

稍候我将上传demo

操作步骤:

稍候我将上传demo

预期结果:

正常的事件冒泡

实际结果:

无法冒泡

bug描述:

input上的click事件在安卓上无法穿透到下层view,而ios和其它平台可以。[目前的所有cli版本号]
3 回复

已上传demo.请进入页面后,点击bug5,页面中


已反馈给相关人员排查,已加分,感谢您的反馈!

uni-app 中,input 组件的事件穿透问题通常指的是在嵌套结构中,事件从子组件传递到父组件,导致不期望的行为。以下是一些常见的解决方案和技巧来处理这个问题。

1. 使用 stop 修饰符

你可以使用 @input.stop 来阻止事件冒泡。这样,input 事件就不会继续向上传递到父组件。

<template>
  <view>
    <input @input.stop="handleInput" />
  </view>
</template>

<script>
export default {
  methods: {
    handleInput(event) {
      console.log('Input value:', event.detail.value);
    }
  }
}
</script>

2. 使用 capture 修饰符

如果你希望在事件捕获阶段处理 input 事件,而不是冒泡阶段,可以使用 @input.capture

<template>
  <view>
    <input @input.capture="handleInput" />
  </view>
</template>

<script>
export default {
  methods: {
    handleInput(event) {
      console.log('Input value:', event.detail.value);
    }
  }
}
</script>

3. 手动阻止事件冒泡

在事件处理函数中,你可以手动调用 event.stopPropagation() 来阻止事件冒泡。

<template>
  <view>
    <input @input="handleInput" />
  </view>
</template>

<script>
export default {
  methods: {
    handleInput(event) {
      event.stopPropagation();
      console.log('Input value:', event.detail.value);
    }
  }
}
</script>

4. 使用 v-model 双向绑定

如果你只是想获取输入框的值,而不是处理事件冒泡问题,可以考虑使用 v-model 进行双向绑定。

<template>
  <view>
    <input v-model="inputValue" />
  </view>
</template>

<script>
export default {
  data() {
    return {
      inputValue: ''
    }
  }
}
</script>

5. 检查父组件的监听器

如果你发现事件穿透问题是由于父组件也监听了 input 事件,可以考虑在父组件中移除或修改事件监听器。

6. 使用 native 修饰符

如果你在自定义组件中使用 input 事件,可能需要使用 @input.native 来监听原生事件。

<template>
  <custom-input @input.native="handleInput" />
</template>

<script>
export default {
  methods: {
    handleInput(event) {
      console.log('Input value:', event.detail.value);
    }
  }
}
</script>

7. 使用 uni.$emituni.$on 进行事件通信

如果事件穿透问题是由于组件之间的复杂嵌套关系导致的,可以考虑使用 uni.$emituni.$on 来进行跨组件的事件通信。

// 子组件
export default {
  methods: {
    handleInput(event) {
      uni.$emit('inputEvent', event.detail.value);
    }
  }
}

// 父组件
export default {
  created() {
    uni.$on('inputEvent', this.handleInputEvent);
  },
  methods: {
    handleInputEvent(value) {
      console.log('Input value:', value);
    }
  },
  beforeDestroy() {
    uni.$off('inputEvent', this.handleInputEvent);
  }
}

8. 使用 event.targetevent.currentTarget

在事件处理函数中,确保你正确使用了 event.targetevent.currentTarget 来获取事件源,避免误操作。

9. 检查样式和布局

有时候事件穿透问题可能是由于样式或布局问题导致的,比如 z-indexpointer-events 属性的设置。确保你的布局和样式不会导致事件意外传播。

10. 使用 uni-app 提供的 onInput 事件

uni-appinput 组件提供了 onInput 事件,你可以直接使用它来处理输入事件。

<template>
  <view>
    <input onInput="handleInput" />
  </view>
</template>

<script>
export default {
  methods: {
    handleInput(event) {
      console.log('Input value:', event.detail.value);
    }
  }
}
</script>
回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!