请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

作业遇到的bug,添加代办事项后的todo进行删除,有时候会停在9s,无法实现自动退出了,只要添加过代办事项,一定停在9s

老师,我遇到个bug,留的删除作业10s自动退出感觉有点问题,停在9s
图片描述
App.vue新增代码如下:

<script setup>
import MyDelete from "./components/delete.vue";
const MydeleteShow = ref(false);
const indexOfTodo = ref();
const deleteTodo = function (index) {
  console.log("deleteTodo");
  indexOfTodo.value = index;
  MydeleteShow.value = true;
};

const deleteTodoConfirm = function (index) {
  MydeleteShow.value = false;
  list.value[index].del = true;
};
const deleteTodoCancel = function () {
  MydeleteShow.value = false;
};
</script>
<template>
  <MyDelete
    :isShow="MydeleteShow"
    @del="deleteTodoConfirm"
    @cancel="deleteTodoCancel"
    :index="indexOfTodo"
  />
</template>

delete.vue的主要代码如下:

<script setup>
import { defineProps, defineEmits, ref, watch } from "vue";
const props = defineProps({
  isShow: Boolean,
  index: Number,
});
const isShow = ref(props.isShow);
const count = ref(10);
const updateCount = function () {
  count.value--;
  if (count.value === 0) {
    clearInterval(timer);
    cancel();
  }
};
let timer = setInterval(updateCount, 1000);

watch(
  () => props.isShow,
  (value) => {
    isShow.value = value;
    if (isShow.value === true) {
      count.value = 10;
      updateCount();
    }
  },
);
const indexOfTodo = ref();
watch(
  () => props.index,
  (value) => {
    indexOfTodo.value = value;
  },
);

const emits = defineEmits(["del", "cancel"]);
const del = function () {
  isShow.value = false;
  emits("del", indexOfTodo.value);
};
const cancel = function () {
  isShow.value = false;
  emits("cancel");
};
</script>

<template>
  <div v-if="isShow" class="masking"></div>
  <div v-if="isShow" class="popover">
    <div class="popover-con">
      <div class="popover-info">
        <div class="content">
          <p>警告({{ count }}秒后自动取消)</p>
          <p>是否要删除当前选项?</p>
        </div>
        <div class="operateBar">
          <button @click="cancel">取消</button>
          <button @click="del">确认</button>
        </div>
      </div>
    </div>
  </div>
</template>

正在回答 回答被采纳积分+3

3回答

西一凹 2024-12-19 21:44:27

同学你好,通过你提供的代码分析,主要的问题在于

一般情况下,组件的显示隐藏,不需要将 用于显示状态的变量 传入组件内部,

即你代码的这个位置

https://img1.sycdn.imooc.com/szimg/67641e69090b5c3606500303.jpg

可以改为下图

https://img1.sycdn.imooc.com/szimg/67641e9109b6c2c406610345.jpg

组件的显示与隐藏,由使用者决定

----------------

同理,在这个功能中,要删除元素的下标,也不需要传入组件,而是在点击的时候自行用变量记录即可,组件内部只决定,是“确定”还是取消

https://img1.sycdn.imooc.com/szimg/67641ec60927b53512040644.jpg

即改为下图所示

https://img1.sycdn.imooc.com/szimg/67641f1b09505e9408820311.jpg


-----------

经过上面的操作后,组件内部,将不需要通过状态再来重置  某些变量的初始值,

即:组件内部下图框选部分全部删除


https://img1.sycdn.imooc.com/szimg/67641f6709eb28c811000960.jpg

https://img1.sycdn.imooc.com/szimg/67641f90097071c910870801.jpg

https://img1.sycdn.imooc.com/szimg/67641fc30951892f07710327.jpg

https://img1.sycdn.imooc.com/szimg/67641fdc0937defb12420848.jpg

即:最终组件内部代码如下

https://img1.sycdn.imooc.com/szimg/67641ffd09b03bc012400852.jpg

https://img1.sycdn.imooc.com/szimg/6764200e096852b712390723.jpg

修改完成后

最后只需处理,调用者 ”接受  组件 提交的 “del”事件

https://img1.sycdn.imooc.com/szimg/6764207b09d233fb10900239.jpg

上方的函数的 index 去除,因为内部不在提交 index,而是 “调用者”自行保存的 “indexOfTodo”

https://img1.sycdn.imooc.com/szimg/676420ba098a552111690712.jpg

即:最终确认删除的 数组成员下标 就是 “indexOfTodo.value”

最终修改后,“调用者”控制组件部分的代码如下

https://img1.sycdn.imooc.com/szimg/6764211509666c9212970655.jpg

--------------------------

最后,在一般情况下,数组成员的删除,不应是给该数组成员 标记某个属性,如你这里的

https://img1.sycdn.imooc.com/szimg/67642152091dac8610560621.jpg

而是真实从该数组内删除

所以可以通过 JS 原生的 Array.prototype.splice 函数 进行删除

    splice 函数 使用方法如下

        两个参数,

        参数1:要删除的数组成员 起始下标,(假设为 S),

        参数2:要删除的长度(假设为 C)

        即语义化理解为,从数组的 第 S 个成员开始,删除 C个成员。

所以,修改后的代码如下图所示:

https://img1.sycdn.imooc.com/szimg/6764227b09a05b2210750218.jpg

从 indexOfTodo.value 的下标开始,删除 1个,即删除指定下标的成员

-----------------------------------------------------

经过上方的修改后,即可将下方用于 标记“已删除”状态的部分去除

https://img1.sycdn.imooc.com/szimg/676422e60998cf1914260710.jpg

-------------------------------------------------------------------------------

最终修改后,

todoList.vue 完整代码

<script setup>
import {ref} from "vue";

const color = ref("#000000");
const day = ref();
const todo = ref();

const list = ref([
    {
        color: "#55b74c",
        day: "今天",
        todo: "要上班",
        complete: true,
        del: false,
    },
    {
        color: "#3a48fa",
        day: "明天",
        todo: "要上班",
        complete: false,
        del: false,
    },
    {
        color: "#9b3ec0",
        day: "后天",
        todo: "还是要上班",
        complete: false,
        del: false,
    },
]);

const addTodo = function () {
    list.value.push({
        color: color.value,
        day: day.value,
        todo: todo.value,
        complete: false,
        del: false,
    });
    color.value = "#000000";
    day.value = "";
    todo.value = "";
};

const completeTodo = function (index) {
    console.log("completeTodo");
    list.value[index].complete = true;
};

import ConFrame from "@/components/ConFrame.vue";
import MyInput from "@/components/input.vue";
import MyDelete from "@/components/delete.vue";

const ConFrameShow = ref(false);
const ConFrameCallback = function (msg) {
    ConFrameShow.value = false;
    console.log(msg);
};

const ConFrameToShow = function () {
    ConFrameShow.value = true;
};

const MydeleteShow = ref(false);

const indexOfTodo = ref();
const deleteTodo = function (index) {
    indexOfTodo.value = index;
    MydeleteShow.value = true;
};

const deleteTodoConfirm = function () {
    MydeleteShow.value = false;
    list.value.splice(indexOfTodo.value, 1)
};
const deleteTodoCancel = function () {
    MydeleteShow.value = false;
};
</script>

<template>
    <div class="container">
        <h1>代办事项 {{ day }}</h1>
        <button @click="ConFrameToShow">添加代办事项</button>
        <div class="option"></div>
        <ul class="list">
            <!--Vue3中v-if权限比v-for高-->
            <template v-for="(item, index) in list">
                <li
                        :style="item.complete === true ? 'text-decoration: line-through;' : ''"
                        @click="completeTodo(index)"
                >
                    <div class="color" :style="'background-color:' + item.color"></div>
                    <span>{{ item.day }}</span>
                    <span>{{ item.todo }}</span>
                    <div class="del" @click.stop="deleteTodo(index)">*</div>
                </li>
            </template>
        </ul>
    </div>

    <ConFrame
            :isShow="ConFrameShow"
            title="新增代办事项"
            @close="ConFrameCallback"
    >
        <MyInput class="color" label="颜色" type="color" v-model="color"/>
        <MyInput class="day" label="哪天" placeholder="请输入哪天" v-model="day"/>
        <MyInput
                class="todo"
                label="要做什么"
                placeholder="请输入要做什么"
                v-model="todo"
        />

        <button class="addTodo" @click="addTodo">添加事项</button>
    </ConFrame>

    <MyDelete
            v-if="MydeleteShow"
            @del="deleteTodoConfirm"
            @cancel="deleteTodoCancel"
    />
</template>

<style scoped>
.container {
    box-sizing: border-box;
    width: 100%;
    padding: 10px;
}

.list {
    li {
        display: flex;
        margin: 20px;
        cursor: pointer;

        &:hover {
            background-color: antiquewhite;
        }

        .color {
            width: 20px;
            height: 20px;
            margin-right: 20px;
        }

        .del {
            margin-left: auto;
        }
    }
}

.option {
    display: flex;

    .color {
        width: 30px;
        height: 30px;
    }

    .day,
    .todo,
    .addTodo {
        padding: 5px 10px;
    }
}

.option input:focus {
    outline: none;
}

.option .addTodo {
    cursor: pointer;
}
</style>


delete.vue (删除组件)完整代码

<script setup>
import {defineProps, defineEmits, ref, watch} from "vue";

const count = ref(10);
const updateCount = function () {
    count.value--;
    if (count.value === 0) {
        clearInterval(timer);
        cancel();
    }
};
let timer = setInterval(updateCount, 1000);

const emits = defineEmits(["del", "cancel"]);
const del = function () {
    emits("del");
};
const cancel = function () {
    emits("cancel");
};
</script>

<template>
    <div class="masking"></div>
    <div class="popover">
        <div class="popover-con">
            <div class="popover-info">
                <div class="content">
                    <p>警告({{ count }}秒后自动取消)</p>
                    <p>是否要删除当前选项?</p>
                </div>
                <div class="operateBar">
                    <button @click="cancel">取消</button>
                    <button @click="del">确认</button>
                </div>
            </div>
        </div>
    </div>
</template>

<style scoped>
.masking {
    width: 100%;
    height: 100vh;
    position: fixed;
    left: 0;
    top: 0;
    z-index: 100;
    background-color: rgba(0, 0, 0, 0.3);
}

.popover {
    left: 0;
    top: 0;
    width: 100%;
    height: 100vh;
    z-index: 999;
    position: fixed;
    display: table;

    .popover-con {
        position: relative;
        z-index: 9999;
        display: table-cell;
        vertical-align: middle;
        text-align: center;

        .popover-info {
            border-radius: 5px;
            text-align: left;
            display: inline-block;
            width: 300px;
            height: 100px;
            background: #fff;

            .operateBar {
                padding: 0 10px;
                height: 38px;
                line-height: 38px;
                border-bottom: 1px solid #ebeef5;
                display: flex;
                justify-content: space-between;
                align-items: center;
                position: relative;
                background-color: #379aff;

                button {
                    color: #ffffff;
                    width: 150px;
                    height: 30px;
                    background-color: #379aff;
                    border: none;
                }
            }
        }

        .content {
            width: 100%;
            margin: 10px 20px;

            p {
                font-size: 14px;
            }
        }
    }
}
</style>


1 回复 有任何疑惑可以回复我~
西一凹 2024-12-18 17:48:30

https://img1.sycdn.imooc.com/szimg/67629a61096b5e9115760960.jpg

QQ群在这个位置

0 回复 有任何疑惑可以回复我~
西一凹 2024-12-18 17:10:22

同学你好,你要加课程的官方qq群吗,你可以在群内将完整的项目打包发给我,我帮你看看具体的原因。

0 回复 有任何疑惑可以回复我~
  • node_modules 这么目录不需要打包进去哈
    回复 有任何疑惑可以回复我~ 2024-12-18 17:10:51
  • 提问者 声声入耳 #2
    官方qq群在哪?
    回复 有任何疑惑可以回复我~ 2024-12-18 17:38:14
  • 提问者 声声入耳 #3
    老师,我没找到qq群在哪
    回复 有任何疑惑可以回复我~ 2024-12-18 17:40:21
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信