|
@@ -1,28 +1,88 @@
|
|
|
<template>
|
|
|
<div>
|
|
|
- <li>
|
|
|
+ <li
|
|
|
+ @mouseenter="mouseHandler(true)"
|
|
|
+ @mouseleave="mouseHandler(false)"
|
|
|
+ :style="{ backgroundColor: bgColor, color: myColor }"
|
|
|
+ >
|
|
|
<label>
|
|
|
- <input type="checkbox" />
|
|
|
- <span>{{todo.title}}</span>
|
|
|
+ <input type="checkbox" v-model="isComptete" />
|
|
|
+ <span>{{ todo.title }}</span>
|
|
|
</label>
|
|
|
- <button class="btn btn-danger" style="display: none">删除</button>
|
|
|
+ <button class="btn btn-danger" v-show="isShow" @click="delTodo">
|
|
|
+ 删除
|
|
|
+ </button>
|
|
|
</li>
|
|
|
</div>
|
|
|
</template>
|
|
|
|
|
|
<script lang="ts">
|
|
|
-import { defineComponent } from "vue";
|
|
|
-import {Todo} from "../types/todo"
|
|
|
+import { computed, defineComponent, ref } from "vue";
|
|
|
+import { Todo } from "../types/todo";
|
|
|
export default defineComponent({
|
|
|
name: "Item",
|
|
|
props: {
|
|
|
todo: {
|
|
|
type: Object as () => Todo, //函数返回的是一个Todo类型
|
|
|
- required: true
|
|
|
+ required: true,
|
|
|
+ },
|
|
|
+ deletTodo: {
|
|
|
+ type: Function,
|
|
|
+ required: true,
|
|
|
+ },
|
|
|
+ index: {
|
|
|
+ type: Number,
|
|
|
+ required: true,
|
|
|
},
|
|
|
+ updateTodo: {
|
|
|
+ type: Function,
|
|
|
+ required: true
|
|
|
+ }
|
|
|
},
|
|
|
- setup() {
|
|
|
- return {};
|
|
|
+ setup(props) {
|
|
|
+ //背景色
|
|
|
+ const bgColor = ref("white");
|
|
|
+ //前景色
|
|
|
+ const myColor = ref("black");
|
|
|
+
|
|
|
+ const isShow = ref(false);
|
|
|
+ //鼠标进入和离开事件的回调函数
|
|
|
+ const mouseHandler = (flag: boolean) => {
|
|
|
+ if (flag) {
|
|
|
+ //鼠标划入
|
|
|
+ bgColor.value = "pink";
|
|
|
+ myColor.value = "green";
|
|
|
+ isShow.value = true;
|
|
|
+ } else {
|
|
|
+ //鼠标划出
|
|
|
+ bgColor.value = "white";
|
|
|
+ myColor.value = "black";
|
|
|
+ isShow.value = false;
|
|
|
+ }
|
|
|
+ };
|
|
|
+ //删除数据的方法
|
|
|
+ const delTodo = () => {
|
|
|
+ if (window.confirm("确定删除吗?")) {
|
|
|
+ props.deletTodo(props.index);
|
|
|
+ }
|
|
|
+ };
|
|
|
+ //计算属性的方式---来让当前的复选框选中/不选中
|
|
|
+ const isComptete = computed({
|
|
|
+ get(){
|
|
|
+ return props.todo.isCompleted
|
|
|
+ },
|
|
|
+ set(val){
|
|
|
+ props.updateTodo(props.todo,val)
|
|
|
+ }
|
|
|
+ })
|
|
|
+ return {
|
|
|
+ bgColor,
|
|
|
+ myColor,
|
|
|
+ mouseHandler,
|
|
|
+ isShow,
|
|
|
+ delTodo,
|
|
|
+ isComptete
|
|
|
+ };
|
|
|
},
|
|
|
});
|
|
|
</script>
|
|
@@ -50,7 +110,7 @@ li label li input {
|
|
|
|
|
|
li button {
|
|
|
float: right;
|
|
|
- display: none;
|
|
|
+ /* display: none; */
|
|
|
margin-top: 3px;
|
|
|
}
|
|
|
|