【问题标题】:How to toggle only THIS element in Vue如何在 Vue 中仅切换此元素
【发布时间】:2020-08-03 04:46:01
【问题描述】:

刚开始使用 Vue,我有一个页面,上面有客户信息(电子邮件、电话、姓名、地址、付款信息……)。可以单击每个元素以显示输入表单以编辑所选数据。这是我对电子邮件元素的标记

<label>Email</label>
<div class="customer-email item editable">
   <div v-if="!edit_data" @click="editData">{{customer.email}}</div>
   <form v-if="edit_data">
      <input v-model="customer.email"></b-input>
      <button @click="saveData">Save</button>
   </form>
</div>

为了实现隐藏数据和显示输入以更新数据的功能,我有以下内容:

data() {
  return {
     edit_data: false,
     customer: {
        name: 'John Doe',
        email: 'johndoe@gmail.com',
     }
  };
},
methods: {
    editData: function () {
       this.edit_data = !this.edit_data;
   },
}

一切都非常简单。但是,如果我有超过 1 个可以编辑的元素,我如何才能让这个功能影响被点击的元素?如果我有这样的标记:

<div>
        <label>Email</label>
        <div class="customer-email item editable">
            <div v-if="!edit_data" @click="editData">{{customer.email}}</div>

            <b-form v-if="edit_data">
                <b-input v-model="customer.email"></b-input>
                <button @click="saveData">Save</button>
            </b-form>
        </div>


        <label>Name</label>
        <div class="customer-name item editable">
            <div v-if="!edit_data" @click="editData">{{customer.name}}</div>

            <form v-if="edit_data">
                <input v-model="customer.email"></b-input>
                <button @click="saveData">Save</button>
            </form>
        </div>
    </div>

当单击一个元素时,它们都会打开,这是有道理的。但这不是我想要的,我只想“打开”被点击的元素。

我知道如何用 jQuery 方式解决这个问题。

$(element).click(function() {
    $(this).sibling(element).show();
    $(this).hide();
});

或类似的东西。

所以我的问题是...... 是否有最佳实践的 Vue 方法来完成这项工作?提前致谢。

【问题讨论】:

  • 一种方法是,如果您可以将所有表单元素放在一个数组 jsfiddle.net/tLbukj1r 中,另一种方法是制作一个组件并使用插槽对其进行自定义。我建议第一种方法。
  • 您可以使用 v-for 循环并通过默认设置为每个元素的布尔属性设置为 false 值,例如 isOpened。然后在您的 clickHandler 中,您可以选择带有索引的元素并将其设置为 true isOpened 属性。

标签: vue.js


【解决方案1】:

您可以在其中创建组件并制作功能:

Vue.component('custom-input', {
  template: '#custom-input',
  props: ['item', 'label'],
  data: function() {
    return {
      value: '',
      edit_data: false,
    }
  },

  methods: {
    editData: function() {
      this.edit_data = !this.edit_data;
    },
    saveData: function() {
      console.log('saved')
    },
  }

});

var vm = new Vue({
  el: '#app',
  data: {
    edit_data: false,
    customer: {
      name: 'John Doe',
      email: 'johndoe@gmail.com',
    },
  },
})
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.6.10/vue.min.js"></script>

<template id="custom-input">
  <div class="customer-email item editable">
    <label>{{label}}</label>
    <div v-if="!edit_data" @click="editData">{{item}}</div>
    <form v-if="edit_data">
      <input v-model="item">
      <button @click="saveData">Save</button>
    </form>
  </div>
</template>


<div id="app">
  <div>
    <custom-input :item="customer.email" :label="'email'"> </custom-input>
    <custom-input :item="customer.name" :label="'Name'"> </custom-input>
  </div>
</div>

【讨论】:

  • 感谢您的回复。我喜欢这种方法,但在使用单文件组件时是否可行?我不需要 el prop 来定位应用程序。页面上唯一的模板已经连接到数据和 'component template' ,就像您创建的一样,将在主模板中可见。希望这是有道理的。并且我们在项目中使用的唯一可重用组件是可用于多个单文件组件的组件。这是我只需要在页面上的东西。
  • 在Single File Components上使用方法是一样的,但是你需要创建一个.vue文件
  • 感谢您的帮助!就像我提到的那样,我是 Vue 的新手。因此,当我将它添加到我的 SFC 时,我将您的 Vue.component sn-p 添加到我的导出默认 {} 上方,所以首先在我的脚本标签中并在我的终端中收到错误“'Vue' is not defined (no-undef)” .
  • &lt;script&gt; Vue.componet('custom-input.....}; export default { data() {...} &lt;/script&gt; 我的代码的粗略示例。
  • 当您使用 SFC 时,您必须创建一个文件,然后将其导入您的页面。见:es.vuejs.org/v2/guide/single-file-components.html
猜你喜欢
  • 2017-10-20
  • 2022-06-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-23
  • 2017-04-14
  • 2021-01-19
  • 1970-01-01
相关资源
最近更新 更多