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即可删除此条任务!在列表的最后一栏,点击不同状态,会过滤相应的任务,并做出相应的统计。

相关推荐
前端青山22 分钟前
Node.js-增强 API 安全性和性能优化
开发语言·前端·javascript·性能优化·前端框架·node.js
毕业设计制作和分享1 小时前
ssm《数据库系统原理》课程平台的设计与实现+vue
前端·数据库·vue.js·oracle·mybatis
程序媛小果1 小时前
基于java+SpringBoot+Vue的旅游管理系统设计与实现
java·vue.js·spring boot
从兄1 小时前
vue 使用docx-preview 预览替换文档内的特定变量
javascript·vue.js·ecmascript
昨天今天明天好多天2 小时前
【数据仓库】
大数据
油头少年_w2 小时前
大数据导论及分布式存储HadoopHDFS入门
大数据·hadoop·hdfs
凉辰2 小时前
设计模式 策略模式 场景Vue (技术提升)
vue.js·设计模式·策略模式
清灵xmf3 小时前
在 Vue 中实现与优化轮询技术
前端·javascript·vue·轮询
大佩梨3 小时前
VUE+Vite之环境文件配置及使用环境变量
前端
GDAL3 小时前
npm入门教程1:npm简介
前端·npm·node.js