vue代办事件案例实战练习,配有答案解析

代办事件案例

  • 该案例,综合了前面所学的知识,列入点击事件绑定,双向绑定,v-for循环语句,v-model双向绑定,以及input标签的不同type形式。

    演示代码如下:

vue 复制代码
<template >
<div id="kuagjia">
    <div >
        <div class="top"><span style="margin-left: -700px;">学习计划表</span></div>
        <div class="hang1">
            <div>学习科目<input type="text" placeholder="请输入学习科目" v-model="addSj"></div>
            <div>学习内容<textarea placeholder="请输入学习内容" v-model="addContent" ></textarea></div>
            <div>学习地点
                <select v-model="addPlace">
                    <option>自习室</option>
                    <option>教室</option>
                    <option>图书馆</option>
                </select>
            </div>
            <div><button @click="addImg">添加</button></div>
        </div>
    </div>
    <div>
        <table id="table" border="1px" cellspacing="0">
            <thead>
                <tr>
                    <th>序号</th>
                    <th>学习科目</th>
                    <th>学习内容</th>
                    <th>学习地点</th>
                    <th>完成状态</th>
                    <th>操作</th>
                </tr>
            </thead>
            <tbody  >
                <tr v-for="(i,index) in arrImg">
                    <td>{{ index+1 }}
                    </td>
                    <td>{{ i.sj }}</td>
                    <td>{{ i.content }}</td>
                    <td>{{ i.place }}</td>
                    <td >
                        
                        <label class="switch">
	                    <input type="checkbox"   v-model="i.status"     >
	                    <span class="slider round"></span>
                        </label>{{ i.status ? "完成":"未完成" }}
                    </td>
                    <td @click="delImg(i.id, i.status)">删除</td>
                </tr>
            </tbody>
        </table>
    </div>
</div>


</template>

<script setup>
import {ref}  from  'vue';
const addSj = ref('')
const addContent = ref('')
const addPlace = ref('')
const ids = ref(1)
const arrImg =ref([]) 


const addImg = () =>{
    if (addSj.value === '' || addContent.value === ''){
        alert('学习科目和学习内容都不能为空')}else{

    var addSjIs = addSj.value
    var addContentIs = addContent.value
    var addPlaceIs = addPlace.value
    var idss = ids.value++
    var a = {id : idss, sj : addSjIs, content : addContentIs, place : addPlaceIs, status: false}
    arrImg.value.push(a)

}
}
const delImg = (id, status) =>{
    if (status) {
        arrImg.value = arrImg.value.filter(x => x.id != id )
    }else{
        alert('没有做完是不会被删除的')
    }

    }
</script>

<style>
#kuagjia{

    width: 800px;
    height: 400px;
    border: 1xp solid;
    background-color: antiquewhite;
}
.top{
    width: 800px;
    height: 30px;
    background-color: gray;
    padding-left: 0px;
  
}
.hang1{
    display: flex;
  
    
}
#table{
    border: 1px solid;
    width: 800px;
    margin-top: 20px;
    
}
/* 开关 */
/* 开关 - 滑块周围的框 */
.switch {
	--width:22px;
	position: relative;
	display: inline-block;
	width: calc(var(--width) * 2);
	height: var(--width);
}
 
/* 隐藏默认 HTML 复选框 */
.switch input {
	opacity: 0;
	width: 0;
	height: 0;
}
 
/* 滑块 */
.slider {
	position: absolute;
	top: 0;
	left: 0;
	right: 0;
	bottom: 0;
	cursor: pointer;
	background-color: #ccc;
	transition: .4s;
}
 
/* 轨道*/
.slider.round {
	border-radius: 34px;
}
/* 圆形滑块 */
.slider.round::before {
	border-radius: 50%;
}
 
.slider::before {
	position: absolute;
	content: "OFF"; 
	height: var(--width);
	width: var(--width);
	left: 0px;
	bottom: 0px;
	background-color: white;
	-webkit-transition: .4s;
	transition:all .4s;
	font-size: 10px;
	text-align: center;
	line-height: var(--width);
	color: #ccc;
}
 
input:checked+.slider {
	background-color: #2196F3;
}
 
input:checked+.slider:before {
	transform: translateX(var(--width));
	content: "ON"; 
	color: #2196F3;
}
button{
    background-color: #ccc;
    margin-left: 20px;
}
</style>
  • 效果如下

    在输入框的提示下输入内容,点击添加按钮就会自动添加代办任务,还有完成状态的调整功能,若任务未完成,点击删除是不会有效果的!!!如果第2次添加的内容已经在表中存在,会提示用户,无需重复添加。

  • 当代办案例邂逅统计完成的个数,则会出现另一个版本的代办案例

    代码如下:

vue 复制代码
<template>

    <div class="main">
        <h2>代办事项</h2>
        <input id="task" type="text" placeholder="请填写任务" @keyup.enter.exact="add" v-model="content">
        <ul>
            <li v-for="item in display" @mouseover="flag = true" @mouseleave="flag = false">

                <div  id="list">

                    <input type="checkbox" v-model="item.status">
                    <span v-if="!item.status">{{ item.name }}</span>
                    <span v-else> <del> {{ item.name }} </del></span>

                    <div>

                        <i v-show="flag" @click="del(item.id)">X</i>

                    </div>
                </div>
                <hr>
            </li>
        </ul>

        <div id="footer">
            <div id="tips">共有{{ display.length }} {{ which }}条任务 </div>
            <div>
                <button @click="which = '全部'">全部</button>
                <button @click="which = '待办'">待办</button>
                <button @click="which = '已办'">已办</button>
            </div>
        </div>
    </div>
</template>
<script setup>

import { ref, computed } from 'vue';

const flag = ref(false);
const content = ref("");
const which = ref("全部")

const arr = ref([
    { name: '晨练', id: 1, status: false },
    { name: '练书法', id: 2, status: false }
])

const display = computed(() => {
    if (which.value == "全部") {
        return arr.value;
    } else if (which.value == "待办") {
        return arr.value.filter(x => !x.status);
    } else {
        return arr.value.filter(x => x.status);
    }
})

const add = () => {
    let item = { name: content.value, id: arr.value.length + 1, status: false };
    arr.value.push(item);
    content.value = "";
}

const del = (id) => {
    arr.value = arr.value.filter(x => x.id != id)
}

</script>


<style scoped>
.main {

    display: flex;
    flex-direction: column;
    align-items: flex-start;
}

h2 {
    align-self: center
}

ul {
    list-style-type: none;
    padding: 0px;
}

#list {
    display: flex;
    justify-content: space-between;
    min-width: 500px;
}

ul li div {
    min-width: 50px;
    margin: 0px;
}

#task {
    min-width: 500px;
}

#footer {

    display: flex;
    min-width: 500px;
    justify-content: space-between;

}

#tips {
    display: flex;
    align-items: center;
}

#footer button {
    border: 0px;

    background-color: transparent;
}

#footer button:active {
    background-color: aqua;
}
</style>
  • 案例效果如下

    同理根据提示在输入框内输入想要完成的任务,按下Enter键就会添加到列表队伍当中,当鼠标移动到任务条上时右侧会显示一个×,点击x即可删除此条任务!在列表的最后一栏,点击不同状态,会过滤相应的任务,并做出相应的统计。

相关推荐
乔峰不是张无忌33015 分钟前
【HTML】动态闪烁圣诞树+雪花+音效
前端·javascript·html·圣诞树
鸿蒙自习室23 分钟前
鸿蒙UI开发——组件滤镜效果
开发语言·前端·javascript
m0_7482507430 分钟前
高性能Web网关:OpenResty 基础讲解
前端·openresty
NiNg_1_23430 分钟前
基于Hadoop的数据清洗
大数据·hadoop·分布式
前端没钱1 小时前
从 Vue 迈向 React:平滑过渡与关键注意点全解析
前端·vue.js·react.js
汪洪墩1 小时前
【Mars3d】设置backgroundImage、map.scene.skyBox、backgroundImage来回切换
开发语言·javascript·python·ecmascript·webgl·cesium
NoneCoder1 小时前
CSS系列(29)-- Scroll Snap详解
前端·css
无言非影1 小时前
vtie项目中使用到了TailwindCSS,如何打包成一个单独的CSS文件(优化、压缩)
前端·css
我曾经是个程序员2 小时前
鸿蒙学习记录
开发语言·前端·javascript
顽疲2 小时前
springboot vue 会员收银系统 含源码 开发流程
vue.js·spring boot·后端