简易版增删改查

目录结构

input.vue

javascript 复制代码
<template>
    <div>
        <input v-model="inputValue" @keyup.enter="handleSubmit" placeholder="请输入待办事项" />
        <button @click="handleSubmit" @keyup.entry>添加</button>
    </div>
</template>

<script setup lang="ts">
import { ref } from 'vue'

const inputValue = ref('')

const emit = defineEmits(['add-todo'])

const handleSubmit = () => {
    console.log('内容:', inputValue.value);

    if (inputValue.value.trim()) {
        emit('add-todo', inputValue.value.trim())
        inputValue.value = ''
    }
}
</script>

<style lang="less" scoped></style>

home.vue

javascript 复制代码
<template>
    <div>
        <Input @add-todo="addTodo"></Input>
        <el-table :data="paginatedTodos" style="width: 100%" @selection-change="handleSelectionChange">
            <el-table-column type="selection" width="55" />
            <el-table-column prop="id" label="ID" width="180" />
            <el-table-column label="待办事项">
                <template #default="{row}">
                    <span :class="{ 'red strikethrough': selectedRows.includes(row) }" v-if="!row.editing">{{ row.content }}</span>
                    <el-input 
                        v-else 
                        v-model="row.editContent" 
                        @keyup.enter="saveEdit(row)"
                        @blur="saveEdit(row)"
                        ref="editInput"
                    />
                </template>
            </el-table-column>
            <el-table-column label="操作" #default="{row}">
                <el-button v-if="!row.editing" @click="startEdit(row)">修改</el-button>
                <el-button v-else @click="saveEdit(row)" type="success">保存</el-button>
                <el-button @click="del(row)">删除</el-button>
            </el-table-column>
        </el-table>
        <el-pagination
            v-model:current-page="currentPage"
            v-model:page-size="pageSize"
            :page-sizes="[10, 20, 50, 100]"
            :total="todos.length"
            layout="total, sizes, prev, pager, next, jumper"
            @size-change="handleSizeChange"
            @current-change="handleCurrentChange"
        />
    </div>
</template>

<script setup lang="ts">
import { ref, computed } from 'vue'
import Input from '../components/Input.vue'

interface Todo {
  id: number
  content: string
  editing?: boolean
  editContent?: string
}

const todos = ref<Todo[]>([])
const selectedRows = ref<Todo[]>([])
const currentPage = ref(1)
const pageSize = ref(10)

// 计算分页后的数据
const paginatedTodos = computed(() => {
  const start = (currentPage.value - 1) * pageSize.value
  const end = start + pageSize.value
  return todos.value.slice(start, end)
})

const addTodo = (content: string) => {
  todos.value.push({
    id: Date.now(),
    content,
  })
}

const del = (row: Todo) => {
  console.log('删除的:', row)
  // 删除点击行数据
  todos.value = todos.value.filter(item => item.id !== row.id)
  console.log('删除后的:', todos.value)
}

// 开始编辑
const startEdit = (row: Todo) => {
  row.editing = true
  row.editContent = row.content
}

// 保存编辑
const saveEdit = (row: Todo) => {
  if (row.editContent && row.editContent.trim() !== '') {
    row.content = row.editContent
  }
  row.editing = false
  row.editContent = ''
}

// 处理表格行选择变化
const handleSelectionChange = (selection: Todo[]) => {
  selectedRows.value = selection
}

// 处理页面大小变化
const handleSizeChange = (val: number) => {
  pageSize.value = val
  currentPage.value = 1
}

// 处理当前页变化
const handleCurrentChange = (val: number) => {
  currentPage.value = val
}
</script>

<style scoped>
.red {
  color: red;
}

.strikethrough {
  text-decoration: line-through;
}
</style>
相关推荐
无聊的老谢几秒前
Vue 3 + Leaflet 实现高性能 Web GIS 基站监控平台
前端·javascript·vue.js
之歆2 分钟前
Day23_Bootstrap 前端框架完全指南:从栅格系统到组件化开发
开发语言·前端·javascript·前端框架·bootstrap·ecmascript·less
前端 贾公子2 分钟前
3.响应式系统基础:从发布订阅模式的角度理解 Vue2 的数据响应式原理(上)
前端·javascript·vue.js
2501_940041746 分钟前
纯前端高阶实战:涵盖3D、音频可视化与复杂交互的开发命题
前端
AIFQuant6 分钟前
外汇交易平台技术栈深度解析:行情 API、清算、风控、前端一体化方案
前端·python·websocket·金融·restful
NiceCloud喜云8 小时前
Opus 4.8 的 Effort Control 怎么选:Low 到 Max 五档策略
android·java·大数据·前端·c++·python·spring
wordbaby9 小时前
React Native + RNOH:跨页面数据回传的最佳实践与避坑指南
前端·react native
丷丩9 小时前
MapLibre GL JS第22课:查看本地GeoJSON
前端·javascript·map·mapbox·maplibre gl js
czy87874759 小时前
vscode编译make命令要修改stm32cubemx生成的STM32F103XX_FLASH.ld文件
ide·vscode·stm32
Front思10 小时前
AI前端工程师需要具备能力+
前端·人工智能·ai