html+vue+elementplus实现待办事项的持久化存储

实现功能:导入vue和elementplus的在线cdn构建单页面html文件,实现待办事项的增删以及持久化存储

实现代码:

todolist.html

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>待办任务列表</title>
    <script src="https://unpkg.com/vue@next"></script>
    <link rel="stylesheet" href="https://unpkg.com/element-plus/dist/index.css" />
    <script src="https://unpkg.com/element-plus"></script>
    <script src="//unpkg.com/@element-plus/icons-vue"></script>
    <script src="storage.js"></script>
    <style>
        .el-table .display-row {
            display: none;
        }

        /* .el-table:deep(.el-table__header) col[name=gutter] {
            display: table-cell !important;
        } */
    </style>
</head>

<body>
    <div id="Application">
        <!-- 输入框元素,用来新建待办任务 -->
        <el-form @submit.prevent="addTask" :inline="true" :style="styleForm">
            <el-form-item label="">
                <el-input v-model="taskText" class="w-50 m-2" placeholder="请输入任务..." autofocus="true"
                    @keydown="keyclick($event)" style="width:320px" />
            </el-form-item>
            <el-form-item>
                <el-button type="primary" @click="addTask">新建任务</el-button>
            </el-form-item>
        </el-form>
        <template v-if="todos.length != 0">
            <h2>待完成</h2>
            <!-- :row-class-name="tableClass" -->
            <el-table :data="todos" style="width: 100%;" ref="multipleTableRef" align="center"
                @selection-change="handleSelectionChange" :table-layout="auto" :row-class-name="tableClass"
                :header-cell-style="{'background':'#eef1f6','color':'#606266','text-align': 'center'}"
                :cell-style="{'text-align':'center'}">
                <el-table-column type="index" width="50">

                </el-table-column>
                <el-table-column type="selection" width="100">

                </el-table-column>
                <el-table-column prop="taskText" label="待办任务" width="240">
                </el-table-column>
                <el-table-column label="完成状态" width="120">
                    <template #default="scope">
                        <input type="checkbox" v-model='scope.row.checked' @change="savetodos(scope.row.checked)" v-if="!scope.row.checked"/>
                    </template>
                </el-table-column>
                <el-table-column prop="reMove" label="功能操作" width="160">
                    <el-button @click="remove(index)">删除</el-button>
                </el-table-column>
            </el-table>
            <h2>已完成</h2>
            <ol>
                <template v-for="(item,key) in  todos">
                    <li v-if='item.checked'>
                        <input type="checkbox" v-model='item.checked' @change="savetodos(item.checked)" />
                        {{item.taskText}}
                    </li>
                </template>
            </ol>
        </template>

    </div>
    <script>
        const App = {
            data() {
                return {
                    // 待办任务列表数据
                    todos: [],
                    // 当前输入的待办任务
                    taskText: "",
                    checked: '',
                    // 选中数组
                    titleList: [],
                    //选中的记录数量
                    selectedNum: 0,
                }
            },
            computed: {
                styleForm: {
                    get() {
                        return `width:1000px;margin:40px auto;text-align:center;cursor: pointer;`
                    }
                },
                headerStyle: {
                    get() {
                        return ``
                    }
                }
            },
            methods: {
                // 添加一条待办任务
                addTask() {
                    // 判断下输入框是否为空
                    if (this.taskText.length == 0) {
                        this.$message.warning('请输入任务...')
                        // alert("hh")
                        return
                    }
                    this.todos.push({ taskText: this.taskText, checked: false, reMove: '删除' })
                    this.taskText = ""
                    storage.set('todos', this.todos);
                },
                // 删除一条待办任务
                remove(index) {
                    this.todos.splice(index, 1)
                    storage.set('todos', this.todos);
                },
                keyclick(e) {
                    console.log(e);
                    if (e.keyCode == 13) {
                        this.todos.push({ taskText: this.taskText, checked: false, reMove: '删除' })
                        storage.set('todos', this.todos);
                    }
                },
                savetodos(checked) {
                    storage.set('todos', this.todos);
                    console.log(checked)
                },
                tableClass({ row, rowIndex }) {
                    if (row.checked) {
                        return 'display-row';
                    }
                    return '';
                },
                // 多选框选中数据
                handleSelectionChange(selection) {
                    //获取所有选中项的某属性的值
                    this.titleList = selection.map(item => item.checked)
                    //获取所有选中项数组的长度
                    this.selectedNum = selection.length
                    console.log(this.titleList,this.selectedNum)
                },
            },
            mounted() {
                /*生命周期函数,vue页面刷新就会触发的方法,获取缓存数据*/
                var todos = storage.get('todos');
                if (todos) {
                    this.todos = todos;
                }            }
        }
        Vue.createApp(App).use(ElementPlus).mount("#Application") 
    </script>
</body>

</html>
<!-- vue+elementplus实现待办事项的持久化存储 -->

storage.js

var storage={
    set(key,value){
        localStorage.setItem(key,JSON.stringify(value));

    },
    get(key){
        return JSON.parse(localStorage.getItem(key));

    },
    remove(key){
        localStorage.removeItem(key);
    }
}

效果预览:

 存在问题:

1.el-table导入数据与v-for循环的数据方式不同,el-table中某一行属性判断无法直接隐藏和显示整行,因为el-table常规对列操作。需要借助:row-class-name="tableClass" 通过css样式进行隐藏和显示,v-for则可以。

<template v-for="(item,key) in  list">
    //这里可以直接通过判断隐藏还是显示li元素
   <li v-if='!item.checked'>
      <input type="checkbox" v-model='item.checked' @change="savelist()" />{{item.title}}
      <button @click="deldata(key)">删除</button>
   </li>
</template>

2.使用filter()可以过滤不符条件的数组内容,但在本例中缺乏合适的判断条件

3.所以优化方向是不使用el-table,直接使用table或者v-for

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

高中不复,大学纷飞

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值