Vue框架——基本知识点+示例(1)

03 vue相关问题

第一步:引入框架
< script src=“js/vue.js”></ script>

第二步:body中写入元素
< div id=‘app’>{{msg}}</ div>

第三步:实例化对象
new Vue({
​ el:’#app’ //绑定元素
​ data:{
​ msg:‘Hello Vue!’
​ }
})

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>体验vue</title>
</head>
<body>
	<!-- 在MVVM中指的是V(view) -->
<div id="app">
<!--    插值表达式:{{数据}}-->
	{{msg}}
	<!-- 绑定父级,子级不再绑定 -->
<!--	<div id="wrap">-->
<!--		{{msg1}}-->
<!--	</div>-->
</div>
<!-- 绑定元素之外,解析不了插值表达式 -->
{{msg}}
<!--    同级可以绑定多次,一般不推荐,后期模块化开发的时候,没有必要-->
    <div id="wrap">
        {{msg1}}
    </div>
</body>
<!--第一步:引入框架-->
<script src="js/vue.js"></script>
<script>
// <!-- Vue开发模式是MVVM   -->
//new Vue代表的是MVVM中的VM

    //实例化对象
    new Vue({
        //绑定的元素,可以是标签名(但不能是html或者body),是类名、id名
        //一般使用的id名,id名唯一可以避免重复绑定。后期开发项目的时候,一般一个模块绑定一次,一般该模块有id名

        //绑定元素
        el:'#app',
        //data数据只能作用在绑定元素内部

        //在vue中代表的是MVVM中的M(model)

        //数据
        data:{
            msg:'hello vue!',
            msg1:'welcome'
        }
    })

    //绑定父级,子级不再绑定
    new Vue({
    	el:'#wrap',
    	data:{
    		msg1:'wrap'
    	}
    })
</script>
<!--vue中,有需求,操作数据-->
</html>

总结:

1.插值表达式:{{数据}}

2.绑定父级,自己不再绑定

3.绑定元素之外,解析不了插值表达式(< div id=‘app’></ div>之外的东东)

4.同级可以绑定多次,一般不推荐,后期模块化开发的时候实现,没有必要

5.< div id=‘app’></ div>在MVVM里指的是V(view);

new Vue({})代表的是MVVM中的VM

6.绑定的元素,可以是标签名(但不能是html或者body),是类名、id名

04插值表达式({变量/函数/表达式})

v-html的优先级比较高,如果有这个的话,div里面的内容就不会显示了,显示的是v-html='变量名’里变量名的内容

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <div id="app">
<!--    <div id="app" v-html="msg">优先级比较高,如果有这个的话,div里面的内容不会显示-->
<!--        插值表达式({变量/函数/表达式})-->
        {{msg}};
        {{1+88}};
        {{add()}};
        {{Math.floor(Math.random())}};
        {{1>2?'true':'false'}}
    </div>
<script src="js/vue.js"></script>
<script>
    new Vue({
        el:'#app',
        //数据类的放置在data内部
        data:{
            msg:'hello'
        },
    //    方法类的放置在methods内部
        methods:{
            add(){
                return 3;
            }
        }
    })
</script>
</body>
</html>

05 v-cloak

v-cloak保持在元素身上,直到编译结束;
可以解决中间闪烁问题,会出现的中间代码问题

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<style>
/*<!--v-cloak保持在元素身上,直到编译结束-->*/
    [v-cloak]{
        display: none;
    }
/*    解决了中间的闪烁问题,会出现中间代码的问题*/
</style>
<body>
<div id="app" v-cloak>
    {{msg}}
</div>
</body>
<script src="js/vue.js"></script>
<script>
    new Vue({
        el:'#app',
        data:{
            msg:'hello'
        }
    })
</script>
</html>

06 v-on:事件名=“方法名”

事件结构: v-on:事件名字=“方法名”

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<div id="app">
<!--    事件结构:v-on:事件名字="方法名"-->
    <button v-on:click="add()">按钮</button>
    {{num}}
</div>
</body>
<script src="js/vue.js"></script>
<script>
    var vm = new Vue({
        el:'#app',
        data:{
            num:0
        },
        methods:{
            add(){
            //    this代表的是new Vue({})实例对象
                this.num++;
                // console.log(this);
            }
        }
    })
</script>
</html>

07 v-on事件

1.事件结构:v-on:事件名字=“方法名”;
2.事件名字:click mouseenter(效率更高一点,mouseover会触发子元素)mouseleave keydown keyup之前的事件在此处仍可以使用;
3.Vue里面没有直接的this代表事件源,通过$event获取,指的是事件对象,相当于之前事件的event

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<style>
    p{
        background: aqua;
        width: 100px;
        height: 100px;
        border-radius: 50%;
    }
</style>
<body>
<div id="app">
<!--    事件结构:v-on:事件名字=”方法名“-->
<!--    事件名字 click mouseenter(效率更高一点,mouseover会触发子元素) mouseleave keydown keyup之前的事件在此处同样可以使用-->
    <button v-on:click="add()">按钮</button>
<!--    Vue里面没有直接的this代表事件源,通过$event获取,指的是事件对象,相当于之前事件的event-->
    <p v-on:mouseenter="bg($event)"></p>
    {{num}}
</div>

</body>
<script src="js/vue.js"></script>
<script>
    var vm=new Vue({
        el:'#app',
        data:{
            num:0
        },
        methods:{
            add(){
            //    this代表的是new Vue({})实例对象
                this.num++;
            },
            bg(a){
                // $event.target代表的是事件源
                a.target.style.background='red';
                console.log(a.target);
            }
        }
    })
</script>
</html>

08 event(回顾)

event事件对象 和 事件相关的信息

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<button id="btn">按钮</button>
<!--event事件对象 和 事件相关的信息-->
<script>
    btn.onclick=function(event){
        console.log(event.target);
    }
</script>
</body>
</html>

09 冒泡和默认行为

1.return false既能阻止冒泡又能阻止默认行为
冒泡:触发子级的时候,把父级同样的事件也会触发;
默认行为:a标签的跳转,表单的提交;
2.Vue中:
阻止默认行为 v-on:click.prevent=" ";
阻止冒泡 v-on:事件类型.stop

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<style>
    div>div{
        width: 100px;
        height: 100px;
        background-color: red;
    }
    p{
        width: 50px;
        height: 50px;
        background-color: aquamarine;
    }
</style>
<body>
<!--return false既能阻止冒泡又能阻止默认行为-->
<!--之前的写法-->
<form action="" method="get" onsubmit="return false">
    <input type="text" name="user">
    <input type="submit">
</form>
<a href="06.html" onclick="return false">百度</a>
<!--return false
冒泡:触发子级的时候,把父级同样的事件也会触发
默认行为:a标签的跳转,表单的提交

vue中
阻止默认行为 v-on:click.prevent=""
阻滞冒泡 v-on:事件类型.stop
-->
<div id="app">
    <a href="06.html" v-on:click.prevent="">百度</a>
    <div  v-on:click.stop="change($event)">
<!--        如果第一二条事件不一样就不需要委托了,如果事件是一样的,就可以用父级事件委托-->
        <p v-on:click.stop="change($event)"></p>
        <span>asdfgb</span>
    </div>
</div>
</body>
<script src="js/vue.js"></script>
<script>
    new Vue({
        el:'#app',
        methods:{
            change(a){
                console.log(a.target);
            }
        }
    })
</script>
<!--事件委托(事件代理):利用事件冒泡,只指定一个事件处理程序,就可以管理某一类型的所有事件
程序中现有的dom节点是由事件的,新添加的dom节点也是有事件的
-->

</html>

10 keydown

keydown:键盘按下的时候触发,限制为某些按键的时候才触发方法
v-on:keydown,键盘直接名字a/b/c键盘码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<div id="app">
<!--    keydown键盘按下的时候触发,限制为某些按键的时候才触发方法
    v-on:keydown,键盘直接名字a/b/c/键盘码
-->

<!--    不加$event打印出来的就是undefined-->
    <input type="text" v-on:keydown.up="change()" v-on:keydown.down="change()">
    <input type="text" v-on:keydown="change($event)">
</div>

</body>
<script src="js/vue.js"></script>
<script>
    new Vue({
        el:'#app',
        data:{
            num:0
        },
        methods:{
            change(a){
            //    a.keycode键盘码
                console.log(a);
            }
        }
    })
</script>
</html>

11 v-once和v-pre

v-once:只渲染一次,后期数据变化也不再渲染;
v-pre:不渲染,以插值表达式的形式表示

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<!--v-once:只渲染一次,后期数据变化也不再渲染
    v-pre:不渲染,以插值表达式的形式表示
-->
<div id="app">
    <button v-on:click="add()">按钮</button>
    <p v-once>once:{{msg}}</p>
    <p v-pre>pre:{{msg}}</p>
    {{msg}}
</div>
<script src="js/vue.js"></script>
<script>
    new Vue({
        el:'#app',
        data:{
            msg:0
        },
        methods:{
            add(){
                // console.log(111);
                this.msg++
            }
        }
    })
</script>
</body>
</html>

在这里插入图片描述

12 v-model:实现双向数据绑定

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<!--v-model:实现双向数据绑定-->
<div id="app">
    <input type="text" v-model="msg">
    {{msg}}
    <button v-on:click="add()">按钮</button>
</div>
</body>
<script src="js/vue.js"></script>
<script>
    new Vue({
        el:'#app',
        data:{
            msg:0
        },
        methods:{
            add(){
                this.msg=this.msg+1;
            }
        }
    })
</script>
</html>

v-model实现双向数据绑定,一个数字变另一个数字也变

13 v-if 和 v-show

1.v-if控制标签是否存在;
2.v-show控制标签显示隐藏;
3.v-if/show=“表达式/变量”

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<style>
    p{
        width: 100px;
        height: 100px;
        background-color: aquamarine;
    }
    /*消除闪烁*/
    [v-cloak]{
        display: none;
    }
</style>
<body>
<div id="app" v-cloak>
    <button v-on:click="change()">按钮</button>
<!--    v-if控制标签是否存在
        v-show控制标签显示隐藏

        v-if/show=”表达式/变量“
-->
    <p v-if="msg==1">1</p>
    <p v-show="msg==2">2</p>
</div>
<script src="js/vue.js"></script>
<script>
    new Vue({
        el:'#app',
        data:{
            msg:1
        },
        methods:{
            change(){
                if (this.msg==1){
                    this.msg=2;
                }else {
                    this.msg=1;
                }
            }
        }
    })
</script>
</body>
</html>

14 v-for循环遍历

v-for循环 item数组元素 index数组下标 list数组;
遍历哪一个标签,就for哪一个标签

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<div id="app">
    <ul>
<!--        v-for循环 item数组元素 index数组下标 list数组
            遍历哪一个标签,就for哪一个标签
-->
        <li v-for="(item,index) in list">
            <h1>{{item.con}}</h1>
            <p>{{item.date}}</p>
            <span v-on:click="del(index)">X</span>
        </li>
    </ul>
</div>
<!--vue项目,首先操作数据-->
<script src="js/vue.js"></script>
<script>
    new Vue({
        el:'#app',
        data:{
            list:[
                {
                    con:'今日下雨',
                    date:'2020-03-20'
                },
                {
                    con:'今日下雨',
                    date:'2020-04-20'
                },
                {
                    con:'今日下雨',
                    date:'2020-05-20'
                },
                {
                    con:'今日下雨',
                    date:'2020-06-20'
                },
            ]
        },
        methods:{
            del(index){
                console.log(index);
                //splice(要操作的位置,删除标签的数量,插入的元素)
                this.list.splice(index,1);

            }

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

点击可以删除:
在这里插入图片描述

15 v-bind

如果属性是变量:
1.如果只有一个变量:
v-bind:属性=“变量”

2.如果多个变量:
v-bind:属性="[变量,变量]"

3.如果属性值有的不确定有的确定:
v-bind:属性:"{k:v,k:v}" k代表的是属性值
v是true,属性存在,否则不存在
v的值可以是表达式,也可以是变量

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        .box{
            width: 100px;
            height: 100px;
            margin-top: 10px;
            background-color: lime;
        }
        .current{
            display: none;
        }
    </style>
</head>
<body>
    <div id="app">
        <button v-on:click="change()">按钮</button>
<!--        如果属性是变量
            如果只有一个变量
            v-bind:属性=“变量”

            如果多个变量
            v-bind:属性="[变量,变量]"

            如果属性值有的不确定有的确定
            v-bind:属性:"{k:v,k:v}" k代表的是属性值
            v是true,属性存在,否则不存在
            v的值可以是表达式,也可以是变量
-->
        <div v-bind:class="{box:true,current:msg==false}"></div>
    </div>
    <script src="js/vue.js"></script>
    <script>
        new Vue({
            el:'#app',
            data:{
                msg:true
            },
            methods:{
                change(){
                    this.msg=!this.msg;
                }
            }
        })
    </script>
</body>
</html>

在这里插入图片描述

16 发微博

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<style>
    *{
        list-style: none;
    }
    li{
        background-color: antiquewhite;
    }
</style>
<body>
<div id="app">
    <ul>
        <!--        v-for循环 item数组元素 index数组下标
                    list数组
                    遍历哪一个标签,就for哪一个标签
        -->
        <li v-for="(item,index) in list">
            <h1>{{item.con}}</h1>
            <p>{{item.date}}</p>
            <span v-on:click="del(index)">X</span>
        </li>
    </ul>
    <button v-on:click="add()">发微博</button>
    <textarea name="" id="" cols="30" rows="10" v-model="msg"></textarea>
</div>
<!--vue项目,首先操作数据-->
<script src="js/vue.js"></script>
<script>
    var date = new Date();
    var finaldate=date.getFullYear()+'年'+(date.getMonth()+1)+'月'+date.getDate()+'日';
    new Vue({
        el:'#app',
        data:{
            list:[
                {
                    con:'今日下雨',
                    date:'2020-03-20'
                },
                {
                    con:'今日下雨',
                    date:'2020-04-20'
                },
                {
                    con:'今日下雨',
                    date:'2020-05-20'
                },
                {
                    con:'今日下雨',
                    date:'2020-06-20'
                },
            ],
            msg:null
        },
        methods:{
            add(){
                // this.list.push(cont.innerHTML);
                // console.log(this.msg);
                this.list.push({con:this.msg,date:finaldate});
                console.log(this.list);
            },
            del(index){
                console.log(index);
                this.list.splice(index,1);

            }

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

在这里插入图片描述

17 实现tab栏

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<style>
    *{
        padding: 0;
        margin: 0;
        list-style: none;
    }
    #wrap>ul{
        overflow: hidden;
    }
    #wrap li{
        float: left;
        border:1px solid red;
    }
    section div{
        width: 169px;
        height: 169px;
        border:1px solid green;
        margin-bottom: 10px;
        font-size: 12px;
    }
    .current{
        background-color: antiquewhite;
    }
</style>
<body>
<div id="wrap">
    <ul>
        <li v-bind:class="{current:index==msg}" v-for="(item,index) in list" v-on:mouseenter="cl(index)">
            {{item.title}}
        </li>
    </ul>
    <section>
        <div v-show="index==msg" v-for="(item,index) in list">
            {{item.con1}}<br>
            {{item.con2}}<br>
            {{item.con3}}<br>
            {{item.con4}}
        </div>
    </section>
</div>

</body>
<script src="js/vue.js"></script>
<script>
    var vm = new Vue({
        el:'#wrap',
        data:{
            msg:0,
            list:[
                {
                    title:'公告',
                    con1:'95公益周阿里、腾讯等六家公司同台联合做公益',
                    con2:'淘宝造物节之城市秘密',
                    con3:'聚划算88红包省钱卡',
                    con4: ''
                },
                {
                    title:'规则',
                    con1:'新增《淘宝网汽配行业管理规范》公示通知',
                    con2:'《淘宝网区域零售服务说明》变更公示通知',
                    con3:'《淘宝网票务行业管理规范》变更公示通知',
                    con4:'《淘宝网数字娱乐市场须提供官方授权的商品目录》变更公示通知'
                },
                {
                    title:'论坛',
                    con1:'淘宝618大促报名',
                    con2:'金牌卖家志愿者招募',
                    con3:'618大促报名激励',
                    con4:'运营神器年中大促'
                },
                {
                    title:'安全',
                    con1:'魔豆妈妈公益项目',
                    con2:'让母爱永不打烊!',
                    con3:'卖家注意:风险通报!',
                    con4:'售假获刑又起诉!'
                },
                {
                    title:'公益',
                    con1:'淘宝公益平台正式更名',
                    con2:'益起来商家招募即将截止',
                    con3:'卖家如何设置公益宝贝',
                    con4:'公益机构开店全攻略'
                }
            ]
        },
        methods:{
            cl(index) {
                this.msg=index;
                console.log(this.msg);

            }

        }
    })
</script>
</html>

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值