2022-8-27 第七小组 学习日记 (day51)Vue

目录

 

Vue介绍

插值表达式

插值闪烁问题:

属性/事件 

显示/隐藏

***面试题:

鼠标移动事件

v-for属性

*Vue核心*双向绑定

文本框示例:

 单选框:

多选框:

下拉框:

在Vue里给数组增删改查的方式:

作业 

1.图片切换

 2.学生录入系统(双向绑定)

总结


Vue介绍

Vue--可以说是一个JavaScript的框架,由我们国家的大神尤雨溪制作的

首先需要导入vue.js:

<script src="js/vue.js"></script>

然后需要建立一个Vue实例,所有的操作都需要在Vue实例里完成:

ps:每个元素之间用,间隔

const app = new Vue({
    // el用来给Vue实例一个作用域
    el:"#app",//根据获取选择器的方式:id=app
    data: {
        // 用来给Vue定义一些相关的数据
        msg: "欢迎使用Vue",
        },
});

插值表达式

        Vue专门的一种方式:用两个大括号包括Vue里的数据

<div id="app">
    <!-- 插值表达式 -->
    <h1>{{msg}}</h1>
</div>


多种存取方式:

const app = new Vue({
    el: "#app",
    data: {
        user: {
            msg:"hello Vue",
            name :"admin",
            password: "123456",
        },
        lists: ["北京","上海","广州","深圳","杭州"],//数组
        users: [{name:"小强",age:25},{name:"小红",age:18}]
     },
});

怎么获取这些值呢?

<div id="app">
    <h1>{{user.msg}} --- {{user.name}} --- {{user.password}}</h1>
    <h1>{{lists[0]}}---{{lists[3]}}---{{lists[4]}}</h1>
    <h1>{{users[0].name}} --- {{users[0].age}}</h1>
    <h1>{{user.msg.indexOf('u')}}</h1>//获取下标
</div>

 

插值闪烁问题:

什么是插值闪烁:

        当网络环境不好的时候会出现插值表达式,然后等到网络环境好的时候才能成功翻译成功

插值闪烁会先出现:{{msg}},等到网络好嘞会出现:Vue内容

避免插值闪烁:

        在标签内添加Vue属性:<h1 v-text="msg"></h1>或者<h1 v-html="msg"></h1>

属性/事件 

属性绑定(v-bind:src)--简写:src

可以通过Vue---data写src属性,来赋值

事件绑定(v-on:click)---简写@click

可以通过Vue--methods写函数事件:click里可以传参数,并在方法里可以获取到

通过实例来简单了解以下click事件:

显示/隐藏

v-show/v-if:效果都是一样的都可以赋值true/false----可以控制显示或者隐藏

 

代码: 

 <div id="app">
            <h1 v-show="flag">欢迎光临</h1>
            <button @click="toggle">显示 / 隐藏</button>
        </div>
        <script src="js/vue.js"></script>
        <script>
            const app = new Vue({
                el: "#app",
                data: {
                    flag:true,
                },
                methods: {
                    toggle() {
                        this.flag = !this.flag;
                    }
                },
            });
        </script>

***面试题:

v-if和v-show的区别:

v-if直接操作DOM元素,底层---------浏览器不会出现任何的相关标签;

v-show是通过css控制DOM元素-----浏览器里标签的display属性设置为none;

鼠标移动事件

@mouseover-------鼠标移动

@mouseout---------鼠标移除

v-for属性

v-for写在哪一个标签中,就会生成多个对应的标签

ps:在使用v-for的时候,一定要加入:key,用来给vue内部提供重用和排序的唯一的值

例子:

        <div id="app">
            <span v-for="(value,key,index) in user">
                {{index}} --- {{key}} --- {{value}}<br>
            </span>
            <ul>
                <li v-for="(value,index) in lists">
                    {{index}} --- {{value}}
                </li>
            </ul>
            <ol>
                <li v-for="(u,index) in users" :key="u.id">
                    {{index}} --- {{u.name}} --- {{u.age}}
                </li>
            </ol>
        </div>
        <script src="js/vue.js"></script>
        <script>
            const app = new Vue({
                
                el: "#app",
                data: {
                    user:{name:"小强",age:23},
                    lists: ["北京","上海","广州","深圳","杭州"],
                    users: [{name:"小强",age:25},{name:"小红",age:18}]
                },
            });
 
        </script>

 

*Vue核心*双向绑定

1、HTML部分发生变化,Vue实例中对应的属性也会变化

2、Vue中发生变化,HTML中同样变化


1、使用v-model指定可以实现数据的双向绑定

2、所谓的双向绑定,表单中的数据和Vue实例中data的数据变化是同步的MVVM架构:双向绑定机制

Model:数据

View:页面,页面展示数据

VM:ViewModel 监听器

文本框示例:


 

   <div id="app">
        <input type="text" v-model="message">
        <br>
        <input type="text" v-model="message" value="message">
        <br>
        <span>{{message}}</span>
    </div>
    <script src="js/vue.js"></script>
    <script>
        const app= new Vue({
            el:"#app",
            data:{
                message:'',
            },
        });
    </script>

 单选框:

必须设置name="gender",然后可以通过设置gender的Vue属性来设置选中

   <input type="radio" name="gender" value="m" V-model="gender">男
        <input type="radio" name="gender" value="w" V-model="gender">女

多选框:

设置hobby的属性必须设置为数组eg:hobby:[],否则会失效,选一个就会全选。

        <input type="checkbox" v-model="hobby" value="A">A
        <input type="checkbox" v-model="hobby" value="B">B
        <input type="checkbox" v-model="hobby" value="C">C
        <input type="checkbox" v-model="hobby" value="D">D

下拉框:

获取的是选中的value值

   <select name="" id="" v-model="sel">
            <option value="x">X</option>
            <option value="y">Y</option>
            <option value="z">Z</option>
        </select>

在Vue里给数组增删改查的方式:

末尾增加元素.push()
删除末尾元素.pop()
反转元素.reverse()
从小到大排序.sort()
查找.find()
包含.includes()
从指定位置删除指定个数元素.splice(x,x)

案例:写一个简易的记事本的实例:

<!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>
    </head>
    <body>
        <div id="app">
            <input type="text" v-model="x">
            <button @click="add">添加</button>
            <ul>
                <li v-for="(value,index) in lists">{{value}}<a href="#"
                        @click="del(index)">删除</a></li>
            </ul>
            <span>总数量:{{span}}</span>
            <button @click="delAll">删除所有</button>
        </div>
        <script src="js/vue.js"></script>
        <script>
            const app = new Vue({
            el:"#app",
            data: {
                span:"2",
                x:'',
                lists:["a","b"],
            },
            methods:{
                add(){
                    this.span=this.lists.length+1;
                    this.lists.push(this.x);
                    this.x='';
                },
                del(index){
                    this.span=this.lists.length-1;
                    this.lists.splice(index,1);
                },
                delAll(){
                    this.lists=[];
                    this.span=0;
                }
            },
        });
    </script>
    </body>
</html>

 其实大家细心的话,可以看出来,vue的解析过程,最终展现出来的HTML页面,是没有vue语法的,所以说,vue很厉害,他会解析成css+html组合使用应用到浏览器上

作业 

1.图片切换

<!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>
</head>
<body>
    <div id="app">
        <img :src="src">
        <br>
        <button @click="changeimg">切换图片</button>
    </div>

    <script src="js/vue.js"></script>
    <script>
         const app = new Vue({
            
            el: "#app",
            data: {
               src:"sb1.jpg" ,
            },
            methods: {
                changeimg() {
                    this.src = "sb2.jpg"
                }
            },
        });

    </script>
</body>
</html>

运行效果 

 

小结:当图片与代码不在同一文件时得加上路径

 2.学生录入系统(双向绑定)

<!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>学生录入系统</title>
    <style>
        #app{
            margin: 50px auto;
            width: 600px;
        }

        fieldset{
            border: 1px solid orangered;
            margin-bottom: 20px;
        }

        fieldset input{
            width: 200px;
            height: 30px;
            margin: 10px 0;
        }

        table{
            width: 600px;
            border: 2px solid orangered;
            text-align: center;
        }

        thead{
            background-color: orangered;
        }
    </style>
    <script src="js/vue.js"></script>
</head>
<body>
    <div id="app">
        <!--第一部分-->
        <fieldset>
            <legend>学生录入系统</legend>
            <div>
                <span>姓名:</span>
                <input type="text" placeholder="请输入姓名"  v-model="newStudent.name" >
            </div>
            <div>
                <span>年龄:</span>
                <input type="text" placeholder="请输入年龄" v-model="newStudent.age">
            </div>
            <div>
                <span>性别:</span>
                <select v-model="newStudent.sex" >
                    <option value="男">男</option>
                    <option value="女">女</option>
                </select>
            </div>
            <div>
                <span>手机:</span>
                <input type="text" placeholder="请输入手机号码" v-model="newStudent.phone" >
            </div>
            <button @click="createNewStudent()">创建新用户</button>
        </fieldset>
        <!--第二部分-->
        <table>
            <thead>
            <tr>
                <td>姓名</td>
                <td>性别</td>
                <td>年龄</td>
                <td>手机</td>
                <td>删除</td>
            </tr>
            </thead>
            <tbody>
            <tr v-for="(p,index) in persons">
                <td>{{p.name}}</td>
                <td>{{p.sex}}</td>
                <td>{{p.age}}</td>
                <td>{{p.phone}}</td>
                <td>
                    <button @click="deleteStuMsg(index)">删除</button>
                </td>
            </tr>
            </tbody>
        </table>
    </div>

  
    <script>
        new Vue({
            el:"#app",
            data:{
                persons: [
                    // {name: '张三', age: 20, sex: '男', phone: '18932323232'},
                    // {name: '李四', age: 30, sex: '男', phone: '18921212122'},
                    // {name: '王五', age: 20, sex: '男', phone: '18932223232'},
                    // {name: '赵六', age: 25, sex: '女', phone: '18932322232'},
                ],
                newStudent:{name:'',age:0,sex:'男',phone:''}
            },
            methods:{

                createNewStudent(){
                    //数据添加时,需要验证
                    if(this.newStudent.name==''){
                        alert("用户名不能为空");
                        return;
                    }
                    if(this.newStudent.age<=0){
                        alert("请输入正确年龄");
                        return;
                    }
                    if(this.newStudent.phone==''){
                        alert("手机号码不能为空");
                        return;
                    }
                    //住数组中添加一条记录 push()-尾部加  unshift-头部加
                    this.persons.unshift(this.newStudent);
                    //添加完成后清空数据
                    this.newStudent={name:'',age:0,sex:'男',phone:''}
                },
                //删除一条学生记录
                //删除:删除(任意个数)—参数1:开始的索引;参数2:删除的长度
                deleteStuMsg(index){
                    this.persons.splice(index,1);
                }
            }
           
        });
    </script>
</body>
</html>

运行效果 

总结

        今天学的Vue非常有用,包括V标签,双向绑定让我印象深刻,还有图片切换已经可以熟练应用,还有张哥晚上的题让我眼前一亮,把双向绑定很好的应用上了,也让我学得更加透彻

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值