<template>
<div>
<!-- 添加增加方法 传递给子组件-->
<!-- 垃圾方法 -->
<!-- <Shijian :addTodo="addTodo" /> -->
<!-- 使用新方法 -->
<!-- 监听绑定 -->
<Shijian ref="header" />
<!-- 传递给子组件数据 -->
<!-- 传递删除方法 子组件-->
<Shijianone :todos="todos" :delTodo="delTodo" />
<!-- 传递给子组件 -->
<Shijiantwo
:todos="todos"
:selectedAllTodo="selectedAllTodo"
:delFinishedTodos="delFinishedTodos"
/>
</div>
</template>
<script scoped>
import Shijian from "@/components/Shijian";
import Shijianone from "@/components/Shijianone";
import Shijiantwo from "@/components/Shijiantwo";
import localStorageUtil from "@/utils/localStorageUtil";
export default {
name: "Body",
data() {
return {
todos: localStorageUtil.readTodos(),
};
},
components: {
Shijian,
Shijianone,
Shijiantwo,
},
mounted(){
this.$refs.header.$on('addTodo',this.addTodo)
},
methods: {
addTodo(todo) {
this.todos.unshift(todo);
},
delTodo(index) {
this.todos.splice(index, 1);
},
selectedAllTodo(isCheck) {
this.todos.forEach((todo) => {
todo.finished = isCheck;
});
},
delFinishedTodos() {
this.todos = this.todos.filter((todo) => !todo.finished);
},
},
watch: {
todos: {
handler: localStorageUtil.saveTodos,
deep: true,
immediate: true,
},
},
};
</script>
<style scoped>
</style>
<template>
<div>
<h3>上</h3>
<!-- 绑定的值 -->
<!-- 绑定回车键输入提交 -->
<input
type="text"
placeholder="输入的值"
v-model="title"
@keyup.enter="addItem"
/>
</div>
</template>
<script>
export default {
name: "Shijian",
data() {
return {
title: "",
};
},
methods: {
addItem() {
alert("添加成功");
const title = this.title.trim();
if (!title) {
alert("不能为空");
return;
}
let todo = { title, finished: false };
this.$emit('addTodo',todo);
this.title = "";
},
},
};
</script>
<style>
</style>
<template>
<div>
<!-- 鼠标进入时候显示删除 -->
<!-- 鼠标离开不显示删除 -->
<!-- 调用函数传递值 dealShow(true) -->
<!-- 动态绑定背景色 -->
<li @mouseenter="dealShow(true)" @mouseleave="dealShow(false)" :style="{backgroundColor:bgColor}" >
<label>
<input type="checkbox" v-model="todo.finished" />
<span>{{ todo.title }}</span>
</label>
<!-- 绑定删除事件 触发函数方法 -->
<button v-show="isShowDelButton" @click="delFour">删除</button>
</li>
</div>
</template>
<script>
export default {
name: "ShijianFour",
props: {
todo: Object,
index:Number,
delTodo:Function,
},
data() {
return {
isShowDelButton: false,
bgColor:"#fff"
};
},
methods: {
dealShow(isShow) {
this.isShowDelButton = isShow;
this.bgColor=isShow?'#ddd':'#fff';
},
delFour(){
if(window.confirm(`确定要删除 ${this.todo.title} 么?`)) {
this.delTodo(this.index);
}
}
},
};
</script>
<style>
</style>
<template>
<div>
<h3>列表</h3>
<ul>
<!-- 传递父组件的给子子组件:delTodo="delTodo" -->
<ShijianFour v-for="(todo, index) in todos" :todo="todo" :index="index" :delTodo="delTodo" />
</ul>
</div>
</template>
<script>
import ShijianFour from "./ShijianFour";
export default {
name: "Shijianone",
props: {
todos: Array,
delTodo:Function,
},
components: {
ShijianFour,
},
};
</script>
<style>
</style>
<template>
<div>
<h3>下</h3>
<label>
<input type="checkbox" v-model="isCheck" />
</label>
<span>
<span>已经完成{{ finishedCount }}件</span>
总共{{ todos.length }}件</span
>
<button @click="delFinishedTodos">清除选中</button>
</div>
</template>
<script>
export default {
name: "Shijiantwo",
props: {
todos: Array,
selectedAllTodo: Function,
delFinishedTodos: Function,
},
computed: {
finishedCount() {
return this.todos.reduce(
(total, todo) => total + (todo.finished ? 1 : 0),
0
);
},
isCheck: {
get() {
return (
this.finishedCount === this.todos.length && this.todos.length > 0
);
},
set(value) {
this.selectedAllTodo(value);
},
},
},
};
</script>
<style>
</style>