【问题标题】:Setting focus of an input element in vue.js在 vue.js 中设置输入元素的焦点
【发布时间】:2016-01-22 08:06:36
【问题描述】:

我正在尝试在 Vue.js 中设置输入元素的焦点。我在网上找到了一些帮助,但没有一个对我有用。

这是我的代码:

<template>
    <form method="post" action="" v-on:submit.prevent="search">
        <input type="text" placeholder="Person name" required v-model="name" v-el="nameInput" />
        <input type="text" placeholder="Company" required v-model="company" v-el="domainInput" />
        <input type="submit" value="Search" class="btn show-m" />
    </form>
</template>

<script>
export default {
    data () {
        return {
            contacts: [],
            name: null,
            company: null
        }
    },
    ready: {
        // I tried the following :
        this.$$.nameInput.focus();
        this.$els.nameInput.focus();
        // None of them worked !
    }
    methods: {
        search: function (event) {
            // ...

            // I also would like to give the focus here, once the form has been submitted.
            // And here also, this.$$ and this.$els doesn't work
        },
    }
}
</script>

我尝试了this.$$.nameInput.focus();this.$els.nameInput.focus(); 来寻找我可以在网上找到的目标,但this.$$ 未定义,this.$els 为空。

如果有帮助,我正在使用 vue.js v1.0.15

感谢您的帮助。

【问题讨论】:

标签: javascript vue.js


【解决方案1】:

在 vue 2.x 中,您可以使用 directive 解决它。

Vue.directive('focus', {
    inserted: function (el) {
        el.focus()
    }
})

然后您可以在输入和其他元素上使用v-focus 属性:

<input v-focus>

【讨论】:

  • 它确实有效。但是我不得不使用inserted: function (el) { el.__vue__.focus() } 可能是因为我使用vue element-ui。
  • 我如何通过方法做到这一点??
【解决方案2】:

另一个使用 Vue 2.x 和 ref 的解决方案。

您可以使用ref/$refs 属性来定位您的输入并将其聚焦。

在示例中,使用了一个简单的方法,该方法可以使用提供给输入的 ref 属性来定位输入。 然后访问实例上的 $refs 属性以获取对 DOM 元素的引用。

<script>
export default {
    // ...
  mounted: function () {
    this.focusInput('nameInput');
  },
  methods: {
    // This is the method that focuses the element
    focusInput: function ( inputRef ) {
      // $refs is an object that holds the DOM references to your inputs
      this.$refs[inputRef].focus();
    },

    search: function (event) {
      this.focusInput('domainInput');
    },
  }
}
</script>
<template>
  <form method="post" action="" v-on:submit.prevent="search">
    <input type="text" placeholder="Person name" required v-model="name" ref="nameInput" />
    <input type="text" placeholder="Company" required v-model="company" ref="domainInput" />
    <input type="submit" value="Search" class="btn show-m" />
  </form>
</template>

此解决方案最适合一次性情况或可重用组件。对于更全局的方法,指令是要走的路。

【讨论】:

    【解决方案3】:

    在子元素内设置焦点

    (对于那些像我一样挣扎了几个小时的人)

    家长:

    <template>
      <div @click="$refs.theComponent.$refs.theInput.focus()">
        <custom-input ref="theComponent"/>
      </div>
    </template>
    

    孩子 (CustomInput.vue):

    <template>
      <input ref="theInput"/>
    </template>
    

    【讨论】:

      【解决方案4】:

      有几个问题。

      首先v-el的定义如下:

      <input v-el:input-element/>
      

      这会将变量转换为代码中的 camelCase。你可以阅读更多关于这个奇怪的功能here

      除此之外,您应该能够通过this.$els.inputElement 访问该变量。请注意,它只会出现在您定义该元素的组件中(或主应用程序本身,如果您在其中定义了它)。

      其次,自动对焦似乎不适用于 Firefox (43.0.4),至少在我的机器上是这样。一切都在 Chrome 上运行良好,并且符合预期。

      【讨论】:

      • 这很奇怪,为什么会这样运行? (如果你有任何想法)。 v-el="XXX" 更符合逻辑吗?
      • 但这行得通,所以你应该得到我接受的答案:) 谢谢
      • This 是对当前功能的基本思考过程。
      【解决方案5】:

      使用ref,我设法像这样将输入集中在mounted上。

      模板:

       <b-form-input  v-model="query" ref="searchInput" ></b-form-input>
      
      

      Javascript:

        mounted(){
          this.$refs.searchInput.$el.focus()
        }
      

      【讨论】:

      • 即使正确,Vue-cli 和 Vue 的默认 linter 也会建议您使用 this.$refs.searchInput.$el.focus() ;)
      • @CyrilN。在对象字段中使用$ 不能在大多数其他语言中使用。所以我时不时地感到困惑。在编辑中修复它。
      【解决方案6】:

      Vue 3.x

      使用自定义指令。

      app.directive('focus', {
          mounted(el) { 
            el.focus() 
          }
      })
      

      这是你如何使用它:

      第 1 步:

      // main.js
      
      import { createApp } from 'vue'
      import App from './App.vue'
      import router from './router'
      
      const app = createApp(App)
      app.use(router)
      
       app.directive('focus', {
           mounted(el) { // When the bound element is inserted into the DOM...
             el.focus() // Focus the element
           }
       })
      
      /* Optional: 
         Add a slight delay if the input does not focus.
      
      app.directive('focus', {
          mounted(el) { // When the bound element is inserted into the DOM...
              setTimeout(() => {
                  el.focus() // Focus the element
              }, 500)
          }
      }) */
      
      await router.isReady()
      app.mount('#app')
      

      然后在你的组件中:

      第 2 步:

      // MyInput.vue
      
      <input v-focus>
      

      Vuedocs

      【讨论】:

        【解决方案7】:

        根据vue 2.x,你也可以在组件本地注册“指令”来获得自动对焦。

        只需在组件中编写指令:

        export default {
          directives: { focus: {
            inserted: function (el) {
            el.focus()
            }
          }
          }
        }
        

        然后在模板中,您可以在任何元素上使用新的 v-focus 属性,如下所示:

        <input type="text" v-focus>
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-06-18
          • 2020-05-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-08-23
          • 2019-05-28
          • 2019-03-13
          相关资源
          最近更新 更多