【问题标题】:Vue - using refs to focus an element targetVue - 使用 refs 聚焦元素目标
【发布时间】:2018-05-04 17:08:55
【问题描述】:

当 span class="before-click" 被点击时,
我想隐藏它,然后输入 class="after-click" 代替显示。
并且显示的输入标签必须集中在焦点上!
问题是当我尝试使用 $refs.afterClick 访问该 DOM 并为其提供 .focus() 时,出现意外错误表明 .focus() 不是函数。
如何解决这个问题? 谢谢。

var myApp = new Vue({
  el: '#app',
  data: {
    onEdit: false,
    msg: 'Something in here',
  },
  methods: {
    switchAndFocus() {
      if(!this.onEdit) {
       this.onEdit = true;
       this.$refs.afterClick.focus();
      }
    },
  },
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.3/vue.min.js"></script>
<div id="app">
  <span class="before-click" @click="switchAndFocus()" v-show="!onEdit">{{msg}}</span>
  <input type="text" class="after-click" ref="afterClick" :value="msg" v-show="onEdit">
</div>

【问题讨论】:

    标签: javascript dom vue.js focus refs


    【解决方案1】:

    将焦点事件包装在 nextTick 中 - 这将推迟焦点事件,直到 DOM 更新并显示输入。

    https://vuejs.org/v2/api/#Vue-nextTick

    var myApp = new Vue({
      el: '#app',
      data: {
        onEdit: false,
        msg: 'Something in here',
      },
      methods: {
        switchAndFocus() {
          if(!this.onEdit) {
           this.onEdit = true;
           this.$nextTick(function(){
            this.$refs.afterClick.focus();
           });
          }
        },
      },
    });
    <script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.3/vue.min.js"></script>
    <div id="app">
      <span class="before-click" @click="switchAndFocus()" v-show="!onEdit">{{msg}}</span>
      <input type="text" class="after-click" ref="afterClick" :value="msg" v-show="onEdit">
    </div>

    【讨论】:

    • 谢谢!这正是我所需要的,但为什么焦点事件比 DOM 发生得更快?
    • 您在一个尚不存在的元素上调用 .focus()。所以你必须等待 DOM 更新并创建元素。这与 Vue 中的生命周期挂钩有关。通常,如果您遇到数据或渲染问题,是因为对生命周期的误解:vuejs.org/v2/guide/instance.html#Lifecycle-Diagram
    • 哇...那是一堆东西,我会试着理解它。谢谢!
    猜你喜欢
    • 2017-01-03
    • 2021-06-14
    • 2016-07-19
    • 1970-01-01
    • 1970-01-01
    • 2012-02-27
    • 2017-07-16
    • 1970-01-01
    • 2014-04-09
    相关资源
    最近更新 更多