我试图在我的vue组件中重新创建this exact个内联编辑功能.然而,我可能是错的,我看到一些语法是过时的Vue,尤其是正在使用的v-el指令.我试图更新语法,如下所示:

new Vue({
  el: '#app',
  data: {
    numbers: [{
        val: 'one',
        edit: false
      },
      {
        val: 'two',
        edit: false
      },
      {
        val: 'three',
        edit: false
      }
    ]
  },

  methods: {
    toggleEdit: function(ev, number) {
      number.edit = !number.edit

      // Focus input field
      if (number.edit) {
        Vue.nextTick(function() {
          ev.$refs.input.focus(); // error occurs here
        })
      }
    },

    saveEdit: function(ev, number) {
      //save your changes
      this.toggleEdit(ev, number);
    }
  }
})
<div id="app">
  <template v-for="number in numbers">
        <span v-show="!number.edit"
              v-on:click="toggleEdit(this, number)">{{number.val}}</span>

        <input type="text"
               ref="input"
               v-model="number.val"
               v-show="number.edit"
               v-on:blur="saveEdit(ev, number)"> <br>
    </template>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue@2.5.13/dist/vue.js"></script>

但是我有一系列的错误...有没有关于如何正确执行的建议?

Here is the Error:

[Vue warn]:nextTick中的错误:"TypeError:undefined不是对象

推荐答案

Vue改变了很多事情.js 1.x比2.x、 我将 bootstrap 您完成您的片段中所需的更改:

  • v-repeat应该是v-for
  • Replace v-el="input" with ref="input"
    • 由于在v-for中使用ref="input",那么this.$refs.input将是一个元素数组,而不是单个元素.
    • 要访问每个元素,需要一个索引(用于数组),这就是为什么应该在v-for:v-for="(number, index) in numbers"中包含index变量的原因
    • index而不是ev传递给函数,这样你可以在以后使用vm.$refs.input[index].focus();获得<input>

差不多就是这样.更改后,您将获得:

new Vue({
  el: '#app',
  data: {
    numbers: [
        {
            val: 'one',
            edit: false
        },
        {   val: 'two',
            edit: false
        },
        {
            val: 'three',
            edit: false
        }
    ]
  },
  methods: {
    toggleEdit: function(index, number){
        number.edit = !number.edit;

        // Focus input field
        var vm = this;
        if (number.edit){
            Vue.nextTick(function() {
                vm.$refs.input[index].focus();
            })   
        }
    },

    saveEdit: function(index, number){
        //save your changes
        this.toggleEdit(index, number);
    }
  }
})
<script src="https://cdn.jsdelivr.net/npm/vue@2.5.13/dist/vue.js"></script>
<div id="app">
    <template v-for="(number, index) in numbers">
        <span v-show="!number.edit"
              v-on:click="toggleEdit(index, number)">{{number.val}}</span>

        <input type="text"
               ref="input"
               v-model="number.val"
               v-show="number.edit"
               v-on:blur="saveEdit(index, number)"> <br>
    </template>
</div>

Vue.js相关问答推荐

在vuejs中使用表单追加时如何使用布尔值

vuejs3 youtube-plugin YT 未定义控制台错误

将媒体源/流绑定到视频元素 - Vue 3 组合 API

为什么我在 Vue npm run serve 的 localhost 中得到无法获取

有没有办法初始化一个保留初始 HTML 的 Vue 对象

Vuejs 和 Laravel 发布请求 CORS

aspnet core如何在deploy上构建webpack

v-for 内部的组件

Object.assign 没有正确复制

错误:您可能需要额外的加载器来处理这些加载器的结果.

React.js 是否有类似 Vue.js

重新加载发布到 Github 页面的 Vue 网站时出现 404

删除一行后刷新 Bootstrap-Vue 表

Vuetify Jest 未知自定义元素

Vuex 存储数据总是驻留在内存中?

Vue Chart.js - 条形图上的简单点/线

Vue3在按钮单击时以编程方式创建组件实例

Vue Cli 3:定义的输出路径

将 Vue props与默认值合并

如何在 vue 组件中使用 vuex?