vue.js 实现 todo list 任务表单

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

有关点击复选框 未完成数字的变化 bug 已经修复   

  添加

 clickInput: function(lsi){

        var om = this.items.indexOf(lsi);       //获取相应的索引值
         if(this.items[om].isChecked)
               {                             //如果选中未完成任务减一 否则加一

            this.num =  this.num-1;    
               }
               else
               {
                   this.num =  this.num+1;
               }
     },

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

今天在腾讯课堂学习关于用vue.js 制作todo list 任务表单   然后自己写了一遍,用来加强记忆和总结

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

如果有错误 望指正 ps;反正我运行时没有错误偷笑偷笑


部分功能还未实现   后续将添加

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

html 源码

<!DOCTYPE html>
<html>
<head>
	
	<meta charset='utf-8' />
	<title>todo list</title>
	<link rel="stylesheet" type="text/css" href="./todo-list.css" />
</head>
<body>
     <div id="head">
     	  任务计划列表
     </div>    
     <div id="main">
     	  <div class="name">添加任务</div>
     	  <!-- 添加键盘事件   并将input的value值 用intext获取 -->
     	  <input type="text" v-model='intext' v-on:keyup.enter='addList' />
     	  <!-- 添加隐藏的指令 并给出依据 show show不等于0时展示 -->
     	  <div class="task" v-show="show">
     	      <span><i v-text="num"></i>个任务未完成</span>
     	      <div class="task_type">
     	      	<a href="javascript:void(0)">所有任务</a>
     	  	    <a href="javascript:void(0)">未完成任务</a>
     	  	    <a href="javascript:void(0)">完成任务</a>
     	      </div>
     	  	  
     	  </div>
     	  <div class="list">
     	  	   <ul>
     	  	      <!-- 循环产生li标签及其内部标签   并判断是否有内容 没有则不展示 因为在初始化时会产生一个空标签所以才会判断 以免产生空任务 -->
     	  	   	   <li v-for='item in items' v-show='item.text' >
     	  	   	    <!-- 动态添加class 当点击选中时添加hidd 目的是显示复选框和删除  
     	  	   	          input 的选择中状态由 ischecked 的值决定 -->
     	  	   	   	  <div id="box"><input type="checkbox" :class='{hidd:item.isChecked}' v-model='item.isChecked' v-on:click='clickInput(item)'/></div>
     	  	   	   	  <!-- class和前面一样里面包含选中时出现删除线  标签内的内容由text决定 而text由输入内容决定 -->
     	  	   	   	  <span v-on:click='clickselect(item)' :class='{hidd:item.isChecked}' >{{item.text}}</span>
     	  	   	   	  <!-- class相同   添加点击删除函数  并且函数接受当前的item,由于去判断在数组中的索引 确定位置 -->
     	  	   	   	  <a href="javascript:void(0)"  :class='{hidd:item.isChecked}' v-on:click='deletList(item)'>删除</a>
     	  	   	   </li>
     	  	   	   
     	  	   </ul>
     	  	   </ul>
     	  </div>
     </div>
     <script type="text/javascript" src='./vue.js'></script>
     <script type="text/javascript" src='./todo-list.js'></script>
</body>
</html>


js 源码

// 实例化


var main = new Vue({
    el:"#main",
    
    data:{
    	items:[
    		 {text:null , isChecked:false },   // ischecked 判断是否被选中
    	],
    	intext:'请输入任务',
       
        show: 0,    // 添加判断是否展示输入框下的任务栏依据 初始为0 不展示 
        num: 0,         //  判断未完成的任务数量 初始为0 即没有添加任何任务时
    },

    methods:{
    	 // 添加任务函数
    	addList: function(){
              console.log(this.intext);
              console.log(this.items[0].text);
              if(this.intext.length!=0)      // 判断输入框是否有输入内容
              {
              	this.items.push({          
              	 		text: this.intext,  // 将输入内容添加到 items.text内
              	 		isChecked:false,     // 使刚输入的未被选中 (注意即使不添加这句也会不选中
              	 		                      // 但是数组items内相应位置就不会出现ischecked 会使后面需要选中时出现问题)
              	 		
              			});
              	this.show = this.show+1;    //每添加一个任务 任务的总个数加一
              	this.num =  this.num+1;      // 每添加一个任务 未完成任务的总个数加一
              }
              
              // 清空输入框内容
              this.intext = '';  
    	},
    	// 点击文字选中复选框
    	clickselect:function(lsi){
    		   console.log(this.items.indexOf(lsi));
    		   var om = this.items.indexOf(lsi);       //获取相应的索引值
    		   this.items[om].isChecked = !this.items[om].isChecked;  // 当点击相应任务时
    		   														// 选择的状态发生改变
               if(this.items[om].isChecked)
               {                             //如果选中未完成任务减一 否则加一

    		      this.num =  this.num-1;     
               }
               else
               {
               	   this.num =  this.num+1; 
               }
    	},
clickInput: function(lsi){                     //添加点击input标签时 num 也变化
        var om = this.items.indexOf(lsi);       //获取相应的索引值
         if(this.items[om].isChecked)
               {                             //如果选中未完成任务减一 否则加一
            this.num =  this.num-1;     
               }
               else
               {
                   this.num =  this.num+1; 
               }
     },
    	// 点击删除
    	deletList: function(lsi){
    		  var om = this.items.indexOf(lsi);
    		  // this.items[om].text=''; //这样并没有完全从数组清除
              
              // 当点击删除时 未完成任务数量变化
              // 变化依据任务是否已经被选中而变化
              // 不能将移出数组先执行 这样就会导致无法判断是否之前已经被选中
              if( this.items[om].isChecked == true)   
              {
              	this.num =  this.num;
              }
              else
              {
              	this.num =  this.num-1;
              }
              this.show= this.show-1;     // 任务总数减一  如果总数等于0时 隐藏
    		  this.items.splice(om,1);     // 移出相应任务

    	}
    }


})



css 源码

body{padding: 0;margin:0; font-size: 14px; font-family: '微软雅黑';}
ul,li,a,div,input,span {padding: 0; margin:0;}
a{text-decoration: none; color: #000;}
ul,li {list-style-type: none;}
/*顶部布局*/
#head {
		width: 100%;
		height: 50px;
		font-size: 18px;
		font-weight: bold;
		line-height: 50px;
		text-align: center; }

#main {
	   width: 400px;
	   margin:5px auto;

}
#main .name {
	    font-size: 16px;
	    font-weight: bold;
}
#main input {
	   width: 400px;
	   height: 35px;
       outline: none;
}
#main .task{
	  margin:10px 0;
	  height: 32px;
	  overflow: hidden;
	  line-height: 32px;
}
#main .task span {
	 display: block;
	 height: 30px;
	 float: left;
}
#main .task  .task_type{
	 float: right;
}
#main .task  .task_type a{
		display: block; 
		height: 30px; 
		padding: 0 5px;
		line-height: 30px; 
		border:1px solid #ccc;
		text-decoration: center;
		float: left;
		margin-left: 10px;
	    }
#main .list {
	   width: 400px;

	   clear: both;
}
#main .list ul{
	  width: 400px;
}
#main .list ul li {
	  width: 400px;
	  height: 30px;
	  line-height: 30px;
	  display: block;
	  overflow: hidden;
}
#main .list ul li #box {
	 float: left;
	 width: 16px;
	 height:16px;
	 margin:7px 0;
}
#main .list ul li input{
	 display: none;
	
	 width: 16px;
	 height:16px;
	


}
#main .list ul li:hover a{
     display: block;
}
#main .list ul li:hover input{
     display: block;
}
#main .list ul li .hidd {
	display: block;
	color: #ccc;
	text-decoration: line-through;
}
#main .list ul li span {
	 display: block;
	 float: left;
	 margin-left: 20px;

}

#main .list ul li a{

	 display: none;
	 float: left;
	 margin-left: 20px;
}

下面是我运行的界面

 刚进入界面


添加第一个任务

   

鼠标悬停

        


单击选中

        



单击删除



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

原谅我还不太会用csdn

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

       



  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,以下是利用Vue.js设计的一个简单的代办事项提醒应用程序的代码: ```html <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Vue.js Todo App</title> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.0/dist/css/bootstrap.min.css"> <style> .completed { text-decoration: line-through; color: gray; } </style> </head> <body> <div class="container mt-5" id="app"> <h3 class="mb-3">Vue.js Todo App</h3> <form @submit.prevent="addTodo"> <div class="input-group mb-3"> <input type="text" class="form-control" placeholder="Add new todo" v-model="newTodo"> <button type="submit" class="btn btn-primary" :disabled="!newTodo">Add</button> </div> </form> <div class="row"> <div class="col-12 col-md-6"> <div class="mb-3"> <button class="btn btn-secondary me-2" @click="filter = 'all'">All</button> <button class="btn btn-secondary me-2" @click="filter = 'pending'">Pending</button> <button class="btn btn-secondary me-2" @click="filter = 'completed'">Completed</button> <button class="btn btn-danger me-2" @click="clearCompleted" v-show="completedTodos.length">Clear Completed</button> </div> <div class="list-group"> <a href="#" class="list-group-item list-group-item-action" v-for="(todo, index) in filteredTodos" :key="index" :class="{ completed: todo.completed }"> <input type="checkbox" class="form-check-input me-2" v-model="todo.completed" @change="updateStatus"> {{ todo.text }} <button type="button" class="btn-close float-end" @click.prevent="remove(index)"></button> </a> </div> </div> <div class="col-12 col-md-6"> <div class="card"> <div class="card-body"> <h5 class="card-title">Todo Status</h5> <p class="card-text">Total: {{ totalTodos }}</p> <p class="card-text">Pending: {{ pendingTodos }}</p> <p class="card-text">Completed: {{ completedTodos.length }}</p> </div> </div> </div> </div> </div> <script src="https://cdn.jsdelivr.net/npm/vue@2.6.14/dist/vue.min.js"></script> <script> new Vue({ el: '#app', data: { todos: [ { text: 'Learn Vue.js', completed: false }, { text: 'Build a Todo app', completed: true }, { text: 'Deploy it to Netlify', completed: false } ], newTodo: '', filter: 'all' }, methods: { addTodo() { this.todos.push({ text: this.newTodo, completed: false }); this.newTodo = ''; }, remove(index) { this.todos.splice(index, 1); }, updateStatus() { localStorage.setItem('todos', JSON.stringify(this.todos)); }, clearCompleted() { this.todos = this.todos.filter(todo => !todo.completed); } }, computed: { filteredTodos() { if (this.filter === 'all') { return this.todos; } else if (this.filter === 'pending') { return this.todos.filter(todo => !todo.completed); } else { return this.todos.filter(todo => todo.completed); } }, totalTodos() { return this.todos.length; }, pendingTodos() { return this.todos.filter(todo => !todo.completed).length; }, completedTodos() { return this.todos.filter(todo => todo.completed); } }, mounted() { if (localStorage.getItem('todos')) { try { this.todos = JSON.parse(localStorage.getItem('todos')); } catch (e) { localStorage.removeItem('todos'); } } } }); </script> </body> </html> ``` 代码中使用了Bootstrap 5和Vue.js的CDN。在HTML中,我们首先定义了一个表单,用于添加新的代办事项。表单中有一个输入框和一个添加按钮。输入框使用了v-model指令,将输入的内容与Vue实例中的newTodo属性绑定。 接下来,我们定义了一个div,用于显示代办事项列表。在这个div中,我们通过v-for指令遍历todos数组,将每个代办事项渲染成一个列表项。列表项中包含一个复选框、代办事项文本和一个删除按钮。复选框使用了v-model指令,将其选中状态与每个代办事项的completed属性绑定。 在每个列表项右侧,我们定义了一个删除按钮,用于删除该代办事项。删除按钮使用了@click.prevent指令,阻止默认事件,并调用remove方法从todos数组中删除该代办事项。 除此之外,还定义了一个状态显示栏。状态显示栏中包含了剩余项目数、全部按钮、待完成按钮、已完成按钮和清除完成按钮等功能。这些按钮都绑定了相应的点击事件,通过改变filter属性的值,来控制代办事项列表的显示。 最后,在Vue实例中,我们定义了todos数组、newTodo属性、filter属性和一些方法和计算属性。其中,addTodo方法用于添加新的代办事项,remove方法用于删除代办事项,updateStatus方法用于更新代办事项的状态,clearCompleted方法用于清除已完成的代办事项。 computed属性中,我们定义了filteredTodos、totalTodos、pendingTodos和completedTodos等计算属性,用于控制代办事项列表的显示和状态栏的更新。 在mounted钩子函数中,我们从localStorage中获取已经保存的代办事项列表,并将其赋值给todos数组。这样,当用户刷新页面时,之前添加的代办事项就不会丢失了。 以上就是利用Vue.js设计的一个简单的代办事项提醒应用程序的代码。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值