2017-07-22 687 views
1
简单的问题

好了,我建了一个小程序来锻炼一下我目前与VUE教训,但那里有一些事情,我想做的事情,但不知道如何还关于Vue公司和Javascript

<div class="container" id="app"> 
    <div class="row"> 
    <div class="col-xs-6 jumbotron"> 
     <form class="form-horizontal" @submit.prevent> 
     <p> 
      <label>Name</label> 
      <input id="inputName" type="text" class="form-control" v-model="dataToArray.name"> 
     </p> 
     <p> 
      <label>Sex</label> 
      <input type="radio" name="sex" value="male" v-model="dataToArray.sex"> Male 
      <input type="radio" name="sex" value="female" v-model="dataToArray.sex"> Female 
     </p> 
     <p> 
      <label>Select a Color</label> 
      <select id="selectColor" class="form-control" v-model="dataToArray.color"> 
      <option value="red">Red</option> 
      <option value="blue">Blue</option> 
      </select> 
     </p> 
     <p> 
      <button class="btn btn-primary" @click="addToArray()">Add to Array</button> 
     </p> 
     </form> 
    </div> 
    <div class="col-xs-6"> 
     <table id="table" class="table table-bordered" v-if="savedData.length > 0"> 
     <thead> 
      <th>Name</th> 
      <th>Sex</th> 
      <th>Color</th> 
      <th></th> 
     </thead> 
     <tbody id="test"> 
      <tr v-for="(data, index) in savedData" v-if="savedData[index].status"> 
      <td>{{ data.name }}</td> 
      <td>{{ data.sex }}</td> 
      <td>{{ data.color }}</td> 
      <td class="text-center"> 
       <button @click="editThis(index)" class="btn btn-warning">Edit</button> 
       <button @click="saveEdit(index)" class="btn btn-default">Save</button> 
       <button class="btn btn-danger" @click="deleteThis(index)">Delete</button> 
      </td> 
      </tr> 
     </tbody> 
     </table> 
     {{ dataToArray.id }} <br> 
     {{ dataToArray.name }} <br> 
     {{ dataToArray.sex }} <br> 
     {{ dataToArray.color }} <br> 
     {{ savedData }} 
    </div> 
    </div> 
</div> 

new Vue({ 
    el: '#app', 
    data:{ 
    dataToArray: { 
     id: null, 
     name: '', 
     sex: '', 
     color: '', 
     status: true 
    }, 
    savedData: [] 
    }, 
    methods: { 
    addToArray(){ 
     this.dataToArray.id = this.savedData.lenth; 
     this.savedData.push(Object.assign({}, this.dataToArray)); 
    }, 
    deleteThis(index){ 
     this.savedData[index].status = false; 
    }, 
    editThis(index, event){ 
     document.getElementById("inputName").value = this.savedData[index].name; 
     document.getElementById("selectColor").value = this.savedData[index].color; 
     //check the form radio according to the current sex of the object 
    }, 
    saveEdit(index){ 
     this.savedData[index].name = document.getElementById("inputName").value; 
     this.savedData[index].color = document.getElementById("selectColor").value; 
     //this.savedData[index].sex = get the new radio value 
    } 
    } 
}); 

这是应用程序:https://jsfiddle.net/myrgato/10uqa1e1/5/

编辑和保存按钮,我想隐藏编辑按钮,然后向保存按钮被点击编辑按钮时,当周围的保存按钮otherway被点击。

编辑对象的性别价值,我不能得到新的无线电值(选中一个后,我点击编辑,并选择一个新的)

隐藏的表,如果没有行,我能够在第一次通过比较循环数组的大小来做到这一点,但是当我删除行时,我不会从数组中删除对象,我只是改变状态,所以如果将一个对象添加到数组并删除它,该行将消失(仅当status = true时才显示),但表不会(因为即使tho没有行,对象仍然存在于数组内)

有人可以帮助我理解如何实现此目的吗?

编辑:更新的代码与我们这么远:

https://jsfiddle.net/myrgato/rcj3kef7/

正如你所看到的,如果我两个项目添加到表,并编辑之一,所有的行显示的保存按钮,我怎样才能显示我点击的行的保存按钮?

和另外一个,请检查下面的代码:https://jsfiddle.net/myrgato/rcj3kef7/1/

在这其中,我把保存按钮在表外,其形式本身,所以当用户点击一个行编辑,保存按钮和当前值显示在窗体上。

问题是,我将如何得到v-for内的索引来保存我在这个函数之外的东西?

回答

3

你想有一个编辑模式。当您处于编辑模式时,出现保存按钮并且编辑按钮消失;否则,相反。这只是您设置为正在编辑的行的索引的变量,或者在未编辑时为null。

对于复制dataToArraysavedData,Object.assign之间的值很方便。

由于您希望在表空时隐藏表格,并且当没有包含真实status成员的项目时它为空,请创建一个使用find来告诉您是否存在任何此类项目的计算。

new Vue({ 
 
    el: '#app', 
 
    data: { 
 
    dataToArray: { 
 
     id: null, 
 
     name: '', 
 
     sex: '', 
 
     color: '', 
 
     status: true 
 
    }, 
 
    savedData: [], 
 
    editing: false 
 
    }, 
 
    computed: { 
 
    hasVisibleData() { 
 
     return this.savedData.find(d => d.status); 
 
    } 
 
    }, 
 
    methods: { 
 
    addToArray() { 
 
     this.dataToArray.id = this.savedData.lenth; 
 
     this.savedData.push(Object.assign({}, this.dataToArray)); 
 
    }, 
 
    deleteThis(index) { 
 
     this.savedData[index].status = false; 
 
    }, 
 
    editThis(index, event) { 
 
     this.editing = index; 
 
     Object.assign(this.dataToArray, this.savedData[index]); 
 
    }, 
 
    saveEdit(index) { 
 
     this.editing = null; 
 
     Object.assign(this.savedData[index], this.dataToArray); 
 
    } 
 
    } 
 
});
.jumbotron { 
 
    background-color: ; 
 
} 
 

 
label { 
 
    color: ; 
 
}
<link href="//maxcdn.bootstrapcdn.com/font-awesome/4.5.0/css/font-awesome.min.css" rel="stylesheet"/> 
 
<link href="//maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" rel="stylesheet"/> 
 
<script src="//cdnjs.cloudflare.com/ajax/libs/vue/2.3.4/vue.min.js"></script> 
 
<div class="container" id="app"> 
 
    <div class="row"> 
 
    <div class="col-xs-6 jumbotron"> 
 
     <form class="form-horizontal" @submit.prevent> 
 
     <p> 
 
      <label>Name</label> 
 
      <input id="inputName" type="text" class="form-control" v-model="dataToArray.name"> 
 
     </p> 
 
     <p> 
 
      <label>Sex</label> 
 
      <input type="radio" name="sex" value="male" v-model="dataToArray.sex"> Male 
 
      <input type="radio" name="sex" value="female" v-model="dataToArray.sex"> Female 
 
     </p> 
 
     <p> 
 
      <label>Select a Color</label> 
 
      <select id="selectColor" class="form-control" v-model="dataToArray.color"> 
 
      <option value="red">Red</option> 
 
      <option value="blue">Blue</option> 
 
      </select> 
 
     </p> 
 
     <p> 
 
      <button class="btn btn-primary" @click="addToArray()">Add to Array</button> 
 
     </p> 
 
     </form> 
 
    </div> 
 
    <div class="col-xs-6"> 
 
     <table id="table" class="table table-bordered" v-if="hasVisibleData"> 
 
     <thead> 
 
      <th>Name</th> 
 
      <th>Sex</th> 
 
      <th>Color</th> 
 
      <th></th> 
 
     </thead> 
 
     <tbody id="test"> 
 
      <tr v-for="(data, index) in savedData" v-if="savedData[index].status"> 
 
      <td>{{ data.name }}</td> 
 
      <td>{{ data.sex }}</td> 
 
      <td>{{ data.color }}</td> 
 
      <td class="text-center"> 
 
       <button v-if="editing!==index" @click="editThis(index)" class="btn btn-warning">Edit</button> 
 
       <button v-if="editing===index" @click="saveEdit(index)" class="btn btn-default">Save</button> 
 
       <button class="btn btn-danger" @click="deleteThis(index)">Delete</button> 
 
      </td> 
 
      </tr> 
 
     </tbody> 
 
     </table> 
 
     {{ dataToArray.id }} <br> {{ dataToArray.name }} <br> {{ dataToArray.sex }} <br> {{ dataToArray.color }} <br> {{ savedData }} 
 
    </div> 
 
    </div> 
 
</div>

+0

哦,它也很好用,我发现你编写计算属性的方式更容易阅读,但编辑时的标志想法也有同样的问题,它只适用于我只有一个元素的表,如果我有不止一个,所有其他保存按钮将显示!你有任何想法,我会如何让它不? –

+0

抱歉忘记通知 –

+1

糟糕!固定。编辑标志必须指示哪一行正在被编辑。 –

1

你会想要设置一个标志,当一个或另一个被点击的方式,你可以相应地改变两者。

new Vue ({ 
    data: { 
     edit:[] //0 means that neither button is clicked. 
    }, 
    methods:{ 
     editThis(index, event){ 

      this.edit[index] = 1; 

      this.dataToArray.name = this.savedData[index].name; 
      this.dataToArray.color = this.savedData[index].color; 
      this.dataToArray.color = this.saveData[index].sex; 
    }, 
    saveEdit(index){ 

     this.edit[index] = -1 

     this.savedData[index].name = this.dataToArray.name 
     this.savedData[index].color = this.dataToArray.color 
     this.savedData[index].sex = this.dataToArray.sex 
     //since we have bound the dataToArray values with v-model we can modify them from here. 
    }, 
    addToArray(index){ 
     this.dataToArray.id = this.savedData.lenth; 
     this.edit[index] = 0; 
     this.savedData.push(Object.assign({}, this.dataToArray)); 
    }, 
}) 

然后在你的模板中,您希望有一个“V-如果”属性来显示和隐藏基于该标志的值。

<button @click="editThis(index)" v-if="edit[index] && edit[index] > -1" class="btn btn-warning">Edit</button> 
<button @click="saveEdit(index)" v-if='edit[index] && edit[index] < 1' class="btn btn-default">Save</button> 

此外,为了隐藏表时没有数据也必须使用V-如果在表本身。你也可以做一个计算,返回数组中返回一个不等于false的状态的元素数目。

new Vue({ 
    computed:{ 
    elements(){//using the ES6 arrow function syntax and Array.reduce 
     return this.savedData.reduce((accum, iter) => { 
      if(iter.status != false) accum += 1 
     }, 0); 
    } 
    } 
}) 

然后在你的模板,你可以把你的表元素,像这样:

<table id="table" class="table table-bordered" v-if="elements"> 
+1

真棒!计算属性中的查找方法效果很好,但编辑标志的想法只适用于表中有一个项目的情况,如果我有两个或更多项目,并单击编辑,所有其他行将显示保存按钮!如何仅在我单击编辑的行中显示保存按钮? –

+0

对不起,忘记通知 –