vue

Vue基础Day01属性与事件操作

2020-03-18  本文已影响0人  前端老邹_伯通

最近在重写 vue 基础讲义,欢迎大爷大娘们 留言 【批评斧正】
记得 留言点赞,爱你们,么么哒 :)~~

一.核心内容

1.推荐插件安装

Vue 2 Snippets

2.vue.js是啥

2.1 简介

2.2 MVVM 模式

MVVM模式 MVVM模式

2.2 vue 与 dom 对比

我们通过 vue 和 dom 对比 来看看 声明是 MVVM 模式

<input type="text" id="usrtName"/>
<p id="content">您输入了:</p>

<script>
    // 1.获取 dom 对象
    let txtName = document.getElementById("usrtName");
    let pCont = document.getElementById("content");
    
    // 2.实时显示数据 到 p 标签
    txtName.oninput = function () {
        pCont.innerText = "您输入了:" + txtName.value
    }
 </script>
<!-- View(视图):html代码,负责显示 -->
<div id="app">
    <input type="text" v-model="msg">
    <p>您输入了:{{msg}}</p>
</div>


<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>

<script>
// ViewModel(视图模型):Vue对象,负责双向数据绑定, 而 Vue框架已经帮我们实现
 new Vue({
    el: "#app",
    // Model(模型):负责数据
    data: {
        msg: "hello"
    }
});
</script>

小结:

数据一旦发生改变,页面上显示也会发生改变
这个过程 由 Vue 来自动完成,不需专门编写修改页面显示的代码了~~~

3.vue 基本使用

3.1 导入 Vue js文件

<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>

3.2 视图布局

<!-- 布局 -->
<div id="app">
    {{ message }} <!--插值表达式-->
</div>

3.3 Vue对象

<script>
let app = new Vue({
    el: '#app', 
    data: {
        message: '讨厌,死鬼~~~',
        dog:{
            name:'ruikey',
            age:2,
            gender:false
        }
    }
});
</script>
Vue程序 关系图

小结: 三步法

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>

<body>
    <!-- 基本使用分为三步: 1:导包;2:布局;3:实例化-->

    <!-- 2.布局 -->
    <div id="app">
        <!-- vue的一个插值语法,相当于挖个坑,用下面的就是值来填上 -->
        {{ message }}
    </div>

    <!-- 1.导包(开发环境的包) -->
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    <script>
        //3.实例化
        // ViewModel(视图模型):Vue对象,负责双向数据绑定, 而 Vue框架已经帮我们实现
        let app = new Vue({
            el: '#app',
            // Model(模型):负责数据
            data: {
                message: 'Hello Vue!'
            }
        });
    </script>
</body>

</html>

4.常见指令1文本与单双向绑定

如何改变一个标签里的内容呢?下面为大家介绍几个 常见 显示用的 指令

4.1 v-text(单向绑)

* 课堂小彩蛋

问题:如果 一个标签 同时用了 两种 语法呢,最终 在 div 中显示哪一个呢?

选项:1.'讨厌~' 2.'死鬼~' 3.都不显示

<div id="app" v-text='msg1'>
    {{ msg2 }} 
</div>

<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
    let app = new Vue({
        el: '#app',
        data: {
            msg1: '讨厌~',
            msg2: '死鬼~'
        }
    });
</script>

4.2 v-html(单向绑)

<div id="app" >
    <div v-html='msg1'>汪汪汪</div>
</div>

<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
    let app = new Vue({
        el: '#app',
        data: {
            msg1: '<h1>讨厌~</h1>'
        }
    });
</script>

4.3 v-model(双向绑)

4.3.1 双向绑定与文本框

如果想将 视图上的内容,设置给 Model呢?比如,将 文本框的内容 设置给 Model。

<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>

<div id="app">
    <input type="text" v-model="msg"/> <!-- 与 msg 属性值 双向绑定-->
    <div v-text="msg"></div> <!--获取 msg 属性的值显示-->
</div>

<script>
    let app = new Vue({
        el: '#app',
        data: {
            msg: '讨厌,死鬼~'
        }
    });
</script>
执行过程
* 课堂小彩蛋

问题:如果 直接 修改 data.msg 的值, input 和 div 中的值 哪个会改变?
选项:1.input 2.div 3.input 和 div

4.3.2 单选框
<h5>你愿意嫁给我吗?(单选按钮)</h5>
<input type="radio" name="radio" value="1" v-model="will">Yes,I do
<input type="radio" name="radio" value="2" v-model="will">No, fx off~
<h5>回答:{{will}}</h5>

<script src='./vue.js'></script>
<script>
    new Vue({
        el: '#app',
        data: {
            will: 1 // 设置默认值
        }
    })
</script>
4.3.3 下拉框
<h5>你祖籍哪的呢?(下拉框)</h5>
<div id='app'>
    <select v-model="provs">
        <option value="湖北省id">湖北省</option>
        <option value="湖南省id">湖南省</option>
        <option value="广东省id">广东省</option>
    </select>
    <h1>你的选择:{{provs}}</h1>
</div>

<script src='./vue.js'></script>
<script>
    new Vue({
        el: '#app',
        data: {
            provs: "湖南省id" // 设置默认值
        }
    })
</script>
4.3.4 复选框
<div id='app'>
    <h5>你看中我什么了?(复选按钮) - {{ans}}</h5>
    <input type="checkbox" name="chk" value="1" v-model="ans">帅气
    <input type="checkbox" name="chk" value="2" v-model="ans">海拔
    <input type="checkbox" name="chk" value="3" v-model="ans">单手开法拉第的才能

</div>

<script src='./vue.js'></script>
<script>
    new Vue({
        el: '#app',
        data: {
            ans:[1,2]
        }
    })
</script>

5.常见指令2事件绑定

5.1 v-on(事件绑定)

vue 也有一套类似dom的事件监听机制,事件名差不多,但有点差别

<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>

<div id="app">
    <div id='showCount' v-text='count'></div>
    
    <!-- v-on:事件名="一句话简短js" -->
    <button v-on:click="addCount">点我</button>
    <button v-on:dblclick="addCount">双击我</button>
    <button v-on:mouseover="addCount">鼠标移入我</button>

    <!-- 简写@,推荐后面都用简写 -->
    <button @click="addCount2">点我</button>
    <button @dblclick="addCount2">双击我</button>
    <button @mouseover="addCount2">鼠标移入我</button>
</div>

<script>
    let app = new Vue({
        el: '#app',
        data: {
            count: 0,
        },
        // 事件绑定的方法,都放在 methods 属性中
        methods: {
            addCount() {
                console.log('addCount');
                // vue 方法中 访问 data 里的值,需要 加 this。(html标签中访问data 不需要)
                this.count++;
            }
        },
    });
</script>
* 练习 商品数量

要求:点击 加号,数字 +1 ,点击 减号,数字 -1(不能小于0)

练习 商品数量
<div id='app'>
    <button @click="num++">+</button>
    <input style="width: 30px;text-align: center;" type="text" v-model="num"/>
    <button @click="jian">-</button>
</div>
<script src='./vue.js'></script>
<script>
    new Vue({
        el: '#app',
        data: {
            num: 0
        },
        methods: {
            jian() {
                if (this.num > 0) {
                    this.num--
                }
            }
        }
    })
</script>

5.2 vue中的this

在 vue 的方法中 ,为什么要通过 this才能访问 data中的数据呢?这个 this 到底是谁?

<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<div id="app">
    <!-- 注意:html标签中 不需要 加 this 就可以 访问 data 和 method -->
    <div id='showCount' v-text='count'></div>
    <button @click="addCount">点我啊</button>
</div>

<script>
    let app = new Vue({
        el: '#app',
        // Model(模型):负责数据
        data: {
            count: 0,
            gfName: 'ruikey'
        },
        methods: {
            addCount() {
                this.count++;
                console.log(this);
            },
            hi() {
                console.log('hi~~');
                this.addCount();// 访问 method 中的 另1个方法,也要加 this
            }
        },
    });
</script>
原理
* 课堂小彩蛋

问题:关于vue 中 this 描述,错误的是:

5.3 v-on常用的几个修饰符

如何控制事件只在某些特别条件下触发呢?

5.3.1 阻止冒泡

webapi 中,通过 事件参数 event.stopPropagation() 来阻止冒泡,而 vue 中 有更简单语法

<div id="app">
    <div class="box1" @click.stop="box1Click">box1</div>
</div>
<script src="./vue.js"></script>
<script>
    new Vue({
        el: "#app",
        methods: {
            box1Click() {
                alert("这是box1");
            }
        }
    })
</script>
5.3.2 阻止默认事件

webapi 中,通过 事件参数 event.preventDefault() 来阻止默认行为,而 vue 中 有更简单语法

<div id="app">
    <!--超链接 不会跳转了-->
    <a href="http://www.baidu.com" @click.prevent="aClick">讨厌,死鬼~~</a>
</div>

<script src="./vue.js"></script>
<script>
    new Vue({
        el: "#app",
        methods: {
            aClick() {
               alter('要死啊~~~');
            }
        }
    })
</script>
5.3.3 同时阻止冒泡和默认

Vue中,如果同时要阻止事件冒泡 和 默认行为,也很方便哦

<div id="app">
    <div id="box1" @click="box1Click">
        <!--超链接 不会跳转了,也不会事件冒泡了-->
        <a href="http://www.baidu.com" @click.stop.prevent="aClick">讨厌,死鬼~~</a>
    </div>
</div>

<script src="./vue.js"></script>
<script>
    new Vue({
        el: "#app",
        methods: {
            box1Click(){
                alter('点我孩子 就是点我~~!');
            },
            aClick() {
               alter('要死啊~~~');
            }
        }
    })
</script>
5.3.4 回车键事件

业务中,经常出现输入后按回车键触发事件函数,在Vue中相当简单

<div id="app">
    <!-- 键盘监听事件修饰符.enter 只有回车时才响应 -->
    <input type="text" @keyup.enter="inputData" v-model="inputStr">
</div>

<script src="./vue.js"></script>
<script>
    new Vue({
        el: "#app",
        data:{
            inputStr:'',
        },
        methods: {
            inputData() {
               alert('你输入了:' + this.inputStr)
            }
        }
    })
</script>

6.常见指令3-其他

6.1 v-bind(其他属性)

在前面我们知道 如何 设置 标签的 text文本 或 html文本,但如果要修改 标签的其他属性呢?

<style>
    .active {
        color: red
    }
</style>

<div id="app">
    <h1>请输入图片地址</h1>
    <input type="text" v-model="imgsrc" />
    <h1>请输入图片标题</h1>
    <input type="text" v-model="imgtit" />
    
    <hr />
    <!--绑定 图片路径 和 title-->
    <img width="980" v-bind:src="imgsrc" v-bind:title="imgtit" /> <!--【v-bind】-->
    <img width="980" :src="imgsrc" :title="imgtit+2" /> <!--【简写】-->
</div>

<script src="./vue.js"></script>
<script>
    let app = new Vue({
        el: "#app",
        data: {
            imgsrc: './imgs/1.jpg',
            imgtit:'优秀死鬼'
        }
    });
</script>

6.2 v-bind(class绑定)

6.2.1 绑定变量

class 属性中可能有 一个 或 多个 选择器名,可以用一个变量保存 并 绑定 到 class属性

<style>
    .error{
        color:red;
        padding:15px;
    }
    .bigFont{
        font-size:50px;
    }
</style>

<!--注意:此处绑定的是 【变量】-->
<div :class="red">hi~~!</div>

<script src="./vue.js"></script>
<script>
    new Vue({
        el: "#app",
        data: {
            red: 'error bigFont'
        }
    })
</script>
6.2.2 绑定对象

class 属性中可能有 一个 或 多个 选择器名,但要根据条件显示,此时,可以用 绑定对象 来解决

<style>
    .error{
        color:red;
        padding:15px;
    }
    .bigFont{
        font-size:50px;
    }
</style>

<!--注意:此处绑定的是 【类选择器名称】,由bool变量决定这个 选择器是否 添加到 class 属性中-->
<div v-bind:class="{ error: isOk, bigFont: hasError }"></div>

<script src="./vue.js"></script>
<script>
    let app = new Vue({
        el: "#app",
        data: {
            isOk: true,
            hasError: false
        }
    });
</script>
<style>
    .error{
        color:red;
        padding:15px;
    }
    .bigFont{
        font-size:50px;
    }
</style>

<div id="app">
    <!--2.为 class设置 对象{类名1:布尔值变量,类名2:布尔值变量}-->
    <!--注意:此处绑定的是 【类选择器名称】,由bool变量决定这个 选择器是否 添加到 class 属性中-->
    <div :class="divClass">hi~~!</div>
</div>
<script src="./vue.js"></script>
<script>
    new Vue({
        el: "#app",
        data: {
            divClass: {
                error: true,
                bigFont: true
            }
        }
    })
</script>
* 练习 切换显示

要求:点击按钮,字体变红放大;再次点击,则还原。

切换显示
<style>
    .error {
        color: red
    }

    .bigFont {
        font-size: 28px;
    }
</style>

<body>
    <div id="app">
        <button @click="changeClass">点我变色 </button>
        <div v-bind:class="{error:isShow,bigFont:isShow}">讨厌,死鬼~~~</div>
    </div>
    
    <script src="./vue.js"></script>
    <script>
        new Vue({
            el: "#app",
            data: {
                isShow: false
            },
            methods: {
                changeClass() {
                    this.isShow = !this.isShow
                }
            }
        })
    </script>
</body>

二.核心案例

1.图片轮播

要求:点击 按钮 切换 图片显示

图片轮播
<div id="app">
    <button @click="prev">上一张</button>
    <img :src="arr[curIndex]" alt="">
    <button @click="next">下一张</button>
</div>


<script src="./vue.js"></script>
<script>
    new Vue({
        el: "#app",
        data: {
            arr: ["http://ossweb-img.qq.com/images/lol/web201310/skin/big145000.jpg",
                "http://ossweb-img.qq.com/images/lol/web201310/skin/big145001.jpg",
                "http://ossweb-img.qq.com/images/lol/web201310/skin/big145014.jpg",
                "http://ossweb-img.qq.com/images/lol/web201310/skin/big145015.jpg",
                "http://ossweb-img.qq.com/images/lol/web201310/skin/big145016.jpg",
                "http://ossweb-img.qq.com/images/lol/web201310/skin/big145017.jpg"
            ],
            curIndex: 0
        },
        methods: {
            prev() {
                this.curIndex > 0 ? this.curIndex-- : alert('已经是第一张啦~~~');
            },
            next(){
                this.curIndex < this.arr.length-1 ? this.curIndex++ : alert('已经最后一张啦~~~');
            }
        }
    })
</script>

三.扩展内容

1. v-on事件修饰符

<!-- 方法处理器 -->
<button v-on:click="doThis"></button>

<!-- 动态事件 (2.6.0+) -->
<button v-on:[event]="doThis"></button>

<!-- 内联语句 -->
<button v-on:click="doThat('hello', $event)"></button>

<!-- 缩写 -->
<button @click="doThis"></button>

<!-- 动态事件缩写 (2.6.0+) -->
<button @[event]="doThis"></button>

<!-- 停止冒泡 -->
<button @click.stop="doThis"></button>

<!-- 阻止默认行为 -->
<button @click.prevent="doThis"></button>

<!-- 阻止默认行为,没有表达式 -->
<form @submit.prevent></form>

<!--  串联修饰符 -->
<button @click.stop.prevent="doThis"></button>

<!-- 键修饰符,键别名 -->
<input @keyup.enter="onEnter">

<!-- 键修饰符,键代码 -->
<input @keyup.13="onEnter">

<!-- 点击回调只会触发一次 -->
<button v-on:click.once="doThis"></button>

<!-- 对象语法 (2.4.0+) -->
<button v-on="{ mousedown: doThis, mouseup: doThat }"></button>
上一篇 下一篇

猜你喜欢

热点阅读