1. 语法 this.$nextTick(回调函数)
2. 作用 在下一次DOM 更新结束后执行其指定的回调
3. 什么时间用 当改变数据后,要基于更新后新的DOM进行某些操作时,要在nextTick 所指定的回调函数中执行。
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; }) }, //更新一个todo updateTodo(id,title){ this.todos.forEach((todo)=>{ if(todo.id===id) todo.title=title; }) },//全选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) this.$bus.$on('updateTodo',this.updateTodo)
}, beforeDestroy(){ this.$bus.$off('checkTodo') //this.$bus.$off('deleteTodo') pubsub.unsubscribe(this.pubId) this.$bus.$off('updateTodo') } } </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; margin-left:5px; } .btn-edit { color: #fff; background-color: skyblue; border: 1px solid skyblue; } .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)"/>
<span v-show="!todo.isEdit">{{todo.title}}</span>
<input v-show="todo.isEdit" type="text" :value="todo.title" @blur="handlerBlur(todo,$event)" ref="inputTitle"/>
</label> <button class="btn btn-danger" @click="hadnlerDelete(todo.id)">删除</button> <button v-show="!todo.isEdit" class="btn btn-edit" @click="handlerEdit(todo)">编辑</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)
} }, handlerEdit(todo){ if(todo.hasOwnProperty('isEdit')){ todo.isEdit=true; }else{ this.$set(todo,'isEdit',true) }
this.$nextTick(function(){ this.$refs.inputTitle.focus() }) }, //失去焦点回调 真正执行修改逻辑 handlerBlur(todo,e){ todo.isEdit=false; if(!e.target.value.trim()) return alert('不能为空') this.$bus.$emit('updateTodo',todo.id,e.target.value) }
} } </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> 标签:nextTick,vue,--,li,deleteTodo,todo,id,todos From: https://www.cnblogs.com/satisfysmy/p/17610154.html