Todo-List案例版本四

原生JS实现todo-list小项目 原生JS实现todo-list小项目 该项目旨在练习和巩固JS的相应知识点,功能有但不仅限于基本DOM操作,事件触发,数据基本处理等。 功能及界面参考:https://nourabusoud.github.io/vue-todo-list/ 项目地址:https://github.com/Miever1/todo-list-js 基本效果如图: 具体功能实现 数据存储没有用到浏览器... 阅读详情

全局事件总线

使用步骤

1.定义全局事件总线

new Vue({
    ...
    beforeCreated(){
        Vue.prototype.$bus=this    //安装全局事件总线,$bus就是当前应用的vm
    }
    ...
})

2.使用事件总线

a.接收数据:A组件想接收数据,则在A组件中给$bus绑定自定义事件,事件的回调留在A组件自身

export default{
    methods(){
        demo(data){...}
    }
    ...
    mounted(){
        this.$bus.$on('xxx',this.demo)
    }
}

b.提供数据:this.$bus.$emit('xxx',data)

3.最好在beforeDestroy钩子中,用$off()去解绑当前组件所用到的事件

实例

src/main.js

import Vue from 'vue'
import App from './App.vue'

Vue.config.productionTip = false

Vue.prototype.x={a:1,b:2}

//创建vm
new Vue({
    el: '#app',
    render: h => h(App),
    beforeCreate(){
        Vue.prototype.$bus=this
    }
})

src/App.vue

<template>
    <div class="app">
        <h1>{{ msg }}</h1>
        <School/>
        <Student/>
    </div>
</template>

<script>
import Student from './components/Student'
import School from './components/School'

export default {
    name: 'App',
    data() {
        return {
            msg: '你好啊!'
        }
    },
    components: { Student, School }
}
</script>

<style scoped>
.app {
    background-color: gray;
    padding: 5px;
}
</style>

src/components/Student.vue

<template>
    <div class="student">
        <h2>学生姓名:{{ name }}</h2>
        <h2>学生性别:{{ sex }}</h2>
        <button @click="sendStudentName">发送学生名字到学校</button>
    </div>
</template>

<script>
export default {
    name: 'Student',
    data() {
        return {
            name:'张三',
            sex:'男'
        }
    },
    methods:{
        sendStudentName(){
            this.$bus.$emit('hello',this.name)
        }
    }
}
</script>

<style lang="less">
    .student{
        background-color: pink;
        padding: 5px;
        margin-top: 30px;
    }
</style>

src/components/School.vue

<template>
    <div class="school">
        <h2>学校名称:{{ name}}</h2>
        <h2>学校地址:{{ address }}</h2>
    </div>
</template>

<script>
export default {
    name: 'School',
    data() {
        return {
            name:'黑马',
            address:'广州'
        }
    },
    mounted(){
        this.$bus.$on('hello',(data)=>{
            console.log('我是School组件,收到了数据',data);
        })
    },
    beforeDestroy(){
        this.$bus.$off('hello')
    }
}
</script>

<style scoped>
    .school{
        background-color: skyblue;
        padding: 5px;
    }
</style>

以上是对全局事件总线的运用,接下来是案例使用

(161条消息) Todo-List案例版本三_bubbleJessica的博客-CSDN博客

使用全局事件总线完善 

src/main.js

import Vue from 'vue'
import App from './App.vue'

Vue.config.productionTip = false

//创建vm
new Vue({
    el: '#app',
    render: h => h(App),
    beforeCreate(){
        Vue.prototype.$bus=this //安装全局事件总线
    }
})

src/App.vue

<template>
    <div id="root">
        <div class="todo-container">
            <div class="todo-wrap">
                <MyHeader @addToDo="addToDo" />
                <MyList :todos="todos" />
                <MyFooter :todos="todos" @checkAllTodo="checkAllTodo" @clearAllTodo="clearAllTodo" />
            </div>
        </div>
    </div>
</template>

<script>
import MyHeader from './components/MyHeader'
import MyList from './components/MyList'
import MyFooter from './components/MyFooter'

export default {
    name: 'App',
    data() {
        return {
            // 由于todos是MyHeader组件和MyFooter组件都在使用,所以放在App中(状态提升)
            todos: JSON.parse(localStorage.getItem('todos')) || []
        }
    },
    components: { MyHeader, MyList, MyFooter },
    methods: {
        // 添加一个todo
        addToDo(todoObj) {
            this.todos.unshift(todoObj)
        },
        // 勾选or取消勾选一个todo
        checkTodo(id) {
            this.todos.forEach((todo) => {
                if (todo.id === id) todo.done = !todo.done
            })
        },
        // 删除一个todo
        deleteTodo(id) {
            // 注意:filter不改变原数组,只是新建一个数组
            this.todos = this.todos.filter((todo) => {
                return todo.id !== id
            })
        },
        // 全选or取消全选
        checkAllTodo(done) {
            this.todos.forEach((todo) => {
                todo.done = done
            })
        },
        // 清除所有已完成的todo
        clearAllTodo() {
            this.todos = this.todos.filter((todo) => {
                return !todo.done
            })
        }
    },
    watch: {
        // todos简写不包含深度监视
        // todos(value) {
        //     localStorage.setItem('todos', JSON.stringify(value))
        // }

        // todos完整版深度监视
        todos:{
            deep:true,
            handler(value){
                localStorage.setItem('todos', JSON.stringify(value))
            }
        }
    },
    mounted(){
        this.$bus.$on('checkTodo',this.checkTodo)
        this.$bus.$on('deleteTodo',this.deleteTodo)
    },
    beforeDestroy() {
        this.$bus.$off('checkTodo')
        this.$bus.$off('deleteTodo')
    },
}
</script>

<style>
/*base*/
body {
    background: #fff;
}

.btn {
    display: inline-block;
    padding: 4px 12px;
    margin-bottom: 0;
    font-size: 14px;
    line-height: 20px;
    text-align: center;
    vertical-align: middle;
    cursor: pointer;
    box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
    border-radius: 4px;
}

.btn-danger {
    color: #fff;
    background-color: #da4f49;
    border: 1px solid #bd362f;
}

.btn-danger:hover {
    color: #fff;
    background-color: #bd362f;
}

.btn:focus {
    outline: none;
}

.todo-container {
    width: 600px;
    margin: 0 auto;
}

.todo-container .todo-wrap {
    padding: 10px;
    border: 1px solid #ddd;
    border-radius: 5px;
}
</style>

src/components/MyList.vue

<template>
    <ul class="todo-main">
        <MyItem
             v-for="todoObj in todos" 
             :key="todoObj.id" 
             :todo="todoObj" 
        />
    </ul>
</template>

<script>
import MyItem from './MyItem.vue'

export default {
    name: 'MyList',
    props:['todos'],
    components: { MyItem }
}
</script>

<style scoped>
/*main*/
.todo-main {
    margin-left: 0px;
    border: 1px solid #ddd;
    border-radius: 2px;
    padding: 0px;
}

.todo-empty {
    height: 40px;
    line-height: 40px;
    border: 1px solid #ddd;
    border-radius: 2px;
    padding-left: 5px;
    margin-top: 10px;
}
</style>

src/components/MyItem.vue

<template>
    <li>
        <label>
            <input type="checkbox" :checked="todo.done" @change="handleCheck(todo.id)" />
            <!-- 以下代码也能实现功能,但是不太推荐,因为有点违反规则,因为修改了props,只不过vue没有监测到(vue监测到的情况是对象全部被变化 -->
            <!-- <input type="checkbox" v-model="todo.done"/> -->
            <span>{{ todo.title }}</span>
        </label>
        <button class="btn btn-danger" @click="handleDelete(todo.id)">删除</button>
    </li>
</template>

<script>
export default {
    name: 'MyItem',
    //声明接收todo对象
    props: ['todo'],
    methods: {
        handleCheck(id) {
            // 通知App组件将对应的todo对象的done值取反
            // console.log(id);
            // this.checkTodo(id)
            this.$bus.$emit('checkTodo',id)
        },
        handleDelete(id){
            if(confirm('确定删除吗?')){
                // this.deleteTodo(id)
                this.$bus.$emit('deleteTodo',id)
            }
                
        }
    }
}
</script>

<style scoped>
/*item*/
li {
    list-style: none;
    height: 36px;
    line-height: 36px;
    padding: 0 5px;
    border-bottom: 1px solid #ddd;
}

li label {
    float: left;
    cursor: pointer;
}

li label li input {
    vertical-align: middle;
    margin-right: 6px;
    position: relative;
    top: -1px;
}

li button {
    float: right;
    display: none;
    margin-top: 3px;
}

li:before {
    content: initial;
}

li:last-child {
    border-bottom: none;
}

li:hover {
    background-color: #ddd;
}

li:hover button {
    display: block;
}
</style>

YII 初体验 —— 搭建一个简单的 Todo List 系统 Yii 是一个高性能,基于组件的 PHP 框架,用于快速开发现代 Web 应用程序。 今天,我本着体验 Yii2 的想法,准备使用 Yii2 从 0 到 1 来搭建一个 Todo List,并完成以下功能: 可以基于某个 key 创建 Todo Item,然后根据 key 查询对应的 Todo Item。 可以置顶、完成、删除单条 Todo Item,置顶的 Todo Item 将排列在最前面,完成的 Todo Item 将排列在最后面。 初始化 YII 仓库 使用下面的命令即可初始化一个 YII 的仓 阅读详情

相关推荐

TODO LIST案例

文章目录TODO LIST案例TODO LIST 案例介绍准备知识点vue指令html标签浏览器前台数据库相关知识点pushsplice三目运算符代码前期准备模板文件代码具体操作逻辑代码第一代码块第二代码块案例完整代码后记总结注意点以及问题点感想 TODO LIST案例 TODO LIST 案例介绍 这是一个管理自己的需要做事情的一个清单列表,在输入框中写一个(TODO事件)文本内容,点击TODO按钮,输入框内容清空,输入的内容会显示在页面的下方,每一次输入输入框的内容点击后在页面中显示在首增行,当某件事情

medigrat的博客 573

@ant-design/x Bubble详细API文档说明

Ant Design X 中的 Bubble 和 Bubble.List 组件用于构建消息气泡界面。Bubble 组件支持内容、角色、位置、头像等配置,可自定义样式和行为。Bubble.List 用于管理多个气泡,支持自动滚动、角色配置和消息渲染控制。组件通过 roles 配置实现不同角色的统一样式管理,支持对象或函数形式定义角色属性。消息数据格式要求必须包含 content 和 role 字段,可扩展业务字段。该文档提供了核心 API 的详细说明,可直接用于开发参考或 Word 文档生成。

weixin_48163734的博客 746

智能体评测技术与实践:从评估维度到DeepEval实战指南

智能体评测技术与实践:从评估维度到DeepEval实战指南 本文系统探讨了AI智能体的评测体系与实践方法。首先从四个关键维度构建评估框架:基础能力(意图理解、知识完整性)、复杂任务(多轮对话、动态工作流)、可靠性(幻觉抑制、安全合规)以及工具效率(参数填充、多工具协同)。其次分析了主流评测工具,包括xBench的动态双轨评估、DeepEval的全链路监控等解决方案。最后详细介绍了DeepEval的实战应用,涵盖环境配置、测试用例构建、指标配置及CI/CD集成,展示了如何通过代码化评估实现智能体质量的持续提升

Linda的自动化测试之旅 3393

html5 气泡,【HTML5&CSS3进阶学习01】气泡组件的实现

气泡组件在实际工作中非常普遍,无论是网页中还是app中,比如:我们这里所谓气泡组件是指列表型气泡组件,这里就其dom实现,css实现,js实现做一个讨论,***对一些细节点做一些说明,希望对各位有用小钗最近初学CSS,这里做一个专题,便于自身CSS提升,文章有不少问题与可优化点,请各位指导组件分类单由气泡组件来说,他仍然属于“弹出层”类组件,也就是说其会具有这些特性:① 布局为脱离文档流② 可以具...

weixin_39717443的博客 485

CST实战:变容二极管电容曲线提取全流程(附S参数设置技巧)

本文详细介绍了在CST Studio Suite中提取变容二极管电容-电压(C-V)曲线的完整实战流程。重点解析了S参数仿真的核心原理、DCFEED模块的正确配置、参数扫描的设置技巧,并探讨了集成SPICE模型进行精确仿真的方法,帮助射频工程师高效、准确地获取器件关键特性。

weixin_29237635的博客 525

骁龙X Elite笔记本重装Windows 11 Arm64系统完整指南与避坑手册

UEFI安全启动和Arm64架构是理解现代计算设备系统部署的基础。UEFI取代传统BIOS,提供了更安全的启动环境和模块化固件接口,而Arm64架构则以其高能效特性,在移动和新兴PC领域日益重要。其技术价值在于为设备带来更快的启动速度、更强的安全防护以及更优的功耗表现。在应用场景上,这直接关系到搭载高通骁龙X Elite等Arm处理器的笔记本电脑的系统安装与维护。对于这类设备,重装系统远非插入通用安装盘那么简单,核心挑战在于必须使用专为Arm64编译的Windows镜像,并需提前集成芯片组、网络等硬件的专属

weixin_33428613的博客 456

Vue框架Todo-list案例

记录Vue学习的过程——今天是Todo-list案例

qq_55461941的博客 1162

WPS专业版自带字体

WPS专业版其中一个好处就是自带了部分有版权的字体,就算你安装了没买授权,他也会给你在系统里面安装上这些字体,至于没授权继续用合不合规我不知道。但是带来的实实在在的好处就是有些子他支持的全啊。 /usr/share/fonts/wps-office/FZWBK.TTF: 方正魏碑_GBK,FZWeiBei\-S03:style=Regular /usr/share/fonts/wps-office/FZFSK.TTF: 方正仿宋_GBK,FZFangSong\-Z02:style=Regular /us

chenqioulin的博客 5681

Todo-List案例版本二

引入了localStorage,让案例更加完善。

bubbleJessica的博客 1538

从选卡到验证:CST仿真GPU加速全流程实战指南

本文详细介绍了CST仿真中GPU加速的全流程实战指南,从硬件选型到软件配置,再到性能验证和常见问题排查。通过对比专业卡与游戏卡的性能差异,提供硬件选型建议,并分享驱动安装、关键设置及CST软件配置的黄金法则,帮助用户显著提升仿真效率。

weixin_30650039的博客 390

Lammps实现单轴压缩-应力应变曲线以及弹性模量计算

Lammps实现单轴压缩-应力应变曲线以及弹性模量计算

Rockyoung 1万+

Vue2学习day05—Todo-list案例

文章目录Vue2学习day05—— Vue2学习day05—— Todo-list案例

Happy_change的博客 2888

24届数字IC设计/验证秋招总结贴——先看这个

为方便快速进行查找该专栏的内容,将所有内容链接均放在此篇博客中整理不易,欢迎订阅~~

qq_42135020的博客 8395

React Todo List 项目教程

React Todo List 项目教程 项目介绍 React Todo List 是一个基于 React 框架的开源项目,旨在帮助开发者快速构建一个功能齐全的待办事项列表应用。该项目由 WebDevSimplified 开发并维护,适合初学者学习 React 的基础知识和实践。 项目快速启动 1. 克隆项目 首先,从 GitHub 克隆项目到本地: git clone https://githu...

gitblog_00082的博客 1536

微信小程序 - 苹果ios无法播放视频、安卓android手机可以播放,使用video播放MP4视频时安卓正常播放视频iOS无法播放出现黑屏、加载失败或一片黑没反应等(uniapp微信小程序也能解决)

微信小程序ios无法播放视频,微信小程序 video标签 ios不能播放视频或视频黑屏,ios无法播放视频,android手机可以播放,视频格式为mp4,uniapp微信小程序安卓设备android可以播放在线网络视频 ,苹果ios设备无法播放视频,微信小程序 video标签 ios不能播放视频或视频黑屏,安卓手机正常播放iPhone手机却黑屏,如何解决这个问题,在线播放视频URL链接,iOS无法播放MP4视频文件的解决方案,在Android设备上可以正常播放,但在iOS设备上却出现黑屏、无法加载或无法播放

🏆 前端领域优质创作者 1万+

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

Vue-Todo-list 案例

Vue-Todo-list 案例

m0_61787196的博客 1009

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Todo-List案例版本三

【代码】Todo-List案例版本三。

bubbleJessica的博客 990

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

【亲测免费】 推荐一款跨平台的高效Todo List应用 - xhznl-todo-list

推荐一款跨平台的高效Todo List应用 - xhznl-todo-list 项目介绍 :sparkles: 欢迎来到xhznl-todo-list的世界,这是一款基于electron + vue + electron-builder开发的跨平台桌面应用程序,专为提升您的工作效率而设计。它不仅具备了轻量级便签应用的所有优点,还增加了丰富的功能和现代化的用户体验。 项目技术分析 xhznl-tod...

gitblog_00032的博客 827

Next.js Todo List 应用教程

Next.js Todo List 应用教程 项目介绍 Next.js Todo List 是一个基于 Next.js 框架的开源项目,旨在帮助开发者快速构建一个功能齐全的待办事项(Todo)应用。该项目由 jrgarciadev 开发,提供了完整的源代码和文档,适合初学者学习和实践 Next.js 的基础知识。 项目快速启动 环境准备 在开始之前,请确保您的开发环境满足以下要求: Node.j...

gitblog_00512的博客 986

Vue CLI Todo-List案例

Vue CLI Todo-List案例

weixin_44230693的博客 480

Todo-List案例

(1)拆分静态组件:组件要按照功能点拆分,命名不与HTML元素冲突(2)实现动态组件:考虑好数据的存放位置,数据是一个组件在用,还是一些组件在用1.一个组件在用:放在组件自身即可2.一些组件在用:放在它们共同的父组件上(状态提升)3.实现交互:从绑定事件开始。

XCXLOVE_的博客 473

5 分钟 JS 实战 - 构建 Todo List 应用(第14节)

本文将带你从零开始构建一个功能齐全的TodoList应用,涵盖HTML、CSS和JavaScript的核心技术。通过实战项目,你将学习如何实现任务添加、删除、编辑和标记完成等功能,并进一步扩展任务优先级、分类和统计功能。让我们一起动手,打造一个实用且美观的TodoList应用吧!

星核日记,一个编程开发者的小天地。我将和大家一起,穿梭于多语言迷宫,剖析算法精妙,分享实战项目。 1284

NestJs小案例:Todo List

创建一个简单的 Todo List 应用程序,使用 Nest.js 来管理任务的增删改查操作。

m0_60838883的博客 640

纯前端Vue实现Todo_list备忘录及导航案例

Vue实现打卡导航

AI~天海的博客 1301

todo_list

写一个简单的移动端 Todo_List效果 HTML 代码 : <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"&...

zheng_li_dong的博客 214

Todo-List案例版本五

【代码】Todo-List案例版本四。

bubbleJessica的博客 1095
上一篇: Todo-List案例版本三
下一篇: Todo-List案例版本五
bubbleJessica
博客等级 码龄5年 172粉丝 167原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值