Vue 案例练习

项目前导 学习笔记

一、图书管理系统(当然是假的,没有与数据库进行交互)


        给大家介绍一个 web 页面样式的网站,直接复制它的代码可以更方便的开发。

        Bootstrap 官网:https://www.bootcss.com/
        该案例用到的样式:https://v3.bootcss.com/components/#navbar-forms


    大致长这样:

在这里插入图片描述


1.1、整体的结构

	<head>
		...
    	<!-- 最新版本的 Bootstrap 核心 CSS 文件 -->
	    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/css/bootstrap.min.css">
	</head>

页面代码:

	<!DOCTYPE html>
	<html lang="en">
	<head>
	    <meta charset="UTF-8">
	    <title>图书管理系统</title>
	    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/css/bootstrap.min.css">
	</head>
	<body>
	    <div id="app">
	        <!-- bootstrap 中居中样式 -->
	        <div class="container">
	            <h1>图书管理系统</h1>
	            <form class="navbar-form navbar-left" role="search">
	                <div class="form-group">
	                    <label>书名:</label>
	                    <input type="text" class="form-control" placeholder="请输入图书名字">
	                </div>
	                <div class="form-group">
	                    <label>作者:</label>
	                    <input type="text" class="form-control" placeholder="请输入图书作者">
	                </div>
	                <div class="form-group">
	                    <label>价格:</label>
	                    <input type="text" class="form-control" placeholder="请输入图书价格">
	                </div>
	                <div class="form-group">
	                    <label>搜索:</label>
	                    <input type="text" class="form-control" placeholder="请输入搜索内容">
	                </div>
	                <button type="button" class="btn btn-default">添加</button>
	            </form>
	
	
	            <!-- bootstrap 带表格的面板样式 -->
	            <table class="table">
	                <tr>
	                    <th>序号</th>
	                    <th>书名</th>
	                    <th>作者</th>
	                    <th>价格</th>
	                    <th>时间</th>
	                    <th>操作</th>
	                </tr>
	                <tr v-for="(book, index) in books">
	                    <td>{{index}}</td>
	                    <td>{{book.name}}</td>
	                    <td>{{book.author}}</td>
	                    <td>{{book.price}}</td>
	                    <td>{{book.atime}}</td>
	                    <td><button class="btn btn-danger">删除</button></td>
	                </tr>
	            </table>
	        </div>
	    </div>
	</body>
	</html>
	
	<script src="https://cdn.jsdelivr.net/npm/vue"></script>
	
	<script>
	    new Vue({
	        el: "#app",
	        data: {
	            books:[
	                {"name":"Python",author:"龟叔",price:89,atime:new Date()},
	                {"name":"Java",author:"xxx",price:79,atime:new Date()},
	            ],
	        }
	    });
	</script>



1.2、实现添加功能

  1. 第一阶段

    • 使用新数组 adding_book 存储添加的值

    • 使用 v-model 双向绑定

    • 创建 add 方法进行添加

    <div id="app">
	...
		<div class="form-group">
		    <label>书名:</label>
		    <input type="text" class="form-control" v-model="adding_book.name" placeholder="请输入图书名字">
		</div>
	...
		<button type="button" class="btn btn-default" @click="add">添加</button>
	...
	</div>

	
	<script>
	...
		data: {
            books: [
                {"name":"Python",author:"龟叔",price:89,atime:new Date()},
                {"name":"Java",author:"xxx",price:79,atime:new Date()},
            ],
            adding_book: {
                name: "",
                author: "",
                price: 0,
                atime: new Date()
             },
        },
        methods: {
            add(){
                this.books.push(this.adding_book);
            }
        }
	...
	</script>

但是有问题,因为是双向绑定,所以点击添加后修改输入框的值,之前添加的记录数值也会跟着改变。


  1. 改进

    • 使用 JSON.stringify 转成字符串

    • 使用 JSON.parse 转成 JS 认识的代码

    • 重新赋值实现添加完成后清空输入框,也可以用 JS 清空输入框中的 value 值

	<script>
	...
		add(){
		    // this.books.push(this.adding_book)
		
		    // 改进
		    var book = JSON.parse(JSON.stringify(this.adding_book))
		    this.books.push(book)
		
		    // 添加完成后清空输入框
			this.adding_book = {
				name: "",
				author: "",
		        price: 0,
		        atime: new Date()
			}
		},
	...
	</script>



1.3、实现删除功能

    <div id="app">
	...
		<td><button class="btn btn-danger" @click="del(index)">删除</button></td>
	...
	</div>

	
	<script>
	...
		data: { ... },
        methods: {
            add(){ ... },
            del(index){
                this.books.splice(index, 1)
            }
        }
	...
	</script>



1.4、实现搜索功能

  1. 第一阶段

    • 使用计算属性 computed

    • 用于循环的数值由固定的 books 改为动态变化的新数组 books_result

    • 使用数值里的过滤方法 filter

    <div id="app">
	...
		<div class="form-group">
			<label>搜索:</label>
			<input type="text" class="form-control" v-model="keywords" placeholder="请输入搜索内容">
		</div>
	...
	</div>

	
	<script>
	...
		data: { 
		...
			keywords: ""
		},
        methods: { ... },
        computed: {
			books_result(){
                if(this.keywords){
                    // console.log(this.keywords)

                    // 数组里面的过滤方法
                    // item 就是 books 当中的每一条数据
                    var newbooks = this.books.filter( function(item){
                        if(item.name.indexOf(this.keywords)>=0){ 
                            // 返回 true, 返回当前的 item 数据
                            return true
                        }else{
                            return false
                        }
                    })
                    return newbooks
                }
                else{
                    return this.books
                }
            }
		}
	...
	</script>

有问题,搜索结果均为空。


  1. Debug

    • 使用 console.log() 或其他方法逐步排查

    • 找到问题并解决

	<script>
	...
		computed: {
            books_result(){
                kw = this.keywords
                if(kw){
                    var newbooks = this.books.filter( function(item){
                    
                        // console.log(item.name.indexOf(this.keywords))
                        // 发现返回的不是输入的值, 找到问题所在
                        // 这里的 this 指当前函数, 所以不能访问到上面定义的 keywords
                        // 在开始从为 keywords 定义一个变量存储起来
                        <!--  if(item.name.indexOf(this.keywords)>=0){  -->

                        if(item.name.indexOf(kw)>=0){
                            return true
                        }else{
                            return false
                        }
                    })
                    return newbooks
                }
                else{
                    return this.books
                }
            }
        }
	...
	</script>

那么,这个仿真的图书管理系统就完成了。

  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
初学Vue案例练习题可以从以下几个方面进行练习: 1. 组件的基本使用:创建一个Vue组件,在模板中展示一些静态文本或数据,并在组件中定义一些基本的数据和方法。 2. 数据绑定:练习使用v-model指令和数据绑定来实现双向数据绑定,例如创建一个表单,实时显示输入框中的内容。 3. 列表渲染:使用v-for指令来循环渲染一个数组或对象的数据,并在模板中展示列表数据。 4. 条件渲染:使用v-if和v-else指令来根据条件动态地展示或隐藏一些元素。 5. 事件处理:练习使用v-on指令来监听DOM事件,并在事件处理函数中修改数据或执行其他逻辑。 6. 组件通信:练习使用props和emit来实现父子组件之间的数据传递和通信。 7. 生命周期:了解Vue的生命周期钩子函数,练习在创建、更新和销毁组件时执行相应的逻辑。 8. 路由和导航:学习使用Vue Router插件来实现前端路由和导航功能,创建不同路径下的页面。 9. 状态管理:学习使用Vuex插件来实现全局状态管理,练习在不同组件之间共享和修改状态。 以上是初学Vue时可以练习的一些案例题目,你可以根据自己的学习进度和需求选择适合自己的练习项目。如果需要更多详细的案例和代码实例,你可以参考中提供的学习资料和中的项目案例地址。另外,你还可以在Vue官方文档和在线教程中找到更多的实例和练习题目进行学习。希望对你有帮助!<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [Vue3+TypeScript从入门到进阶(三)——Vue3基础知识点(上)——附沿途学习案例及项目实战代码](https://blog.csdn.net/wuyxinu/article/details/124639124)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值