Vue总结1-基本使用和指令

1.什么是vue,为什么要使用vue,vue的优势

 /*
  1.什么是Vue?
   Vue.js 是一套构建用户界面的`框架`,它不仅易于上手,还可以与其它第三方库整合(Swiper、IScroll、...)。

   2.框架和库的区别?
   框架:是一套完整的解决方案;对项目的`侵入性`较大,项目如果需要更换框架,则需要重构整个项目。
   库(插件):提供某一个小功能,对项目的`侵入性`较小,如果某个库无法完成某些需求,可以很容易切换到其它库实现需求。
   例如: 从jQuery 切换到 Zepto, 无缝切换
         从IScroll切换到ScrollMagic, 只需要将用到IScroll的代码替换成ScrollMagic代码即可

   3.为什么要学习框架?
   提升开发效率:在企业中,时间就是效率,效率就是金钱;
   前端提高开发效率的发展历程:原生JS -> jQuery之类的类库 -> 前端模板引擎 ->  Vue / React / Angular

   4.框架有很多, 为什么要先学Vue
   Vue、Angular、React一起,被称之为前端三大主流框架!
   但是Angular、React是老外编写的, 所以所有的资料都是英文的
   而Vue是国人编写的, 所以所有的资料都是中文的, 并且Vue中整合了Angular、React中的众多优点
   所以为了降低我们的学习难度, 我们先学Vue, 学完之后再学习Angular和React

   5.使用Vue有哪些优势?
   5.1Vue的核心概念之一:
       通过数据驱动界面更新, 无需操作DOM来更新界面
       使用Vue我们只需要关心如何获取数据, 如何处理数据, 如何编写业务逻辑代码,
       我们只需要将处理好的数据交给Vue, Vue就会自动将数据渲染到模板中(界面上)
   5.2Vue的核心概念之二:
       组件化开发,我们可以将网页拆分成一个个独立的组件来编写
       将来再通过封装好的组件拼接成一个完整的网页
       https://cn.vuejs.org/images/components.png
  */

2.vue基本模板

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>02-Vue基本模板</title>
    <!--1.下载导入Vue.js-->
    <script src="js/vue.js"></script>
</head>
<body>
<div id="app">
    <p>{{ name }}</p>
</div>
<script>
    // 2.创建一个Vue的实例对象
    let vue = new Vue({
        // 3.告诉Vue的实例对象, 将来需要控制界面上的哪个区域
        el: '#app',
        // 4.告诉Vue的实例对象, 被控制区域的数据是什么
        data: {
            name: "twc"
        }
    });
</script>
</body>
</html>

3.数据单向绑定

 <!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>03-Vue数据单向传递</title>
    <!--1.下载导入Vue.js-->
    <script src="js/vue.js"></script>
</head>
<body>
<!--
1.MVVM设计模式
在MVVM设计模式中由3个部分组成
M : Model      数据模型(保存数据, 处理数据业务逻辑)
V : View       视图(展示数据, 与用户交互)
VM: View Model 数据模型和视图的桥梁(M是中国人, V是美国人, VM就是翻译)

MVVM设计模式最大的特点就是支持数据的双向传递
数据可以从 M -> VM -> V
也可以从   V -> VM -> M

2.Vue中MVVM的划分
Vue其实是基于MVVM设计模式的
被控制的区域: View
Vue实例对象 : View Model
实例对象中的data: Model

3.Vue中数据的单向传递
我们把"数据"交给"Vue实例对象", "Vue实例对象"将数据交给"界面"
      Model  ->  View Model    ->   View
-->
<!--这里就是MVVM中的View-->
<div id="app">
    <p>{{ name }}</p>
</div>
<script>
    // 这里就是MVVM中的View Model
    let vue = new Vue({
        el: '#app',
        // 这里就是MVVM中的Model
        data: {
            name: "twc"
        }
    });
</script>
</body>
</html>

4.数据双向绑定

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>04-Vue数据双向传递</title>
    <script src="js/vue.js"></script>
</head>
<body>
<!--
1.Vue调试工具安装
如果你能打开谷歌插件商店, 直接在线安装即可
https://chrome.google.com/webstore/detail/vuejs-devtools/nhdogjmejiglipccpnnnanhbledajbpd?hl=zh-CN

由于国内无法打开谷歌国外插件商店, 所以可以离线安装
https://www.chromefor.com/vue-js-devtools_v5-3-0/

2.安装步骤:
2.1下载离线安装包
2.2打开谷歌插件界面
2.3直接将插件拖入
2.4报错 程序包无效: "CRX_HEADER_INVALID"
   可以将安装包修改为rar后缀, 解压之后再安装
2.5重启浏览器
-->
<!--
2.数据双向绑定
默认情况下Vue只支持数据单向传递 M -> VM -> V
但是由于Vue是基于MVVM设计模式的, 所以也提供了双向传递的能力
在<input>、<textarea> 及 <select> 元素上可以用 v-model 指令创建双向数据绑定

注意点: v-model 会忽略所有表单元素的 value、checked、selected 特性的初始值
而总是将 Vue 实例的数据作为数据来源
-->

<!--这里就是MVVM中的View-->
<div id="app">
    <p>{{ name }}</p>
    <input type="text" v-model="name">
</div>
<script>
    // 这里就是MVVM中的View Model
    let vue = new Vue({
        el: '#app',
        // 这里就是MVVM中的Model
        data: {
            name: "twc",
            msg: "xxx"
        }
    });
</script>
</body>
</html>

5.常用指令

5.1 v-once指令

  • <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>05-常用指令-v-once</title>
        <script src="js/vue.js"></script>
    </head>
    <body>
    <!--
    1.什么是指令?
    指令就是Vue内部提供的一些自定义属性,
    这些属性中封装好了Vue内部实现的一些功能
    只要使用这些指令就可以使用Vue中实现的这些功能
    
    2.Vue数据绑定的特点
    只要数据发生变化, 界面就会跟着变化
    
    3.v-once指令:
    让界面不要跟着数据变化, 只渲染一次
    -->
    
    <!--这里就是MVVM中的View-->
    <div id="app">
        <p v-once>原始数据: {{ name }}</p>
        <p>当前数据: {{ name }}</p>
    </div>
    <script>
        // 这里就是MVVM中的View Model
        let vue = new Vue({
            el: '#app',
            // 这里就是MVVM中的Model
            data: {
                name: "twc",
            }
        });
    </script>
    </body>
    </html>
    

5.2 v-cloak指令

  • <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>06-常用指令-v-cloak</title>
        <style>
            [v-cloak] { display: none }
        </style>
    </head>
    <body>
    <!--
    1.Vue数据绑定过程
    1.1会先将未绑定数据的界面展示给用户
    1.2然后再根据模型中的数据和控制的区域生成绑定数据之后的HTML代码
    1.3最后再将绑定数据之后的HTML渲染到界面上
    
    正是在最终的HTML被生成渲染之前会先显示模板内容
    所以如果用户网络比较慢或者网页性能比较差, 那么用户会看到模板内容
    
    2.如何解决这个问题
    利用v-cloak配合 [v-cloak]:{display: none}默认先隐藏未渲染的界面
    等到生成HTML渲染之后再重新显示
    
    3.v-cloak指令作用:
    数据渲染之后自动显示元素
    -->
    
    <!--这里就是MVVM中的View-->
    <div id="app">
        <p v-cloak>{{ name }}</p>
    </div>
    
    <script src="js/vue.js"></script>
    <script>
        // 这里就是MVVM中的View Model
        let vue = new Vue({
            el: '#app',
            // 这里就是MVVM中的Model
            data: {
                name: "twc",
            }
        });
    </script>
    </body>
    </html>
    

5.3 v-text 和 v-html

  • <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>07-常用指令v-text和v-html</title>
        <script src="js/vue.js"></script>
    </head>
    <body>
    <!--
    1.什么是v-text指令
    v-text就相当于过去学习的innerText
    
    2.什么是v-html指令
    v-html就相当于过去学习的innerHTML
    -->
    
    <!--这里就是MVVM中的View-->
    <div id="app">
        <!--插值的方式: 可以将指定的数据插入到指定的位置-->
    <!--    <p>++++{{ name }}++++</p>-->
        <!--插值的方式: 不会解析HTML-->
        <p>++++{{ msg }}++++</p>
        <!--v-text的方式: 会覆盖原有的内容-->
       <p v-text="name">++++++++</p>
        <!--v-text的方式: 也不会解析HTML-->
        <p v-text="msg">++++++++</p>
        <!--v-html的方式: 会覆盖原有的内容-->
        <p v-html="name">++++++++</p>
        <!--v-html的方式:会解析HTML-->
        <p v-html="msg">{{name}}</p>
    </div>
    <script>
        // 这里就是MVVM中的View Model
        let vue = new Vue({
            el: '#app',
            // 这里就是MVVM中的Model
            data: {
                name: "twc",
                msg: "<span>我是span</span>"
            }
        });
    </script>
    </body>
    </html>
    

5.4 v-if v-else v-else-if

  • <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>08-常用指令v-if</title>
        <script src="js/vue.js"></script>
    </head>
    <body>
    <!--
    1.什么是v-if指令
    条件渲染: 如果v-if取值是true就渲染元素, 如果不是就不渲染元素
    
    2.v-if特点:
    如果条件不满足根本就不会创建这个元素(重点)
    
    3.v-if注意点
    v-if可以从模型中获取数据
    v-if也可以直接赋值一个表达式
    -->
    <!--
    4.v-else指令
    v-else指令可以和v-if指令配合使用, 当v-if不满足条件时就执行v-else就显示v-else中的内容
    
    5.v-else注意点
    v-else不能单独出现
    v-if和v-else中间不能出现其它内容
    -->
    <!--
    6.v-else-if指令
    v-else-if可以和v-if指令配合使用, 当v-if不满足条件时就依次执行后续v-else-if, 哪个满足就显示哪个
    
    7.v-else-if注意点
    和v-else一样
    -->
    
    <!--这里就是MVVM中的View-->
    <div id="app">
    <!--    <p v-if="show">我是true</p>-->
        <p v-if="hidden">我是false</p>
    <!--    <p v-if="true">我是true</p>-->
    <!--    <p v-if="false">我是false</p>-->
        <p v-if="age >= 18">我是true</p>
        <p v-if="age < 18">我是false</p>
    
    <!--    <p v-if="age >= 18">成年人</p>-->
    <!--    <p>中间的内容</p>-->
    <!--    <p v-else>未成年人</p>-->
    
        <p v-if="score >= 80">优秀</p>
        <p v-else-if="score >= 60">良好</p>
        <p v-else>差</p>
    </div>
    <script>
        // 这里就是MVVM中的View Model
        let vue = new Vue({
            el: '#app',
            // 这里就是MVVM中的Model
            data: {
                show: true,
                hidden: false,
                age: 17,
                score: 50
            }
        });
    </script>
    </body>
    </html>
    

5.5 v-show

  • <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>09-常用指令v-show</title>
        <script src="js/vue.js"></script>
    </head>
    <body>
    <!--
    1.什么是v-show指令
    v-show和v-if的能够一样都是条件渲染, 取值为true就显示, 取值为false就不显示
    
    2.v-if和v-show区别
    v-if: 只要取值为false就不会创建元素
    v-show: 哪怕取值为false也会创建元素, 只是如果取值是false会设置元素的display为none
    
    3.v-if和v-show应用场景
    由于取值为false时v-if不会创建元素, 所以如果需要切换元素的显示和隐藏, 每次v-if都会创建和删除元素
    由于取值为false时v-show会创建元素并设置display为none, 所有如果需要切换元素的显示和隐藏,
    不会反复创建和删除, 只是修改display的值
    所以: 如果企业开发中需要频繁切换元素显示隐藏, 那么推荐使用v-show, 否则使用v-if
    -->
    
    <!--这里就是MVVM中的View-->
    <div id="app">
    <!--    <p v-show="true">我是true</p>-->
    <!--    <p v-show="false">我是false</p>-->
    <!--    <p v-show="age >= 18">我是true</p>-->
    <!--    <p v-show="age < 18">我是false</p>-->
        <p v-show="show">我是段落1</p>
        <p v-show="hidden">我是段落2</p>
    </div>
    <script>
        // 这里就是MVVM中的View Model
        let vue = new Vue({
            el: '#app',
            // 这里就是MVVM中的Model
            data: {
                show: true,
                hidden: false,
                age: 18
            }
        });
    </script>
    </body>
    </html>
    

5.6 v-for

  • <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>10-常用指令v-for</title>
        <script src="js/vue.js"></script>
    </head>
    <body>
    <!--
    1.什么是v-for指令
    相当于JS中的for in循环, 可以根据数据多次渲染元素
    
    2.v-for特点
    可以遍历 数组, 字符, 数字, 对象
    -->
    
    <!--这里就是MVVM中的View-->
    <div id="app">
        <ul>
            <li v-for="(value, index) in list">{{index}}--{{value}}</li>
           <li v-for="(value, index) in 'abcdefg'">{{index}}--{{value}}</li>
           <li v-for="(value, index) in 6">{{index}}--{{value}}</li>
            <li v-for="(value, key) in obj">{{key}}---{{value}}</li>
        </ul>
    </div>
    <script>
        // 这里就是MVVM中的View Model
        let vue = new Vue({
            el: '#app',
            // 这里就是MVVM中的Model
            data: {
                list: ["张三", "李四", "王五", "赵六"],
                obj: {
                    name: "lnj",
                    age: 33,
                    gender: "man",
                    class: "知播渔"
                }
            }
        });
    </script>
    </body>
    </html>
    

5.7 v-bind

  • <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>10-常用指令v-bind</title>
        <script src="js/vue.js"></script>
    </head>
    <body>
    <!--
    1.什么是v-bind指令
    在企业开发中想要给"元素"绑定数据, 我们可以使用{{}}, v-text, v-html
    但是如果想给"元素的属性"绑定数据, 就必须使用v-bind
    所以v-bind的作用是专门用于给"元素的属性"绑定数据的
    
    2.v-bind格式
    v-bind:属性名称="绑定的数据"
    :属性名称="绑定的数据"
    
    3.v-bind特点
    赋值的数据可以是任意一个合法的JS表达式
    例如: :属性名称="age + 1"
    -->
    
    <!--这里就是MVVM中的View-->
    <div id="app">
    <!--    <p>{{name}}</p>-->
    <!--    <p v-text="name"></p>-->
    <!--    <p v-html="name"></p>-->
        <!--注意点: 如果要给元素的属性绑定数据, 那么是不能够使用插值语法的-->
    <!--    <input type="text" value="{{name}}">-->
        <!--注意点: 虽然通过v-model可以将数据绑定到input标签的value属性上
                    但是v-model是有局限性的, v-model只能用于input/textarea/select
                    但是在企业开发中我们还可能需要给其它标签的属性绑定数据-->
        <input type="text" v-model="name">
    <!--    <input type="text" v-bind:value="name">-->
    <!--    <input type="text" :value="name">-->
        <input type="text" :value="age + 1">
    </div>
    <script>
        // 这里就是MVVM中的View Model
        let vue = new Vue({
            el: '#app',
            // 这里就是MVVM中的Model
            data: {
                name: "twc",
                age: 18
            }
        });
    </script>
    </body>
    </html>
    

5.8 v-bind 用来绑定类名

  • <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>12-常用指令-绑定类名</title>
        <script src="js/vue.js"></script>
        <style>
            *{
                margin: 0;
                padding: 0;
            }
            .size{
                font-size: 100px;
            }
            .color{
                color: red;
            }
            .active{
                background: skyblue;
            }
        </style>
    </head>
    <body>
    <!--
    1.v-bind指令的作用
    v-bind指令给"任意标签"的"任意属性"绑定数据
    对于大部分的属性而言我们只需要直接赋值即可, 例如:value="name"
    但是对于class和style属性而言, 它的格式比较特殊
    
    2.通过v-bind绑定类名格式
    :class="['需要绑定类名', ...]"
    
    3.注意点:
    3.1直接赋值一个类名(没有放到数组中)默认会去Model中查找
    :class="需要绑定类名"
    2.2数组中的类名没有用引号括起来也会去Model中查找
    :class="[需要绑定类名]"
    2.3数组的每一个元素都可以是一个三目运算符按需导入
    :class="[flag?'active':'']"
    2.4可以使用对象来替代数组中的三目运算符按需导入
    :class="[{'active': true}]"
    2.5绑定的类名太多可以将类名封装到Model中
    obj: {
        'color': true,
        'size': true,
        'active': false,
    }
    
    4.绑定类名企业应用场景
    从服务器动态获取样式后通过v-bind动态绑定类名
    这样就可以让服务端来控制前端样式
    常见场景: 618 双11等
    -->
    
    <!--这里就是MVVM中的View-->
    <div id="app">
    <!--    <p class="size color active">我是段落</p>-->
        <!--
        注意点:
        如果需要通过v-bind给class绑定类名, 那么不能直接赋值
        默认情况下v-bind会去Model中查找数据, 但是Model中没有对应的类名, 所以无效, 所以不能直接赋值
        -->
    <!--    <p :class="size">我是段落</p>-->
        <!--
        注意点:
        如果想让v-bind去style中查找类名, 那么就必须把类名放到数组中
        但是放到数组中之后默认还是回去Model中查找
        -->
    <!--    <p :class="[size]">我是段落</p>-->
        <!--
        注意点:
        将类名放到数组中之后, 还需要利用引号将类名括起来才会去style中查找
        -->
    <!--    <p :class="['size', 'color', 'active']">我是段落</p>-->
        <!--
        注意点:
        如果是通过v-bind类绑定类名, 那么在绑定的时候可以编写一个三目运算符来实现按需绑定
        格式: 条件表达式 ? '需要绑定的类名' : ''
        -->
    <!--    <p :class="['size', 'color', flag ? 'active' : '']">我是段落</p>-->
        <!--
        注意点:
        如果是通过v-bind类绑定类名, 那么在绑定的时候可以通过对象来决定是否需要绑定
        格式: {'需要绑定的类名' : 是否绑定}
        -->
    <!--    <p :class="['size', 'color',{'active' : false}]">我是段落</p>-->
        <!--
        注意点:
        如果是通过v-bind类绑定类名, 那么还可以使用Model中的对象来替换数组
        绑定的类名太多可以将类名封装到Model中
        -->
        <p :class="obj">我是段落</p>
    </div>
    <script>
        // 这里就是MVVM中的View Model
        let vue = new Vue({
            el: '#app',
            // 这里就是MVVM中的Model
            data: {
                flag: false,
                obj:{
                    'size': false,
                    'color': false,
                    'active': true,
                }
            }
        });
    </script>
    </body>
    </html>
    

5.9 v-bind绑定样式

  • <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>13-常用指令-绑定样式</title>
        <script src="js/vue.js"></script>
    </head>
    <body>
    <!--
    1.如何通过v-bind给style属性绑定数据
    1.1将数据放到对象中
    :style="{color:'red','font-size':'50px'}"
    1.2将数据放到Model对象中
    obj: {
        color: 'red',
        'font-size': '80px',
    }
    
    2.注意点
    2.1如果属性名称包含-, 那么必须用引号括起来
    2.2如果需要绑定Model中的多个对象, 可以放到一个数组中赋值
    -->
    
    <!--这里就是MVVM中的View-->
    <div id="app">
    <!--    <p style="color: red">我是段落</p>-->
        <!--
        注意点:
        和绑定类名一样, 默认情况下v-bind回去Model中查找, 找不到所以没有效果
        -->
    <!--    <p :style="color: red">我是段落</p>-->
        <!--
        注意点:
        我们只需要将样式代码放到对象中赋值给style即可
        但是取值必须用引号括起来
        -->
    <!--    <p :style="{color: 'red'}">我是段落</p>-->
        <!--
        注意点:
        如果样式的名称带-, 那么也必须用引号括起来才可以
        -->
    <!--    <p :style="{color: 'red', 'font-size': '100px'}">我是段落</p>-->
    <!--    <p :style="obj">我是段落</p>-->
        <!--
        注意点:
        如果Model中保存了多个样式的对象 ,想将多个对象都绑定给style, 那么可以将多个对象放到数组中赋值给style即可
        -->
        <p :style="[obj1, obj2]">我是段落</p>
    </div>
    <script>
        // 这里就是MVVM中的View Model
        let vue = new Vue({
            el: '#app',
            // 这里就是MVVM中的Model
            data: {
                obj1:{
                    "color": "blue",
                    "font-size": "100px"
                },
                obj2: {
                    "background-color": "red"
                }
            }
        });
    </script>
    </body>
    </html>
    

5.10 v-on

  • <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>14-常用指令-v-on</title>
        <script src="js/vue.js"></script>
    </head>
    <body>
    <!--
    1.什么是v-on指令?
    v-on指令专门用于给元素绑定监听事件
    
    2.v-on指令格式
    v-on:事件名称="回调函数名称"
    @事件名称="回调函数名称"
    
    3.v-on注意点:
    v-on绑定的事件被触发之后, 会去Vue实例对象的methods中查找对应的回调函数
    -->
    
    <!--这里就是MVVM中的View-->
    <div id="app">
    <!--    <button onclick="alert('lnj')">我是按钮</button>-->
        <!--
        注意点:
        1.如果是通过v-on来绑定监听事件, 那么在指定事件名称的时候不需要写on
        2.如果是通过v-on来绑定监听事件, 那么在赋值的时候必须赋值一个回调函数的名称
        -->
    <!--    <button v-on:click="alert('lnj')">我是按钮</button>-->
        <!--
        注意点:
        当绑定的事件被触发后, 会调用Vue实例的methods对象中对应的回调函数
        -->
    <!--    <button v-on:click="myFn">我是按钮</button>-->
        <button @click="myFn">我是按钮</button>
    </div>
    <script>
        // 这里就是MVVM中的View Model
        let vue = new Vue({
            el: '#app',
            // 这里就是MVVM中的Model
            data: {
            },
            methods: {
                myFn(){
                    alert('lnj')
                }
            }
        });
    </script>
    </body>
    </html>
    
  • v-on 修饰符

  • <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>15-常用指令-v-on修饰符</title>
        <script src="js/vue.js"></script>
        <style>
            *{
                margin: 0;
                padding: 0;
            }
            .a{
                width: 300px;
                height: 300px;
                background: red;
            }
            .b{
                width: 200px;
                height: 200px;
                background: blue;
            }
            .c{
                width: 100px;
                height: 100px;
                background: green;
            }
        </style>
    </head>
    <body>
    <!--
    1.v-on修饰符
    在事件中有很多东西需要我们处理, 例如事件冒泡,事件捕获, 阻止默认行为等
    那么在Vue中如何处理以上内容呢, 我们可以通过v-on修饰符来处理
    
    2.常见修饰符
    .once    - 只触发一次回调。
    .prevent - 调用 event.preventDefault()。阻止默认行为
    .stop    - 调用 event.stopPropagation()。阻止事件冒泡
    .self    - 只当事件是从侦听器绑定的元素本身触发时才触发回调。
    .capture - 添加事件侦听器时使用 capture 模式。
    -->
    
    <!--这里就是MVVM中的View-->
    <div id="app">
        <!--注意点: 默认情况下事件的回调函数可以反复的执行, 只要事件被触发就会执行-->
        <button v-on:click="myFn">我是按钮</button>
        <!--如果想让事件监听的回调函数只执行一次, 那么就可以使用.once修饰符-->
        <button v-on:click.once ="myFn">我是按钮</button>
        <!--如果想阻止元素的默认行为, 那么可以使用.prevent修饰符-->
       <a href="http://www.it666.com" v-on:click.prevent="myFn">我是A标签</a>
        <!--
        默认情况下载嵌套的元素中, 如果都监听了相同的事件, 那么会触发事件冒泡
        如果想阻止事件冒泡, 那么可以使用.stop修饰符
        -->
        <div class="a" @click="myFn1">
            <div class="b" @click.stop="myFn2">
                <div class="c" @click="myFn3"></div>
            </div>
        </div>
        <!--
        如果想让回调只有当前元素触发事件的时候才执行, 那么就可以使用.self修饰符,以下不会打印爸爸
        -->
        <div class="a" @click="myFn1">
            <div class="b" @click.self="myFn2">
                <div class="c" @click="myFn3"></div>
            </div>
        </div>
        <!--
        默认情况下是事件冒泡, 如果想变成事件捕获, 那么就需要使用.capture修饰符
        -->
        <div class="a" @click.capture="myFn1">
            <div class="b" @click.capture="myFn2">
                <div class="c" @click.capture="myFn3"></div>
            </div>
        </div>
    </div>
    <script>
        // 这里就是MVVM中的View Model
        let vue = new Vue({
            el: '#app',
            // 这里就是MVVM中的Model
            data: {
            },
            // 专门用于存储监听事件回调函数
            methods: {
                myFn(){
                    alert('lnj');
                },
                myFn1(){
                    console.log("爷爷");
                },
                myFn2(){
                    console.log("爸爸");
                },
                myFn3(){
                    console.log("儿子");
                }
            }
        });
    </script>
    </body>
    </html>
    
  • v-on 的注意点

  • <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>16-常用指令-v-on注意点</title>
        <script src="js/vue.js"></script>
    </head>
    <body>
    <!--
    1.v-on注意点
    1.1绑定回调函数名称的时候, 后面可以写()也可以不写
    v-on:click="myFn"
    v-on:click="myFn()"
    
    1.2可以给绑定的回调函数传递参数
    v-on:click="myFn('lnj', 33)"
    
    1.3如果在绑定的函数中需要用到data中的数据必须加上this
    -->
    
    <!--这里就是MVVM中的View-->
    <div id="app">
        <button @click="myFn('lnj', 33, $event)">我是按钮</button>
    </div>
    <script>
        // 这里就是MVVM中的View Model
        let vue = new Vue({
            el: '#app',
            // 这里就是MVVM中的Model
            data: {
                gender: "man"
            },
            // 专门用于存储监听事件回调函数
            methods: {
                myFn(name, age, e){
                    // alert('lnj');
                     console.log(name, age, e);
                    console.log(this.gender);
                }
            }
        });
    </script>
    </body>
    </html>
    

5.11 自定义指令

  • <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>18-常用指令-自定义指令</title>
        <script src="js/vue.js"></script>
    </head>
    <body>
    <!--
    1.自定义全局指令
    在Vue中除了可以使用Vue内置的一些指令以外, 我们还可以自定义指令
    
    2.自定义全局指令语法
    ue.directive('自定义指令名称', {
        生命周期名称: function (el) {
            指令业务逻辑代码
        }
    });
    
    3.指令生命周期方法
    自定义指令时一定要明确指令的业务逻辑代码更适合在哪个阶段执行
    例如: 指令业务逻辑代码中没有用到元素事件, 那么可以在bind阶段执行
    例如: 指令业务逻辑代码中用到了元素事件, 那么就需要在inserted阶段执行
    
    4.自定义指令注意点
    使用时需要加上v-, 而在自定义时不需要加上v-
    -->
    
    <!--这里就是MVVM中的View-->
    <div id="app">
    <!--    <p v-color>我是段落</p>-->
        <input type="text" v-focus>
    </div>
    <script>
        /*
        directive方法接收两个参数
        第一个参数: 指令的名称
        第二个参数: 对象
        注意点: 在自定义指令的时候, 在指定指令名称的时候, 不需要写v-
        注意点: 指令可以在不同的生命周期阶段执行
        bind: 指令被绑定到元素上的时候执行
        inserted: 绑定指令的元素被添加到父元素上的时候执行
        * */
        Vue.directive("color", {
            // 这里的el就是被绑定指令的那个元素
            bind: function (el) {
                el.style.color = "red";
            }
        });
        Vue.directive("focus", {
            // 这里的el就是被绑定指令的那个元素
            //此时如果将insert改为bind并不会聚焦,因为在bind时期,还没有渲染到界面
            inserted: function (el) {
                el.focus();
            }
        });
        // 这里就是MVVM中的View Model
        let vue = new Vue({
            el: '#app',
            // 这里就是MVVM中的Model
            data: {
            },
            // 专门用于存储监听事件回调函数
            methods: {
            }
        });
    </script>
    </body>
    </html>
    
  • 自定义指令参数

  • <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>19-常用指令-自定义指令参数</title>
        <script src="js/vue.js"></script>
    </head>
    <body>
    <!--
    1.自定义指令参数
    在使用官方指令的时候我们可以给指令传参
    例如: v-model="name"
    在我们自定义的指令中我们也可以传递传递
    
    2.获取自定义指令传递的参数
    在执行自定义指令对应的方法的时候, 除了会传递el给我们, 还会传递一个对象给我们
    这个对象中就保存了指令传递过来的参数
    -->
    
    <!--这里就是MVVM中的View-->
    <div id="app">
    <!--    <p v-color="'blue'">我是段落</p>-->
        <p v-color="curColor">我是段落</p>
    </div>
    <script>
        Vue.directive("color", {
            // 这里的el就是被绑定指令的那个元素
            bind: function (el, obj) {
                // el.style.color = "red";
                el.style.color = obj.value;
            }
        });
        // 这里就是MVVM中的View Model
        let vue = new Vue({
            el: '#app',
            // 这里就是MVVM中的Model
            data: {
                curColor: 'green'
            },
            // 专门用于存储监听事件回调函数
            methods: {
            }
        });
    </script>
    </body>
    </html>
    
  • 自定义局部指令

  • <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>21-常用指令-自定义局部指令</title>
        <script src="js/vue.js"></script>
    </head>
    <body>
    <!--
    1.自定义全局指令的特点
    在任何一个Vue实例控制的区域中都可以使用
    
    2.自定义局部指令的特点
    只能在自定义的那个Vue实例中使用
    
    3.如何自定义一个局部指令
    给创建Vue实例时传递的对象添加
    directives: {
        // key: 指令名称
        // value: 对象
        'color': {
            bind: function (el, obj) {
                el.style.color = obj.value;
            }
        }
    }
    -->
    
    <!--这里就是MVVM中的View-->
    <div id="app1">
        <p v-color="'blue'">我是段落</p>
    </div>
    <div id="app2">
        <p v-color="'red'">我是段落</p>
    </div>
    <script>
        // 这里就是MVVM中的View Model
        let vue1 = new Vue({
            el: '#app1',
            // 这里就是MVVM中的Model
            data: {},
            // 专门用于存储监听事件回调函数
            methods: {}
        });
        // 这里就是MVVM中的View Model
        let vue2 = new Vue({
            el: '#app2',
            // 这里就是MVVM中的Model
            data: {},
            // 专门用于存储监听事件回调函数
            methods: {},
            // 专门用于定义局部指令的
            directives: {
                "color": {
                    // 这里的el就是被绑定指令的那个元素
                    bind: function (el, obj) {
                        el.style.color = obj.value;
                    }
                }
            }
        });
    </script>
    </body>
    </html>
    
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,386评论 6 479
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,939评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,851评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,953评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,971评论 5 369
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,784评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,126评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,765评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,148评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,744评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,858评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,479评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,080评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,053评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,278评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,245评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,590评论 2 343

推荐阅读更多精彩内容