uni-app 求能用的setFocus组件

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

uni-app 求能用的setFocus组件

求uniapp能用的setFocus的组件,uniapp不支持ref选取dom,没办法在流程中自动跳转input焦点

1 回复

在uni-app中,setFocus 并不是一个内置的组件或方法,但你可以通过自定义组件和调用原生方法来实现类似的功能。通常,setFocus 的目的是让某个输入框(或其他可聚焦元素)获得焦点。在uni-app中,这可以通过操作DOM元素和调用原生API来实现。

以下是一个简单的示例,展示如何在uni-app中创建一个自定义组件,并在页面加载时让输入框自动获得焦点。

自定义组件:MyInput.vue

<template>
  <view>
    <input ref="myInput" :placeholder="placeholder" />
  </view>
</template>

<script>
export default {
  name: 'MyInput',
  props: {
    placeholder: {
      type: String,
      default: '请输入内容'
    }
  },
  mounted() {
    this.$nextTick(() => {
      this.focusInput();
    });
  },
  methods: {
    focusInput() {
      // #ifdef H5
      this.$refs.myInput.focus();
      // #endif
      
      // #ifdef APP-PLUS || MP-WEIXIN || MP-ALIPAY || MP-TOUTIAO || MP-BAIDU || MP-QQ
      uni.createSelectorQuery().select('#myInput').boundingClientRect(rect => {
        rect.id === this.$refs.myInput.id && uni.pageScrollTo({
          scrollTop: 0,
          duration: 0
        });
        setTimeout(() => {
          const context = uni.createSelectorQuery().in(this);
          context.select('#myInput').node().exec((res) => {
            res[0].node.focus();
          });
        }, 100); // 延时确保页面渲染完成
      }).exec();
      // #endif
    }
  }
};
</script>

<style scoped>
input {
  width: 100%;
  padding: 10px;
  box-sizing: border-box;
}
</style>

使用自定义组件:index.vue

<template>
  <view>
    <MyInput placeholder="自动聚焦的输入框" />
  </view>
</template>

<script>
import MyInput from '@/components/MyInput.vue';

export default {
  components: {
    MyInput
  }
};
</script>

注意事项

  1. 平台差异:上述代码考虑了H5和多个小程序平台(APP-PLUS、MP-WEIXIN等)。不同平台对DOM操作和焦点管理的支持有所不同,因此需要根据平台条件进行适配。
  2. 延时处理:在小程序中,由于页面渲染和DOM更新的异步性,使用setTimeout来确保焦点设置操作在页面渲染完成后执行。
  3. 选择器:使用uni.createSelectorQuery来选择DOM元素,这是uni-app推荐的方式,以确保跨平台兼容性。

这个示例展示了如何在uni-app中实现类似setFocus的功能,通过自定义组件和原生API调用,实现了自动聚焦输入框的效果。

回到顶部