大家好,
關於限制delete鍵只能發送一次,
我有兩個架構方式,想請教哪個比較好?
或者有哪種更好的寫法?
首先先做個假資料
<head>
<style>
.theBtn {
margin: 0 5px;
}
</style>
</head>
<body>
<div id="myDiv"></div>
<script>
const myDiv = document.querySelector('#myDiv')
//假資料data
const data = (function () {
let result = []
for (let index = 0; index < 30; index++) {
result.push(index)
}
return result
}())
</script>
</body>
【方法一】 所有的delete鍵,都共用同一個變數isClicked
優點:當delete鍵有上百個以上時,可以省下不少記憶體空間,且比較不會有bug。
缺點:當刪除A時,必須等收到A的response後,才能刪除B。使用者體驗較差。
const theBtn = (id, isClicked = false) => {
return function () {
if (!isClicked) {
isClicked = true
//用setTimeout代替fetch來測試
setTimeout(() => {
isClicked = false
console.log('response', id);
}, 2000)
}
}
}
for (let index = 0; index < data.length; index++) {
let button = document.createElement('button')
button.id = index
button.innerText = '我是' + index
button.classList = 'theBtn'
button.onclick = theBtn(index)
myDiv.append(button)
}
【方法二】 所有的delete鍵,都有各自的變數isClicked
優點:不必等A的response,就能刪除B。使用者體驗較佳。
缺點:會占用較多的記憶體空間去存放變數isClicked,且可能會有bug(當A刪除失敗時,可能會影響B鍵刪除的正確性)
for (let index = 0; index < 10; index++) {
let button = document.createElement('button')
button.id = index
button.innerText = '我是' + index
button.classList = 'theBtn'
button.onclick = (function (isClicked) {
return function () {
if (!isClicked) {
isClicked = true
setTimeout(() => {
isClicked = false
console.log('response', index);
}, 2000)
}
}
}(false))
myDiv.append(button)
}
不曉得哪種架構會比較好?
另外我將這兩種架構,用vue去寫。
覺得自己寫得很繁瑣,想請教能否再精簡寫法?
<template>
<div>
<button v-for="(id, index) in data" :key="'data' + index"
@click="theBtn(id)">我是{{ index }}</button>
</div>
</template>
【法一】
<script setup>
const theBtn = (function (isClicked) {
return function (id) {
if (!isClicked) {
isClicked = true
setTimeout(() => {
isClicked = false
console.log('response', id);
}, 2000)
}
}
}(false))
</script>
【法二】(覺得很繁瑣)
因為vue的@click是綁定同一個theBtn,
所以只好先將所有的isClicked,都存在同一個陣列isClicked_array裡
<script setup>
const theBtn = (function (array) {
let isClicked_array = array.map(e=>false)
return function (id) {
if (!isClicked_array[id]) {
isClicked_array[id] = true
setTimeout(() => {
isClicked_array[id] = false
console.log('response', id);
}, 2000)
}
}
}(data))
</script>
<script setup>
import { ref } from 'vue'
const items = ref([{'id':1, "name":"aaa"}, {'id':2, "name":"bbb"}])
const delthis = async (item)=>{
const copyedItem = JSON.parse(JSON.stringify(item))
item.disabled = true
// 傳送到後端,如果操作成功就直接從items刪掉,假設回傳的是刪除的id
// 失敗就恢復disabled的狀態
// send(copyedItem).then((res)=>{
// const index = items.findIndex((item)=>item.id==res.id)
// items.splice(index, 1)
// }).catch((e)=>{
// const item = items.find((item)=>item.id==res.id)
// delete item.disabled
// console.log(e)
// })
}
</script>
<template>
<div v-for="item in items" :key="item.id">
<span :data-id="item.id">{{item.name}}</span>
<button @click="delthis(item)" :disabled="item.disabled">del</button>
</div>
</template>