用vue.js写案例——ToDoList待办事项 (步骤和全码解析)

这篇具有很好参考价值的文章主要介绍了用vue.js写案例——ToDoList待办事项 (步骤和全码解析)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一.准备工作

二.编写各个组件的页面结构

三.实现初始任务列表的渲染

四.新增任务

五.删除任务

六.展示未完成条数

七.切换状态-筛选数据

八.待办事项(全)代码


一.准备工作

在开发“ToDoList”案例之前,需要先完成一些准备工作,包括创建项目、引入 BootStrap 样式文件和搭建基本项目结构,下面分别进行实现。

(1)创建项目 创建项目包含新建项目、安装依赖项和运行项目,具体步骤如下。

① 创建项目。使用HbuliderX软件创建todolist项目 在src的目录下创建style.css 文件中的样式,具体代码如下。

style.css样式如下:

:root {
 
font-size: 16px;
 }
 body {
 
 margin: 0;
 }

② 新建并封装组件。在D:\vue\chapter03\todolist\src\components 目录下新建文件 ToDoHeader.vue、ToDoMain.vue 和 ToDoFooter.vue,分别表示 ToDoHeader、ToDoMain 和ToDoFooter 组件。

用vue.js写案例——ToDoList待办事项 (步骤和全码解析),vue.js,前端,javascript

③ 各个组件中的<style>节点的样式代码。

二.编写各个组件的页面结构

准备工作完成之后,接下来编写各个组件的页面结构,实现“ToDoList”案例静态页 面的渲染,具体步骤如下。

①在App组件中以局部注册的方式引入ToDoHeader、ToDoMain、ToDoFooter组 件

用vue.js写案例——ToDoList待办事项 (步骤和全码解析),vue.js,前端,javascript

 ②在ToDoHeader组件中编写输入区域的页面结构

用vue.js写案例——ToDoList待办事项 (步骤和全码解析),vue.js,前端,javascript

③ 在ToDoMain组件中编写列表区域的页面结构

用vue.js写案例——ToDoList待办事项 (步骤和全码解析),vue.js,前端,javascript

④ 在ToDoFooter组件中编写切换状态区域的页面结构

用vue.js写案例——ToDoList待办事项 (步骤和全码解析),vue.js,前端,javascript

三.实现初始任务列表的渲染

App 组件为根组件,数据在App组件中,现在需要将App根组件中的初始数据传递 到列表区域,ToDoMain组件中。即通过props(自定义属性)从父组件(App组件)向 子组件(ToDoMain组件)中传递数据。实现初始任务列表具体步骤如下。

① 在ToDoMain组件中定义可以从父组件中接收的数据

用vue.js写案例——ToDoList待办事项 (步骤和全码解析),vue.js,前端,javascript

② 在App组件中定义页面的初始数据

用vue.js写案例——ToDoList待办事项 (步骤和全码解析),vue.js,前端,javascript

③ 通过自定义属性进行传递数据

用vue.js写案例——ToDoList待办事项 (步骤和全码解析),vue.js,前端,javascript

④ 修改ToDoMain组件中的代码,将接收到的list数据进行展示。

用vue.js写案例——ToDoList待办事项 (步骤和全码解析),vue.js,前端,javascript

四.新增任务

“ToDoList”案例中在文本框中输入内容,按下回车后添加任务到任务列表,将用户 输入的任务名称通过自定义事件从ToDoHeader组件传递到App组件,具体步骤如下代码省略。、

① 修改ToDoHeader组件中的代码,添加页面的初始数据

用vue.js写案例——ToDoList待办事项 (步骤和全码解析),vue.js,前端,javascript

② 获取input输入框的值,修改ToDoHeader组件中的代码

用vue.js写案例——ToDoList待办事项 (步骤和全码解析),vue.js,前端,javascript

③ 修改ToDoHeader组件中的代码,为input输入框绑定回车事件,事件处理函数 名称为enterName

用vue.js写案例——ToDoList待办事项 (步骤和全码解析),vue.js,前端,javascript

④ 修改ToDoHeader组件中的代码,通过调用defineEmits()方法来声明自定义事 件

用vue.js写案例——ToDoList待办事项 (步骤和全码解析),vue.js,前端,javascript

⑤ 在ToDoHeader组件中添加enterName()方法,通过调用emit()方法触发自定义事 件

用vue.js写案例——ToDoList待办事项 (步骤和全码解析),vue.js,前端,javascript

⑥ 在App组件中监听addTodo自定义事件,当enterName事件触发时,调用 addToDo()方法

用vue.js写案例——ToDoList待办事项 (步骤和全码解析),vue.js,前端,javascript

⑦ 添加addToDo方法,实现数据的处理

用vue.js写案例——ToDoList待办事项 (步骤和全码解析),vue.js,前端,javascript

五.删除任务

当鼠标指针滑到任务列表中每一项时,在右侧会出现“×”图标,单击该图标即可 进行删除当条任务操作。首先在ToDoMain组件中声明并触发自定义事件,传递参数 6 id,接着在App组件中监听自定义事件,当自定义事件被触发时,执行对应的方法,进 行删除操作,删除任务的具体实现步骤如下。

① 在ToDoMain组件中,声明自定义事件delTodo,用于表示删除任务

用vue.js写案例——ToDoList待办事项 (步骤和全码解析),vue.js,前端,javascript

② 在ToDoMain组件中定义delToDo()方法,触发自定义事件

用vue.js写案例——ToDoList待办事项 (步骤和全码解析),vue.js,前端,javascript

③ 修改删除按钮的代码,添加点击事件,传入需要删除的id

用vue.js写案例——ToDoList待办事项 (步骤和全码解析),vue.js,前端,javascript

④ 在App组件中监听

用vue.js写案例——ToDoList待办事项 (步骤和全码解析),vue.js,前端,javascript

⑤ 在App组件中添加delToDo方法,进行列表中对应任务的删除操作

用vue.js写案例——ToDoList待办事项 (步骤和全码解析),vue.js,前端,javascript

六.展示未完成条数

在任务状态区域的左侧会显示未完成任务的条数,接下来计算未完成任务的条数并 将其在页面中渲染出来,具体步骤如下代码省略。

① 在App组件中定义计算属性,计算未完成的任务条数

用vue.js写案例——ToDoList待办事项 (步骤和全码解析),vue.js,前端,javascript

 ② 将自定义属性传给ToDoFooter组件

用vue.js写案例——ToDoList待办事项 (步骤和全码解析),vue.js,前端,javascript

③ 在ToDoFooter组件中接收lastLength

用vue.js写案例——ToDoList待办事项 (步骤和全码解析),vue.js,前端,javascript

④ 在ToDoFooter组件中将条数展示出来

用vue.js写案例——ToDoList待办事项 (步骤和全码解析),vue.js,前端,javascript

七.切换状态-筛选数据

单击切换状态区域时,默认状态为all,即显示全部任务,当状态切换为active时, 显示未完成的任务,当状态切换为completed时,显示已完成的任务,实现切换数据筛选 状态具体步骤如下代码省略。

① 首先在App组件中定义页面的使用一个任务状态状态属性status

用vue.js写案例——ToDoList待办事项 (步骤和全码解析),vue.js,前端,javascript

② 在App组件中通过不同的status展示不同的任务,实现任务数据的切换

用vue.js写案例——ToDoList待办事项 (步骤和全码解析),vue.js,前端,javascript

③ 修改App组件,将showList传递给ToDoMain组件

用vue.js写案例——ToDoList待办事项 (步骤和全码解析),vue.js,前端,javascript

④ 设置自定义事件名称

用vue.js写案例——ToDoList待办事项 (步骤和全码解析),vue.js,前端,javascript

⑤ 在ToDoFooter组件中定义props属性,表示从父组件中接收该数据

用vue.js写案例——ToDoList待办事项 (步骤和全码解析),vue.js,前端,javascript

⑥ 在App组件中定义props,即从App组件中传递status到ToDoFooter组件中

用vue.js写案例——ToDoList待办事项 (步骤和全码解析),vue.js,前端,javascript

⑦ 在ToDoFooter组件中单击链接按钮时更改状态

用vue.js写案例——ToDoList待办事项 (步骤和全码解析),vue.js,前端,javascript

⑧ 在App组件中监听updateStatus自定义事件,通过自定义事件将status属性的值 从ToDoFooter组件传递到App组件中,具体代码如下

用vue.js写案例——ToDoList待办事项 (步骤和全码解析),vue.js,前端,javascript

⑨ 定义updateStatus()方法,用来更新状态,具体代码如下。

用vue.js写案例——ToDoList待办事项 (步骤和全码解析),vue.js,前端,javascript

八.待办事项(全)代码

用vue.js写案例——ToDoList待办事项 (步骤和全码解析),vue.js,前端,javascript

ToDoFooter.vue代码:

<template>
	<div class="footer">
		<span class="todo-count">共<strong>{{ lastLength }}</strong>条未完成任务 </span>
		<ul class="filters">
		
			<ul class="filters">
				<li>
					<a @click.prevent="emit('updateStatus', 'all')" :class="{ selected: status === 'all' }"
						href="#/">All</a>
				</li>
				<li>
					<a @click.prevent="emit('updateStatus', 'active')" :class="{ selected: status === 'active' }"
						href="#/active">Active</a>
				</li>
				<li>
					<a @click.prevent="emit('updateStatus', 'completed')" :class="{ selected: status === 'completed' }"
						href="#/completed">Completed</a>
				</li>
			</ul>
		</ul>
	</div>
</template>

<script setup>
	const props = defineProps(['lastLength', 'status'])
	const emit = defineEmits(['updateStatus'])
</script>

<style>
	.footer {
		padding: 10px 15px;
		height: 20px;
		text-align: center;
		font-size: 15px;
		border-top: 1px solid #e6e6e6;
	}

	.footer:before {
		content: "";
		position: absolute;
		right: 0;
		bottom: 0;
		left: 0;
		height: 50px;
		overflow: hidden;
		box-shadow: 0 1px 1px rgba(0, 0, 0, 0.2), 0 8px 0 -3px #f6f6f6,
			0 9px 1px -3px rgba(0, 0, 0, 0.2), 0 16px 0 -6px #f6f6f6,
			0 17px 2px -6px rgba(0, 0, 0, 0.2);
	}

	.todo-count {
		float: left;
		text-align: left;
	}

	.todo-count strong {
		font-weight: 300;
	}

	.filters {
		float: right;
		margin: 0;
		padding: 0;
		list-style: none;

	}

	.filters li {
		display: inline;
	}

	.filters li a {
		color: inherit;
		margin: 3px;
		padding: 3px 7px;
		text-decoration: none;
		border: 1px solid transparent;
		border-radius: 3px;
		border-color: #767676;

	}

	.filters li a:hover {
		border-color: #db7676;
	}
	.selected {
		border-color: #db7676;
	}
</style>

ToDoHeader.vue代码: 

<template>
	<div>
	 
	 <div class="header">
	 
	<p class="title">待办事项</p>
	 
	 <input class="new-todo" type="text" placeholder="请填写任务" v-model.trim="name"  @keyup.enter="enterName" />
	 
	 </div>
	 
	</div>
	
</template>

<script setup>
	import { ref } from 'vue'
	 const name = ref('')
	  const enterName = () => {
	  emit('addTodo', name.value)
	  name.value = ''
	  }
	  const emit = defineEmits(['addTodo'])

</script>

<style>
	.title{
		border-bottom:1px solid grey;
		text-align:center;
		font-size:36px;
		color:brown;
	}
	.header{
		border:1px solid grey;
	}
	
	.new-todo{
		position: relative;
		top:-20px;
		left: 50px;
		border: none;
		font-size: 20px;
	}
	
</style>

 ToDoMain.vue代码:

<template>
	<div class="main">
	 <ul class="todo-list">
	 <li v-for="item in list" :key="item.id" :class="{ completed: item.done }">
	  <div class="view">
	  <input class="toggle" type="radio" v-model="item.done" />
	  <label class="zi">{{ item.name }}</label>
	  <button class="destroy" @click="delTodo(item.id)"></button>
	  </div>
	  
	  </li>
	 </ul>
	 
	 </div>
	 
</template>

<script setup>
	const props = defineProps({
			list: {
				type: Array,
				required: true
			},
			})
	const emit = defineEmits(['delTodo'])
  const delTodo = id => {
  id && emit('delToDo', id) // 触发事件
  }
</script>

<style>
.toggle{
	width: 30px;
	height: 30px;

}
.view{

margin-left: -40px;	
}
.zi{
	font-size: 18px;
   padding-left: 20px;

}
.destroy{
	border: none;
	margin-left: 10px;
}
</style>

App.vue代码:

<template>
  <ToDoHeader @addTodo="addTodo" />
  <ToDoMain :list="showList" @delToDo="delToDo" />
  <ToDoFooter :lastLength="lastLength" :status="status" @updateStatus="updateStatus" />
</template>

<script setup>
import ToDoHeader from './components/ToDoHeader.vue'
import ToDoMain from './components/ToDoMain.vue'
import ToDoFooter from './components/ToDoFooter.vue'

import { ref, computed } from 'vue'

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

const addTodo = name => {
  list.value.push({ name, done: false, id: ~~(Math.random() * 1000) })
}

const delToDo = id => {
  list.value = list.value.filter(item => item.id !== id)
}

// 计算剩下没有完成任务的条数
const lastLength = computed(() => {
  return list.value.filter(item => !item.done).length
})

const showList = computed(() => {
  if (status.value === 'all') {
    return list.value;
  }
  if (status.value === 'active') {
    return list.value.filter(item => !item.done)
  }
  if (status.value === 'completed') {
    return list.value.filter(item => item.done)
  }
})

const updateStatus = (status1) => {
  status.value = status1   // 将子组件的状态赋值给父组件
}
</script>

main.js代码:

import { createApp } from 'vue'
import App from './App.vue'
createApp(App).mount('#app')

 最终效果图如下:

用vue.js写案例——ToDoList待办事项 (步骤和全码解析),vue.js,前端,javascript

 功能展示:

用vue.js写案例——ToDoList待办事项 (步骤和全码解析),vue.js,前端,javascript今天就分享到此,感谢预览~ 文章来源地址https://www.toymoban.com/news/detail-849122.html

到了这里,关于用vue.js写案例——ToDoList待办事项 (步骤和全码解析)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 用Vue做一个待办事项

            这个待办事项有以下功能:增删查,既新增待办事项,删除待办事项,查看全部,未完成,完成待办事项,当鼠标移动到待办事项上时会显示删除按钮         分为四个部分来实现:ToDoHeader.vue、ToDoMain.vue、ToDoFooter.vue、ToDoList.vue 头部部分 列表总体样式和删除样

    2024年04月25日
    浏览(23)
  • Vue待办事项(组件,模块化)

    //html页面代码 !DOCTYPE html html     head         meta charset=\\\"utf-8\\\"         title/title         style             * {                 padding: 0;                 margin: 0;             }             ul,             ol {                 list-style: none;     

    2024年01月21日
    浏览(37)
  • vue小案例TodoList

    1.首先我们分析怎么把一个页面拆成多个组件,如下图,我们可以拆成MyHeader、MyList、MyItem、MyFooter,其中MyList包含MyItem 2.观看如下代码(我们把MyItem作为MyList的子组件,在父组件中使用v-for指令来循环展示子组件,我们选择把数据放在MyList中,我们在子组件中使用props来接收父

    2024年02月06日
    浏览(21)
  • Vue中TodoList案例_动画

    MyItem.vue :  主要是引入了import \\\'animate.css\\\'样式库,animate.css样式库配置见上一篇文章animate.css样式库,然后再li标签外套了transition标签,引用了name里面的名称是animate.css拿过来的,绑定了enter-active-class和leave-active-classanimate库内自带的绑定样式  

    2024年02月15日
    浏览(24)
  • Vue中TodoList案例_编辑

    nextTick:  MyItem.vue 加一个编辑按钮,input框:@blur失去焦点时触发事件handleBlur,ref获取真实dom: methods加俩方法: App.vue: methods:中加一个方法 mounted钩子中添加 beforeDestroy钩子中添加 style中加编辑按钮样式:  

    2024年02月15日
    浏览(25)
  • Vue中TodoList案例_勾选

    与上一篇Vue中TodoList案例_添加有三个文件变化了 App.vue :中加了checkTodo方法 MyList.vue :中拿到checkTodo,再传给MyItem MyItem.vue: 定义change改变时候触发方法将id传给App.vue 效果 :勾选时候数据动态变化  

    2024年02月16日
    浏览(23)
  • Vue中TodoList案例_本地存储

    App.vue 效果 :数据存储再localStroage中,刷新浏览器保存的数据仍在。   

    2024年02月15日
    浏览(37)
  • Vue2-浏览器本地存储(WebStorage)及完善TodoList案例、组件自定义事件及完善TodoList案例

    🥔:山不向我走来,我便向它走去 更多Vue知识请点击——Vue.js 存储内容大小一般支持5MB左右(不同浏览器可能还不一样) 浏览器端通过 Window.sessionStorage 和 Window.localStorage 属性来实现本地存储机制。 1.相关API (1) xxxxxStorage.setItem(\\\'key\\\', \\\'value\\\'); 该方法接受一个键和值作为参

    2024年02月12日
    浏览(31)
  • 手机待办事项app哪个好?

    手机是日常很多人随身携带的设备,手机除了拥有通讯功能外,还能帮助大家高效管理日常工作,借助手机上的待办事项提醒APP可以快速地帮助大家规划日常事务,提高工作的效率。 过去,我也曾经在寻找一款能够将工作任务清晰罗列的APP时,在通过对多款软件进行对比后,

    2024年02月07日
    浏览(29)
  • 小程序样例3:根据日历创建待办事项

    1、待办事项查看 选择不同的日期显示不同的待办: 2、选择日期后 新增事项: 3. 点击事项,查看详情 4、删除事项:删除事项3之后,剩余事项2 5、点击日期可以选择更多的月: 1、数据结构: 2、代码结构: DataService 是服务层接口,业务JS代码与之打交道 同时Service调用Repos

    2024年01月25日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包