[英]Laravel + Vue, best practices
我正在 Laravel 中構建一個簡單的發票系統。 所以很明顯我需要建立一個視圖,當我能夠編輯它時。 這是一個表,我可以在其中動態添加和刪除行。
所以我的想法是:好的,我可以用 jQuery 很容易地做到這一點,但是添加一個具有多個輸入的行,特別是當我使用順風時,這意味着有很多奇怪的類,會很混亂,所以我會嘗試Vue。 我沒有這方面的經驗,但總的來說它看起來很容易。
然后我制作了一個 Vue 組件,其中包含<table>
和<tr>
,其中包含輸入:
<document-items-table:items='@json($document->items)' />
它不是 SPA,所以我不想在里面進行 AJAX 調用,我已經加載了我的文檔,所以我通過一個 vue 道具將文檔項傳遞為 Json。 它工作正常。
接下來是,在每個文檔行中,我添加了刪除一行的刪除按鈕。 我還有一個添加空行的按鈕。
我的組件如下所示:
<template>
<div class="w-full">
<div class="relative flex flex-col min-w-0 break-words w-full rounded bg-white">
<div class="block w-full overflow-x-auto">
<table class="items-center w-full bg-transparent border-collapse pb-4">
<thead>
<tr>
<th style="width: 30px" class="pl-6 pr-2 align-middle border-b border-solid py-3 text-xs uppercase border-l-0 border-r-0 whitespace-nowrap font-semibold text-left bg-blueGray-50 text-blueGray-500 border-blueGray-100">
No.
</th>
<th style="min-width: 600px" class=" align-middle border-b border-solid py-3 text-xs uppercase border-l-0 border-r-0 whitespace-nowrap font-semibold text-left bg-blueGray-50 text-blueGray-500 border-blueGray-100">
Name
</th>
<th style="width: 60px" class="align-middle border-b border-solid py-3 text-xs uppercase border-l-0 border-r-0 whitespace-nowrap font-semibold text-left bg-blueGray-50 text-blueGray-500 border-blueGray-100">
Quantity
</th>
<th style="width: 60px" class="align-middle border-b border-solid py-3 text-xs uppercase border-l-0 border-r-0 whitespace-nowrap font-semibold text-left bg-blueGray-50 text-blueGray-500 border-blueGray-100">
Unit
</th>
<th style="width: 120px" class="align-middle border-b border-solid py-3 text-xs uppercase border-l-0 border-r-0 whitespace-nowrap font-semibold text-left bg-blueGray-50 text-blueGray-500 border-blueGray-100">
Price
</th>
<th style="width: 60px" class="align-middle border-b border-solid py-3 text-xs uppercase border-l-0 border-r-0 whitespace-nowrap font-semibold text-left bg-blueGray-50 text-blueGray-500 border-blueGray-100">
Tax rate
</th>
<th style="width: 60px" class="align-middle border-b border-solid py-3 text-xs uppercase border-l-0 border-r-0 whitespace-nowrap font-semibold text-left bg-blueGray-50 text-blueGray-500 border-blueGray-100">
</th>
</tr>
</thead>
<tbody class="border-b-4 border-white">
<tr v-for="(item, i) in this.itemsLocal" :key="item.id">
<td class="border-t-0 pl-6 align-middle border-l-0 border-r-0 text-xs whitespace-nowrap py-1">
{{ i + 1 }}
</td>
<td class="border-t-0 align-middle border-l-0 border-r-0 text-xs whitespace-nowrap py-1">
<item-input name="title" id="title" :value="item.title" />
</td>
<td class="border-t-0 align-middle border-l-0 border-r-0 text-xs whitespace-nowrap py-1">
<item-input class="w-full" name="quantity" id="quantity" :value="item.quantity" />
</td>
<td class="border-t-0 align-middle border-l-0 border-r-0 text-xs whitespace-nowrap py-1">
<item-input class="w-full" name="unit" id="unit" :value="item.unit" />
</td>
<td class="border-t-0 align-middle border-l-0 border-r-0 text-xs whitespace-nowrap py-1">
<item-input class="w-full" name="price" id="price" :value="item.price / 100" />
</td>
<td class="border-t-0 align-middle border-l-0 border-r-0 text-xs whitespace-nowrap py-1">
<item-input class="w-full" name="tax" id="tax" :value="item.tax_rate" />
</td>
<td class="border-t-0 align-middle border-l-0 border-r-0 text-xs whitespace-nowrap py-1">
<button @click="() => deleteRow(item.id)" class="p-2 px-4 bg-rose-500 text-white rounded"><i class="fas fa-times fa-sm"></i> </button>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<div class="w-full text-center">
<button @click="addRow" class="bg-lightBlue-600 px-4 py-2 text-white rounded text-sm font-bold">Add row</button>
</div>
</div>
</template>
<script>
export default {
props: {
items: Array,
},
mounted() {
},
data () {
return {
itemsLocal: [...this.items],
newRowCount: 1
}
},
methods: {
deleteRow(itemID) {
this.itemsLocal = _.reject(this.itemsLocal, ['id', itemID]);
},
addRow() {
this.itemsLocal.push({
id: -this.newRowCount
})
this.newRowCount++;
}
}
}
</script>
現在我有一些問題要問那些對 Vue 更有經驗的人
props
,並且我需要添加和刪除行,我將我的items
從props
克隆到data
,然后添加和刪除它們。 有沒有更好的解決方案?我盡量讓它干凈。 這不是一個工作項目,而是提高我的技能的事情。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.