简单的TODO列表实现

使用bootstrap和vue实现该项目

1.使用表单元素和按钮完成添加框、搜索框书写完成按钮和搜素框,其中用<h></h>标签来显示标题。

<h1>TODO列表</h1>
			<div class="form-row">
				<div class="col">
					<input type="text" class="form-control" id="tile" placeholder="请输入任务" name="tile" v-model="tile">
				</div>
				<div class="col">
					<button class="btn btn-primary" @click="add">添加</button>
				</div>
			</div>
<div class="form-row">
				<div class="col">
					<input type="text" class="form-control" id="tile" placeholder="请输入你要搜索的任务" v-model="find">
				</div>
				<div class="col">
					<button class="btn btn-primary" @click="finished()">搜索</button>
				</div>
			</div>

2.用表格完成待完成列表和已完成列表

<h3>待完成列表</h3>
				<table class="table table-bordered">
					<tr>
						<th>编号</th>
						<th>内容</th>
						<th>操作</th>
					</tr>
<table class="table table-bordered">
				<tr>
					<th>编号</th>
					<th>内容</th>
					<th>状态</th>
				</tr>

3.:使用Vue分别完成待完成列表功能

用v-for来实现点击增加按钮时,则把数据添加在表格内

<tr v-for="(a,index) in users">
						<td>{{index+1}}</td>
						<td>{{a.tile}}</td>
						<td>
							<button class="btn btn-primary" @click="finishs(index)">完成</button>
						</td>
var vm = new Vue({
			el: "#app",
			data: {
				tile: "",

4.使用Vue完成已完成列表功能

<tr v-for="(b,index) in finished":key="index">
					<td>{{index+1}}</td>
					<td>{{b.tile}}</td>
					<td> 已完成</td>
				</tr>

5.添加按钮点击事件,其中注意用v-model实现数据的双向绑定

methods: {
				add() {

					this.users.push({
						tile: this.tile
					})
				},
				finishs(index) {
					this.finish.push(this.users[index])
					this.users.splice(index, 1)
				},
				
			},

6.用监听方法和js中的filter实现搜素功能

computed:{
				finished(){
					return this.finish.filter((cat) => {
						return cat.tile.indexOf(this.find) !== -1
					})
				}

最终完整代码如下

<!DOCTYPE html>
<html>
	<head>
		<script src="js/vue.js"></script>
		<link rel="stylesheet" href="bootstrap/css/bootstrap.css">
		<meta charset="utf-8" />
		<title></title>
	</head>
	<body>
		<div class="container" id="app">
			<h1>TODO列表</h1>
			<div class="form-row">
				<div class="col">
					<input type="text" class="form-control" id="tile" placeholder="请输入任务" name="tile" v-model="tile">
				</div>
				<div class="col">
					<button class="btn btn-primary" @click="add">添加</button>
				</div>
			</div>
			<br />

			<div>
				<h3>待完成列表</h3>
				<table class="table table-bordered">
					<tr>
						<th>编号</th>
						<th>内容</th>
						<th>操作</th>
					</tr>
					<tr v-for="(a,index) in users">
						<td>{{index+1}}</td>
						<td>{{a.tile}}</td>
						<td>
							<button class="btn btn-primary" @click="finishs(index)">完成</button>
						</td>
					</tr>
				</table>
			</div>
			<br>
			<h3>已完成列表</h3>
			<div class="form-row">
				<div class="col">
					<input type="text" class="form-control" id="tile" placeholder="请输入你要搜索的任务" v-model="find">
				</div>
				<div class="col">
					<button class="btn btn-primary" @click="finished()">搜索</button>
				</div>
			</div>
			<br>
			<table class="table table-bordered">
				<tr>
					<th>编号</th>
					<th>内容</th>
					<th>状态</th>
				</tr>
				<tr v-for="(b,index) in finished":key="index">
					<td>{{index+1}}</td>
					<td>{{b.tile}}</td>
					<td> 已完成</td>
				</tr>
			</table>


		</div>

	</body>
	<script>
		var vm = new Vue({
			el: "#app",
			data: {
				tile: "",
				users: [],
				finish: [],
				find: ""
			},
			methods: {
				add() {

					this.users.push({
						tile: this.tile
					})
				},
				finishs(index) {
					this.finish.push(this.users[index])
					this.users.splice(index, 1)
				},
				
			},
			computed:{
				finished(){
					return this.finish.filter((cat) => {
						return cat.tile.indexOf(this.find) !== -1
					})
				}
			}



		})
	</script>
</html>

运行效果如下

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现无限加载的一般思路是在滚动到页面底部时,自动加载下一页数据。Vue中可以通过监听滚动事件来实现。 以下是一个简单的示例代码: ```html <template> <div class="list-container" ref="listContainer" @scroll="handleScroll"> <ul> <li v-for="(item, index) in items" :key="index">{{ item }}</li> <li v-if="loading">Loading...</li> </ul> </div> </template> <script> export default { data() { return { items: [], // 列表数据 pageNum: 1, // 当前页码 loading: false, // 是否正在加载数据 pageSize: 20 // 每页数据条数 }; }, mounted() { // 初始化加载第一页数据 this.loadMore(); }, methods: { handleScroll() { const listContainer = this.$refs.listContainer; const scrollHeight = listContainer.scrollHeight; const scrollTop = listContainer.scrollTop; const clientHeight = listContainer.clientHeight; // 当滚动到底部时,并且当前没有正在加载数据时,自动加载下一页数据 if (scrollHeight - scrollTop - clientHeight < 20 && !this.loading) { this.loadMore(); } }, async loadMore() { this.loading = true; // 开始加载数据 try { const data = await this.fetchData(this.pageNum, this.pageSize); // 将数据合并到原有列表数据中 this.items = this.items.concat(data.items); this.pageNum++; } catch (err) { console.error(err); } finally { this.loading = false; // 结束加载数据 } }, fetchData(pageNum, pageSize) { // TODO: 发送请求获取数据 } } }; </script> ``` 在上面的代码中,我们监听了列表容器的滚动事件,当滚动到底部时就会触发`loadMore`方法加载下一页数据。在加载数据过程中,我们将`loading`标志设置为`true`,表示正在加载数据,防止重复加载。当数据加载完成后,我们将新的数据合并到原有列表数据中,并将`loading`标志设置为`false`,表示数据加载完成。 需要注意的是,在实际开发中,我们需要根据具体的业务场景来调整代码。例如,如果列表数据过多,可能需要对数据进行分页处理;如果数据加载失败,可能需要进行错误处理等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值