vue.js put focus on input

前端 未结 5 1191
野趣味
野趣味 2021-01-07 22:58

HTML


  {{ node.title }}

&         


        
相关标签:
5条回答
  • 2021-01-07 23:33

    It's work for me when we validate the form and want to set dynamically focus on each field

               this.$validator.validateAll("FORM_NAME").then(valid => {
    
                    var errors = this.$validator.errors;
    
                    if (valid) {
                        console.log('All Fields are valid')
                    } else {
                        const errorFieldName = this.$validator.errors.items[0].field;
                        console.log(errorFieldName);
                        this.$refs[errorFieldName].focus();
                    }
    
                });
    
    0 讨论(0)
  • 2021-01-07 23:40

    if you want to set focus after click on something and show input text box with set focus with vue js

    directives: {
      focus: {
        // directive definition
        inserted: function (el) {
          el.focus()
        }
      }
    }
    

    and use custom directive for it. In case you need it should work on click then set with click

    directives: {
      click: {
        // directive definition
        inserted: function (el) {
          el.focus()
        }
      }
    }
    

    and use it

    <input v-focus> or <input v-click>
    
    enter code here
    
    0 讨论(0)
  • 2021-01-07 23:44

    The autofocus attribute is your friend:

    <input type="text" autofocus />
    
    0 讨论(0)
  • 2021-01-07 23:49

    The way you use this.$nextTick(); is incorrect. You should pass it a callback function.

    this.$nextTick(function () {
        this.$refs["input_" + id].focus()
    })
    

    https://jsfiddle.net/un65e9oc/7/


    I'm not however sure how that array access is working for you, because as I notice, $refs is an object with the keys referring to the ref name.

    [Edit: Thanks to @Phil's comment, above is clear.]


    The above is the correct solution for your problem. Since you have already got that answer, I'll add something other than that.

    The reason why you see this behavior is that because the reference you hold in $refs doesn't get updated when you change the visibility of the text box in your showInput() method. So when you call this.$refs["input_" + id].focus();, it's actually trying to set focus on a hidden element (because the current reference is not updated).

    That's why you need to call the $nextTick() to update it. But if you wanted a quick fix to your problem, without calling $nextTick(), you could update it manually like this:

    this.displayTitleInput = "inline-block"
    this.$refs["input_" + id].style.display = this.displayTitleInput
    
    this.$refs["input_" + id].focus();
    

    This would also work :) Hope it helps!!

    0 讨论(0)
  • 2021-01-07 23:51

    Your primary problem is that $nextTick takes a callback function but you are executing

    this.$refs["input_" + id][0].focus()
    

    immediately. You could get your code working correctly with

    this.$nextTick(() => {
      this.$refs["input_" + id][0].focus()
    })
    

    However, I think you'll run in to further problems and your code can be made much simpler.

    One problem you'll find is that all your node inputs will become visible when double-clicking on any of them due to your style rules.

    You could instead store an "editing" flag somewhere either on the node or in a separate object.

    Below is an example that simplifies your code by...

    1. Using the array-like nature of ref when used within a v-for loop, and
    2. Using the enter modifier on your @keydown event binding

    new Vue({
      el: '#app',
      data: {
        list: [
          {id: 1, title: 'Node #1'},
          {id: 2, title: 'Node #2'}
        ],
        editing: {}
      },
      methods: {
        showInput(id, index) {
          this.$set(this.editing, id, true)
          
          this.$nextTick(() => {
            this.$refs.input[index].focus()
          })
        },
        hideInput(id) {
          this.editing[id] = false
        }
      }
    })
    <script src="https://cdn.jsdelivr.net/npm/vue"></script>
    <ul id="app">
      <li v-for="(node, index) in list">
        <span v-show="!editing[node.id]" @dblclick="showInput(node.id, index)">
          {{ node.title }}
        </span>
        <input v-show="editing[node.id]" type="text"
               ref="input" :value="node.title"
               @blur="hideInput(node.id)" @keydown.enter="hideInput(node.id)">
      </li>
    </ul>

    0 讨论(0)
提交回复
热议问题