2017-07-22 533 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

對不起,忘記通知 –