vue基础6——自定义组件v-model

上次复习

在这里插入图片描述
在这里插入图片描述

自定义组件——v-model——与v-bind不同

不能正常加减

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="https://cdn.jsdelivr.net/npm/vue"></script>
</head>
<body>
    <div id="app">
        <stepper v-model:count="goods_count"></stepper>

    </div>
    <script>
        // 定义全局组件
        Vue.component("stepper",{
            props:["count"],
            // 定义模版
            template:`
            <div>
                <button @click='sub'>-</button>
                <span>{{count}}</span>
                <button @click='add'>+</button>
            </div>
            `,
            methods:{
                sub:function(){
                    return this.count -=1
                },
                add:function(){
                    return this.count +=1
                }
            }
        })
        new Vue({
            el:'#app',
            data:{
                "goods_count":0
            }
        })
    </script>
</body>
</html>

在这里插入图片描述

换成v-bind就可以

在这里插入图片描述
在这里插入图片描述

解决:v-model里面需要添加prop属性

在这里插入图片描述

问题:count不是goods-count

在这里插入图片描述
在这里插入图片描述

解决:

在这里插入图片描述
在这里插入图片描述

生命周期函数

beforeCreate:只有vue或者组件实例化执行

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="https://cdn.jsdelivr.net/npm/vue"></script>
</head>
<body>
    <div id="app">
        <p>{{username}}</p>


    </div>
    <script>

        new Vue({
            el:'#app',
            data:{
                username:'abc'
            },
            // 创建期间方法创建
            beforCreate(){
                // vue或者组件实例化就执行
                console.log('第一个生命周期函数:eforCreate')
                console.log(this.username)
            }
        })
    </script>
</body>
</html>

在这里插入图片描述

created:

在这里插入图片描述

在这里插入图片描述

beforeMount:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

mounted:

在这里插入图片描述

在这里插入图片描述

beforeUpdate:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

updated:

在这里插入图片描述
在这里插入图片描述

销毁阶段:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="https://cdn.jsdelivr.net/npm/vue"></script>
</head>
<body>
     <!-- 销毁阶段
             生命周期:vue对象、组件
             如何让组件销毁======v-if创建与销毁元素来控制显示 -->
    <div id="box">
            <destroy-view v-bind:msg="message"></destroy-view>
            


    </div>
    <script>
        Vue.component("destroy-view",{
            props:['msg'],
            template:`
            <p style="color:blue;">{{msg}}</p>
            `,
            

        })
        new Vue({
            el:'#box',
            data:{
                message:'hello world'
            },
        })
    </script>
</body>
</html>

在这里插入图片描述

销毁时加入v-if,点击则销毁

在这里插入图片描述

在这里插入图片描述

beforeDestroy:点击销毁则触发

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

destroyed:

在这里插入图片描述
在这里插入图片描述

图书管理系统 事例

在bootstrap找样式

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="https://cdn.jsdelivr.net/npm/vue"></script>
    <!-- 最新版本的 Bootstrap 核心 CSS 文件 -->
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css" integrity="sha384-HSMxcRTRxnN+Bdg0JdbxYKrThecOKuH5zCYotlSAcp1+c8xmyTe9GYg1l9a69psu" crossorigin="anonymous">
</head>
<body>
    <div id="bookManage">
        <!-- form表单 -->
        <div class='container'>
            <!-- 一般来说,引入模版过程,class属性指定样式 -->
            <form class="form-inline">
                <h1>图书管理系统</h1>
                <div class="form-group">
                <label >名称:</label>
                <input type="text" class="form-control" id="name" placeholder="请输入书名">
                </div>

                <div class="form-group">
                <label >作者:</label>
                <input type="text" class="form-control" id="author" placeholder="请输入作者名">
                </div>

                <div class="form-group">
                <label >价格:</label>
                <input type="text" class="form-control" id="price" placeholder="请输入价格">
                </div>

                <div class="form-group">
                <label >搜索:</label>
                <input type="text" class="form-control" id="search" placeholder="请输入搜索关键字">
                </div>              
                <button type="submit" class="btn btn-default">添加</button>
            </form>
        </div>
    </div>
    <script>
        new Vue({
            el:'#bokManage',
            data:{

            }
        })
    </script>
</body>
</html>

在这里插入图片描述

添加表格:

在这里插入图片描述
在这里插入图片描述

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="https://cdn.jsdelivr.net/npm/vue"></script>
    <!-- 最新版本的 Bootstrap 核心 CSS 文件 -->
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css" integrity="sha384-HSMxcRTRxnN+Bdg0JdbxYKrThecOKuH5zCYotlSAcp1+c8xmyTe9GYg1l9a69psu" crossorigin="anonymous">
</head>
<body>
    <div id="bookManage">
        <!-- form表单 -->
        <div class='container'>
            <!-- 一般来说,引入模版过程,class属性指定样式 -->
            <form class="form-inline">
                <h1>图书管理系统</h1>
                <div class="form-group">
                <label >名称:</label>
                <input type="text" class="form-control" id="name" placeholder="请输入书名">
                </div>

                <div class="form-group">
                <label >作者:</label>
                <input type="text" class="form-control" id="author" placeholder="请输入作者名">
                </div>

                <div class="form-group">
                <label >价格:</label>
                <input type="text" class="form-control" id="price" placeholder="请输入价格">
                </div>

                <div class="form-group">
                <label >搜索:</label>
                <input type="text" class="form-control" id="search" placeholder="请输入搜索关键字">
                </div>              
                <button type="submit" class="btn btn-default">添加</button>
            </form>
            <!-- 表格样式 -->
            <table class="table">
                <tr>
                    <td>序号</td>
                    <td>名称</td>
                    <td>作者</td>
                    <td>价格</td>
                    <td>时间</td>
                    <td>删除</td>
                </tr>
                <tr v-for="(book,index) in books">
                    <td>{{index+1}}</td>
                    <td>{{book.name}}</td>
                    <td>{{book.author}}</td>
                    <td>{{book.price}}</td>
                    <td>{{book.atime}}</td>
                    <td>删除</td>
                </tr>
                

              </table>
        </div>
    </div>
    <script>
        new Vue({
            el:'#bookManage',
            data:{
                books:[
                    {"name":"挪威的森林","author":"村上","price":"28","atime":new Date()},
                    {'name':"python核心编程","author":"lao a","price":"10",'atime':new Date()}

                ]

            }
        })
    </script>
</body>
</html>

在这里插入图片描述

增加功能的添加

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="https://cdn.jsdelivr.net/npm/vue"></script>
    <!-- 最新版本的 Bootstrap 核心 CSS 文件 -->
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css" integrity="sha384-HSMxcRTRxnN+Bdg0JdbxYKrThecOKuH5zCYotlSAcp1+c8xmyTe9GYg1l9a69psu" crossorigin="anonymous">
</head>
<body>
    <div id="bookManage">
        <!-- form表单 -->
        <div class='container'>
            <!-- 一般来说,引入模版过程,class属性指定样式 -->
            <form class="form-inline">
                <h1>图书管理系统</h1>
                <div class="form-group">
                <label >名称:</label>
                <input type="text" class="form-control" id="name" placeholder="请输入书名" v-model="add_book.name">
                </div>

                <div class="form-group">
                <label >作者:</label>
                <input type="text" class="form-control" id="author" placeholder="请输入作者名" v-model="add_book.author">
                </div>

                <div class="form-group">
                <label >价格:</label>
                <input type="text" class="form-control" id="price" placeholder="请输入价格" v-model="add_book.price">
                </div>

                <div class="form-group">
                <label >搜索:</label>
                <input type="text" class="form-control" id="search" placeholder="请输入搜索关键字">
                </div>  
                     <!-- 点击添加,应该触发事件,而不是默认提交表单        -->
                     <!-- 如何阻止默认行为 .prevent修饰符 -->
                <button type="submit" class="btn btn-default" @click.prevent='add'>添加</button>
            </form>
            <!-- 表格样式 -->
            <table class="table">
                <tr>
                    <td>序号</td>
                    <td>名称</td>
                    <td>作者</td>
                    <td>价格</td>
                    <td>时间</td>
                    <td>删除</td>
                </tr>
                <tr v-for="(book,index) in books">
                    <td>{{index+1}}</td>
                    <td>{{book.name}}</td>
                    <td>{{book.author}}</td>
                    <td>{{book.price}}</td>
                    <td>{{book.atime}}</td>
                    <td>删除</td>
                </tr>
                

              </table>
        </div>
    </div>
    <script>
        new Vue({
            el:'#bookManage',
            data:{
                books:[
                    {"name":"挪威的森林","author":"村上","price":"28","atime":new Date()},
                    {'name':"python核心编程","author":"lao a","price":"10",'atime':new Date()}

                ],
                add_book:{
                    name:"",
                    author:'',
                    price:0,
                }

            },
            methods:{
                add:function(){
                    // 获取输入框当中数据
                    // console.log(this.add_book)
                    // 只要将add_book添加到books中
                    this.books.push(this.add_book)
                }
            }
        })
    </script>
</body>
</html>

在这里插入图片描述

使用JSON.parse和JSON.straighfy()

在这里插入图片描述
在这里插入图片描述

输入完就可以情况框中内容

在这里插入图片描述
在这里插入图片描述

图书馆删除

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

图书馆搜索

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="https://cdn.jsdelivr.net/npm/vue"></script>
    <!-- 最新版本的 Bootstrap 核心 CSS 文件 -->
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css" integrity="sha384-HSMxcRTRxnN+Bdg0JdbxYKrThecOKuH5zCYotlSAcp1+c8xmyTe9GYg1l9a69psu" crossorigin="anonymous">
</head>
<body>
    <div id="bookManage">
        <!-- form表单 -->
        <div class='container'>
            <!-- 一般来说,引入模版过程,class属性指定样式 -->
            <form class="form-inline">
                <h1>图书管理系统</h1>
                <div class="form-group">
                <label >名称:</label>
                <input type="text" class="form-control" id="name" placeholder="请输入书名" v-model="add_book.name">
                </div>

                <div class="form-group">
                <label >作者:</label>
                <input type="text" class="form-control" id="author" placeholder="请输入作者名" v-model="add_book.author">
                </div>

                <div class="form-group">
                <label >价格:</label>
                <input type="text" class="form-control" id="price" placeholder="请输入价格" v-model="add_book.price">
                </div>

                <div class="form-group">
                <label >搜索:</label>
                <input type="text" class="form-control" id="search" placeholder="请输入搜索关键字" v-model='keyword'>
                </div>  
                     <!-- 点击添加,应该触发事件,而不是默认提交表单        -->
                     <!-- 如何阻止默认行为 .prevent修饰符 -->
                <button type="submit" class="btn btn-default" @click.prevent='add'>添加</button>
            </form>
            <!-- 表格样式 -->
            <table class="table">
                <tr>
                    <td>序号</td>
                    <td>名称</td>
                    <td>作者</td>
                    <td>价格</td>
                    <td>时间</td>
                    <td >删除</td>
                </tr>
                <!-- 因为搜索框发生变化,显示不再是完整的books而是book_result -->
                <tr v-for="(book,index) in book_result">
                    <td>{{index+1}}</td>
                    <td>{{book.name}}</td>
                    <td>{{book.author}}</td>
                    <td>{{book.price}}</td>
                    <td>{{book.atime}}</td>
                    <td class="btn btn-success" @click='del(index)'>删除</td>
                </tr>
                

              </table>
        </div>
    </div>
    <script>
        new Vue({
            el:'#bookManage',
            data:{
                books:[
                    {"name":"挪威的森林","author":"村上","price":"28","atime":new Date()},
                    {'name':"python核心编程","author":"lao a","price":"10",'atime':new Date()}

                ],
                add_book:{
                    name:"",
                    author:'',
                    price:0,
                },
                keyword:'',
                // book_result:[]

            },
            methods:{
                add:function(){
                    // 获取输入框当中数据
                    // console.log(this.add_book)
                    // 只要将add_book添加到books中
                    // this.books.push(this.add_book)
                    // 问题:v-model双向绑定add——book,所以输入框变化则表格内容也变化
                    // 解决:创建一个新对象 对象是将add——book转为json字符串
                    // JSON.stringify()  将js对象转为json字符串
                    // JSON.parse()   将json对转为json对象
                    var book =JSON.parse(JSON.stringify(this.add_book))
                    // JSON.stringify(this.add_book)
                    // console.log(book)
                    this.books.push(book)
                    // 将输入框清空
                    this.add_book ={                   
                    name:"",
                    author:'',
                    price:''
                    }

                },
                del:function(index){
                    this.books.splice(index,1)
                },
               
            },
             // indexOf 判断关键字是否在数据组,在就显示索引,不在就-1隐藏
                // keyword发生变化 则显示发生变化
                computed:{
                    book_result(){
                        // 判断:如果this.keyword
                        if(this.keyword){
                            kw =this.keyword
                            // 存在就可以搜索,但我们搜索时,应该判断该关键字在那一行字的name中
                            // 过滤方法 取出每一行数据  this.filter(方法)
                            var newbook=this.book.filter(function(item){
                                // console.log(item)
                                // item表示每一条记录
                                // 判断下标  =0存在
                                // 在function中this并不再是指定vue中的对象而是指定function自己
                                if(item.name.indexOf(kw) >=0){
                                    return true
                                }else{
                                    return false
                                }
                            })
                            return newbook
                            console.log(newbook)
                        }else{
                            // 没有输入关键字,还是显示books
                            return this.books
                        }
                    }
            }
        })
    </script>
</body>
</html>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值