首页 > 其他分享 >vue--day51----todolist 中App.vue 和 MyItem.vue 类似 父亲和子通信 通过全局事件总线实现通信

vue--day51----todolist 中App.vue 和 MyItem.vue 类似 父亲和子通信 通过全局事件总线实现通信

时间:2023-08-03 23:55:57浏览次数:31  
标签:vue -- App 通信 li todo id todos

1.mainjs

/** * 该文件是整个项目的入口文件 */ //引入Vue import Vue from 'vue' // 引入App 组件 他是所有组件的父组件 import App from './App.vue'
//关闭vue 的生产提示 Vue.config.productionTip = false // const Demo=Vue.extend({}) // const d=new Demo(); // Vue.prototype.x=d; // 创建Vue 实例对象--vm new Vue({ //将 app 组件放入到容器中 render: h => h(App),
beforeCreate(){ Vue.prototype.$bus=this // 安装全局事件总监 } }).$mount('#app') 2. 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 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) }, beforeDestroy(){ this.$bus.$off('checkTodo') this.$bus.$off('deleteTodo') } } </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>  3. 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> 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) } } } } </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,todo,id,todos
From: https://www.cnblogs.com/satisfysmy/p/17604804.html

相关文章

  • 【剑指Offer】16、合并两个排序的链表
    【剑指Offer】16、合并两个排序的链表题目描述:输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。解题思路:首先需要判断几个特殊情况,即判断输入的两个指针是否为空。如果第一个链表为空,则直接返回第二个链表;如果第二个链表为空,则直接......
  • docker随笔一
    docker网络:1、docker生成的同一网络下(默认是docker0)容器中根据ip是可以ping通的,因为容器生成的ip是在此网络下分配的ip,这些内网是同一桥段下,通过docker网络(相当于路由器)转发可以互联。2、宿主机ping虚拟机中的docker网络正常情况下无法ping通,只能ping通虚拟机的ip,需要通过路由转......
  • ChatGPT 问答00007 RxJava介绍
    RxJava是一个基于反应式编程的库,它提供了一套丰富的操作符和数据类型,用于处理异步和事件驱动的编程。它是ReactiveX的Java版本实现,旨在简化异步和并发编程,并提供响应式流式处理的能力。RxJava的核心组件包括以下几个部分:Observable(可观察者):代表一个可被观察的数据流。它......
  • ChatGPT 问答00008 RxJava 使用案例
    RxJava可以应用于各种异步和事件驱动的编程场景。以下是一些RxJava的使用案例:网络请求:使用RxJava可以方便地处理网络请求和响应。你可以使用Retrofit或者其他网络库来发送异步请求,并将其封装为Observable,然后通过操作符进行转换、过滤和合并等操作,最后将结果交给观察者......
  • pytest-xdist分布式测试原理浅析
    pytest-xdist执行流程:解析命令行参数:pytest-xdist会解析命令行参数,获取用户指定的分发模式、进程数、主机列表等信息。加载测试用例:pytest-xdist会加载所有的pytest测试用例,包括在当前目录和子目录下的所有测试文件和测试函数。分发测试用例:根据用户指定的分发模式,py......
  • Java面试题 P57:微服务篇:你们的微服务是怎么监控的?
        ......
  • pyspark 环境搭建和相关操作redis ,es
    一.环境搭建1.创建虚拟环境,指定python包2.切换到虚拟环境,安装你所需要的python相关模块包3.把整个虚拟环境打成.zip4.将zip上传的hadfs5.spark-submit指定python包的路径可以参考 https://dandelioncloud.cn/article/details/1589470996832964609二.pyspark数据r......
  • C++11
    1.VariadicTemplate可以传入任意数量的参数,并且参数的类型不定。voidprintX(){}template<typenameT,typename...Types>voidprintX(constT&firstArg,constTypes&...args){cout<<firstArg<<endl;printX(args...);}其中,...是pack包,用于模板参数中(typenam......
  • 【知识点】JAVA之并发集合
    当涉及到多线程编程时,使用并发集合是一种常见的方式来处理多个线程同时访问和操作共享数据的问题。并发集合是一组线程安全的数据结构,可以同时被多个线程访问和修改,而不会导致数据不一致或竞争条件。以下是一些常见的并发集合及其特点:ConcurrentHashMap(并发哈希表):它是一个线程......
  • spring-mvc系列:详解@RequestMapping注解(value、method、params、header等)
    目录一、@RequestMapping注解的功能二、@RequestMapping注解的位置三、@RequestMapping注解的value属性四、@RequestMapping注解的method属性五、@RequestMapping注解的params属性六、@RequestMapping注解的header属性七、SpringMVC支持ant分格的路径八、SpringMVC支持路径中的占......