首页 > 其他分享 >vue--day54--todolist 中的MyItem 和App 消息发布实现通信

vue--day54--todolist 中的MyItem 和App 消息发布实现通信

时间:2023-08-04 23:35:53浏览次数:38  
标签:vue -- App li deleteTodo todo id todos

1.App.vue

<template> <div id="root"> <div class="todo-container"> <div class="todo-wrap"> <!-- @addTodo 事件名 addTodo 回调名--> <MyHeader @addTodo="addTodo"/> <!--父亲给儿子传数据 父亲通过数据绑定传数据 儿子通过 props:['todos'],//声明接收todo 对象 --> <MyList :todos="todos" :checkTodo="checkTodo" :deleteTodo="deleteTodo"/> <MyFooter :todos="todos" @checkAllTodo="checkAllTodo" @clearAllTodo="clearAllTodo"/> </div> </div> </div>     </template>   <script> //样式的引入和这里有关系 import pubsub from 'pubsub-js' import MyHeader from './components/MyHeader.vue'; import MyList from './components/MyList.vue'; import MyFooter from './components/MyFooter.vue';     export default { name: 'App', components: { MyHeader, MyList, MyFooter }, data(){ return { todos:JSON.parse(localStorage.getItem("todos"))||[] }   },   methods:{ // 添加一个todo addTodo(todoObj){ // console.log('我是app组件,我收到了数据x==',todoObj); this.todos.unshift(todoObj)   }, //勾选or 取消勾选 todo checkTodo(id){ this.todos.forEach((todo)=>{ if(todo.id===id) todo.done=!todo.done }) }, //删除一个todo deleteTodo(_,id){ this.todos=this.todos.filter((todo)=>{ return todo.id!==id; }) },   //全选or全不选 checkAllTodo(done){ this.todos.forEach((todo)=>{ todo.done=done }) },   clearAllTodo(){ this.todos=this.todos.filter((todo)=>{ return !todo.done }) }   }, watch:{ // todos(value){ // localStorage.setItem("todos", JSON.stringify(value)); // } todos:{ deep:true, handler(value){ localStorage.setItem("todos", JSON.stringify(value)); } }   }, mounted(){ this.$bus.$on('checkTodo',this.checkTodo) //this.$bus.$on('deleteTodo',this.deleteTodo) this.pubId=pubsub.subscribe('deleteTodo',this.deleteTodo)
}, beforeDestroy(){ this.$bus.$off('checkTodo') //this.$bus.$off('deleteTodo') pubsub.unsubscribe(this.pubId) } } </script>   <style>     /* 整体样式 */ body { background: rgba(230, 241, 245, 0.816); }   .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> 2. MyItem.vue <template> <li> <label> <input type="checkbox" :checked="todo.done" @click="handlerCheck(todo.id)"/>
<!--
let a=1; a=2; 改了 let obj={a:1,b:2} obj.a=8; 代码层底改了 但是 obj 内存地址没有变化 vue 认为没有变化 如下代码也能实现功能 但是步太推荐 因为有点违反了原则 因为修改了 props 属性 --> <!-- <input type="checkbox" v-model:="todo.done"/> -->
  <span>{{todo.title}}</span> </label> <button class="btn btn-danger" @click="hadnlerDelete(todo.id)">删除</button> </li> </template>
<script> import pubsub from 'pubsub-js' export default { name:"MyItem", props:['todo'],//声明接收todo 对象 mounted(){ //console.log(this.todo); }, methods:{ //勾选或者取消勾选 handlerCheck(id){ //通知app 组件 将对应的todo 对象的done 值取反 //console.log("id",id); //this.checkTodo(id);
this.$bus.$emit('checkTodo',id) }, //闪促 hadnlerDelete(id){ if(confirm('确定删除么')){ //console.log("id",id);
//通知app 删除一个对象 //this.deleteTodo(id); // this.$bus.$emit('deleteTodo',id)
pubsub.publish('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:hover { background-color: grey; 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:hover button { display: block; }
li:before { content: initial; }
li:last-child { border-bottom: none; }
</style>

 

标签:vue,--,App,li,deleteTodo,todo,id,todos
From: https://www.cnblogs.com/satisfysmy/p/17607276.html

相关文章

  • QT(4)信号、SLOT和QMap - Addressbook例子2
    在之前的MeeGo开发者(五):QT(3)对象和继承小例子基础上,我们增加三个button,参考http://doc.qt.nokia.com/latest/tutorials-addressbook-part2.html、http://doc.qt.nokia.com/latest/tutorials-addressbook-part3.html和http://doc.qt.nokia.com/latest/tutorials-addressbook-part......
  • MeeGo handset 1.1开发环境[4]:在SDK上实现Hello World
    我们会followwiki的guide,通过QTCreator在模拟器上运行helloworld程序,然后我们会对模拟器作进一步的探讨。wiki上的参考:http://wiki.meego.com/Getting_started_with_the_MeeGo_SDK_for_Linuxhttp://wiki.meego.com/SDK/Docs/1.1/Creating_Hello_World一、通过QTCreator来......
  • 一次失败的网购:在兰蔻官网订购的货不对版
    这是上个月的事情,说上当受骗有点过分,但是货不对版倒是恰如其分。我写在开心上群上,移到这里,因为开心的兰蔻群不值得信任,将其锁住了,不过也是正常的。我要承认,在群上写了之后,联系了我,看看如何解决问题,要我将小样寄回去(有些是套装的标明样品,我的理解不属于免费赠送),但是大概一个月时......
  • 第八章:分布式系统的麻烦
    故障与部分失效如果发生内部错误,我们宁愿电脑完全崩溃,而不是返回错误的结果,因为错误的结果很难处理。因为计算机隐藏了模糊不清的物理实现,并呈现出一个理想化的系统模型,并以数学一样的完美的方式运作。在分布式系统中,尽管系统的其他部分工作正常,但系统的某些部分可能会以某种不......
  • jenkins 远程 ssh 部署问题记录
    脚本执行失败注意需要在sh脚本里面添加source/etc/profile脚本执行失败排查可以在jenkins的ssh命令添加日志,然后查看日志排错nohupsh/xx/xx.sh>/xx/xx.log2>&1&脚本编写注意事项在脚本开头添加cd到当前目录,确保脚本内部读取的路径正常......
  • GB28181智慧可视化指挥控制系统之执法记录仪设计探讨
    什么是智慧可视化指挥控制系统?智慧可视化指挥控制平台通过4G/5G网络、WIFI实时传输视音频数据至指挥中心,特别是在有突发情况时,可以指定一台执法仪为现场视频监控器,实时传输当前画面到指挥中心,指挥中心工作人员可通过麦克风向现场执法人员下达指令(语音广播或语音对讲)。本文主要介绍......
  • Axure学习
    一、AxureRP介绍一款专业的快速原型设计工具相关文件类型:源文件:.rp团队原型项目:.rpprj元件库文件:.rplib网页文件内容:HTML二、界面:菜单、工具栏区域:菜单区域包括常规的文件、编辑、视图……;工具栏区域包括一些页面编辑快捷操作(字体设置、大小设置、页面显示大小和Ax......
  • vscode配置gitbash终端
    VSCode是一款微软出的轻量级编辑器,它本身只是一款文本编辑器而已,所有的功能都是以插件扩展的形式所存在,想用什么功能就安装对应的扩展即可,非常方便,同时也支持非常多的主题和图标,外观比较好看,重要的是VSCode支持各大主流操作系统,包括Windows、Linux和MacOS。所以就选择它作为自己的......
  • [译]2011年移动开发者经济学报告(五)
    哪可以赚钱第二部分将应用推向市场(上)开发者历程移动开发过程复杂,不只是“想法idea”到“应用app”两个步骤。今天的全球应用市场,将想法推向市场需要数十个步骤,仅列几项:计划,开发,调测,论坛支持,测试框架,打包,定价,发布,计费,市场,销售跟踪,用户支持和应用更新。我们用一个非常重要的图来阐述......
  • 《C++》机房预约系统案例
    机房预约系统文件可运行存在bug,断断续续手搓10多天Administrator.h#pragmaonce#include"LoginIdentity.h"#include"CompRoom.h"classMapId{public: stringM_name; stringM_pwd;};classLoginAdmin:publicLogin{public: LoginAdmin(); LoginAdmin(stri......