zoukankan      html  css  js  c++  java
  • Web全栈探索,Vue基础系列,模板语法(一)

    一、何为指令?

    指令的本质就是自定义属性

    指令的格式:以v-开始(比如: v-cloak)

    二、指令诞生原因

    插值表达式存在的问题:“闪动”

    如何解决该问题:使用v-cloak指令

    解决该问题的原理:先隐藏,替换好值之后再显示最终的值

    三、数据响应式

    如何理解响应式

    ① html5中的响应式(屏幕尺寸的变化导致样式的变化)

    ② 数据的响应式(数据的变化导致页面内容的变化)

    示例

    打开网页调试,显示上一篇博文的代码,进入浏览器控制台,输入vm.msg='修改后的数据',则会出现以下情况:

    可以看到,数据被我们改变了!

    四、数据绑定

    ① 数据绑定:将数据填充到标签中

    v-once 只编译一次

    显示内容之后不再具有响应式功能

    即被 v-once 标注的数据不可以被修改

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>这是我的第一个vue页面</title>
    </head>
    <body>
    <div id="firstDemo">
        <!--    差值表达式 {{}} ===> 将数据填充到HTML标签中-->
        <!--    插值表达式支持基本的计算操作-->
        <div>{{msg}}</div>
        <div v-once>{{info}}</div>
    </div>
    <script type="text/javascript" src="js/vue.js"></script>
    <script type="text/javascript">
            /**
             * 步骤
             *
             * 1.提供标签 ===> 用于填充数据
             * 2.引入vue库文件(进入官网,依次选择学习==》教程==》安装==》开发版)
             * 官网地址:
             * https://cn.vuejs.org/
             * 3.可以使用vue的语法实现功能
             * 4.把vue提供的数据填充到标签
             */
            var vm = new Vue({
                // el: 元素的挂载位置(值可以是CSS选择器或DOM元素)
                // data: 模型数据(值是一个对象)
                el: '#firstDemo',
                data: {
                    msg: 'hello Vue',
                    info: 'this is the info'
                }
            })
    </script>
    </body>
    </html>

    v-mode 双向数据绑定

    使用 v-mode 属性使得输入框与msg数据同步

    <input type='text' v-model='msg'/>
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>这是我的第一个vue页面</title>
    </head>
    <body>
    <div id="firstDemo">
        <!--    差值表达式 {{}} ===> 将数据填充到HTML标签中-->
        <!--    插值表达式支持基本的计算操作-->
        <div>{{msg}}</div>
        <input type="text" v-model="msg">
    </div>
    <script type="text/javascript" src="js/vue.js"></script>
    <script type="text/javascript">
            /**
             * 步骤
             *
             * 1.提供标签 ===> 用于填充数据
             * 2.引入vue库文件(进入官网,依次选择学习==》教程==》安装==》开发版)
             * 官网地址:
             * https://cn.vuejs.org/
             * 3.可以使用vue的语法实现功能
             * 4.把vue提供的数据填充到标签
             */
            var vm = new Vue({
                // el: 元素的挂载位置(值可以是CSS选择器或DOM元素)
                // data: 模型数据(值是一个对象)
                el: '#firstDemo',
                data: {
                    msg: 'hello Vue'
                }
            })
    </script>
    </body>
    </html>

    MVVM设计思想

    ① M(model) ===> 提供数据

    ② V(view) ===> 提供页面

    ③ VM(View-Model) ===> 提供控制,将数据与页面进行结合;即M和V的交互通过中介(VM)完成

    视图 ===事件监听===>模型

    模型 ===数据绑定===>视图

    五、其他指令

    v-text 填充纯文本

    ① 相比插值表达式更加简洁

    v-html 填充HTML片段

    ① 存在安全问题

    ② 本网站内部数据可以使用,来自第三方的数据不可以用

    v-pre 填充原始信息

    ① 显示原始信息,跳过编译过程(分析编译过程)

    六、事件绑定

    v-on

    1.绑定变量

    v-on指令用法

    <input type=‘button' v-on:click='num++'/>

    v-on简写形式

    <input type=‘button' @click='num++'/>
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>这是我的第一个vue页面</title>
    </head>
    <body>
    <div id="firstDemo">
        <div>{{num}}</div>
        <button v-on:click="num++">点击递增</button>
    </div>
    <script type="text/javascript" src="js/vue.js"></script>
    <script type="text/javascript">
        var vm = new Vue({
            // el: 元素的挂载位置(值可以是CSS选择器或DOM元素)
            // data: 模型数据(值是一个对象)
            el: '#firstDemo',
            data: {
                num: 0
            }
        })
    </script>
    </body>
    </html>

    2.绑定函数

    注意:click只是其中一种指令,其余标准指令,vue均支持

    直接绑定函数名称

    <button v-on:click='say'>Hello</button>

    调用函数

    <button v-on:click='say()'>Say hi</button>
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>这是我的第一个vue页面</title>
    </head>
    <body>
    <div id="firstDemo">
        <div>{{num}}</div>
        <button v-on:click="addNum">点击递增</button>
    </div>
    <script type="text/javascript" src="js/vue.js"></script>
    <script type="text/javascript">
        var vm = new Vue({
            el: '#firstDemo',
            data: {
                num: 0
            },
            methods: {
                addNum: function () {
                    // 此处的 this 指的是 vue 的实例 vm
                    this.num++
                }
            }
        })
    </script>
    </body>
    </html>

    3.绑定带参函数

    普通参数和事件对象

    <button v-on:click='say("hi",$event)'>Say hi</button>
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>这是我的第一个vue页面</title>
    </head>
    <body>
    <div id="firstDemo">
        <div>{{num1}}</div>
        <div>{{num2}}</div>
        // 如果事件直接绑定函数名称(函数没有括号),则事件对象则会作为事件函数的第一个参数,且函数接受该参数可以以任意变量名接受
        // 如果事件绑定函数调用(函数有括号),则事件对象必须作为最后一个参数显示传递,并且事件对象的名称必须是$event
        <button v-on:click="addNum1">点击递增1</button>
        <button v-on:click="addNum2(num2, $event)">点击递增2</button>
    </div>
    <script type="text/javascript" src="js/vue.js"></script>
    <script type="text/javascript">
        var vm = new Vue({
            el: '#firstDemo',
            data: {
                num1: 0,
                num2: 0
            },
            methods: {
                addNum1: function (myEvent) {
                    // 此处的 this 指的是 vue 的实例 vm
                    this.num1++;
                    console.log(myEvent.target.innerHTML + '点击');
                },
                addNum2: function (num, event) {
                    this.num2++;
                    console.log(event.target.innerHTML + '第' + (num + 1) + '次点击');
                }
            }
        })
    </script>
    </body>
    </html>

    4.事件修饰符

    冒泡:

    在一个对象上触发某类事件,这个事件会向这个对象的的父级传播,从里到外,直至它被处理或者到达了对象层次的最顶层,即document对象。这个过程就是JavaScript的事件冒泡.

    例如:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>这是我的第一个vue页面</title>
    </head>
    <body>
    <div id="firstDemo" v-on:click='addNumParent'>
        <div>{{num}}</div>
        <button v-on:click="addNum">点击递增1</button>
    </div>
    <script type="text/javascript" src="js/vue.js"></script>
    <script type="text/javascript">
        var vm = new Vue({
            el: '#firstDemo',
            data: {
                num: 0
            },
            methods: {
                addNum: function () {
                    this.num++
                },
                addNumParent: function () {
                    this.num++;
                    console.log(this.num)
                }
            }
        })
    </script>
    </body>
    </html>

    可以,看到每点击一次按钮,num 就会加2,一次为子组件加,另一次是因为父组件冒泡而导致的

    stop 阻止冒泡

    <a v-on:click.stop="handle">跳转</a>
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>这是我的第一个vue页面</title>
    </head>
    <body>
    <div id="firstDemo" v-on:click='addNumParent'>
        <div>{{num}}</div>
        <button v-on:click.stop="addNum">点击递增1</button>
    </div>
    <script type="text/javascript" src="js/vue.js"></script>
    <script type="text/javascript">
        var vm = new Vue({
            el: '#firstDemo',
            data: {
                num: 0
            },
            methods: {
                addNum: function () {
                    this.num++
                },
                addNumParent: function () {
                    this.num++;
                    console.log(this.num)
                }
            }
        })
    </script>
    </body>
    </html>

    默认行为:

    当一个事件发生的时候浏览器自己默认做的事情

    例如 a 标签默认会有点击跳转 href 标签的行为

    prevent 阻止默认行为

    
    <a v-on:click.prevent="handle">跳转</a>
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>这是我的第一个vue页面</title>
    </head>
    <body>
    <div id="firstDemo">
        <a href="www.baidu.com" v-on:click.prevent="notGo">百度</a>
    </div>
    <script type="text/javascript" src="js/vue.js"></script>
    <script type="text/javascript">
        var vm = new Vue({
            el: '#firstDemo',
            data: {
                num: 0
            },
            methods: {
                notGo: function () {
                    alert('我就不跳转')
                }
            }
        })
    </script>
    </body>
    </html>

    5. 按键修饰符

    .enter 回车键

    <input v-on:keyup.enter='submit'>

    .esc 退出键

    <input v-on:keyup.delete='handle'>

    6. 自定义按键修饰符

    全局 config.keyCodes 对象

    Vue.config.keyCodes.f1 = 112
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>这是我的第一个vue页面</title>
    </head>
    <body>
    <div id="firstDemo">
        <input v-on:keyup.enter="myFun" placeholder="测试 enter 按键">
        <input v-on:keyup.81="myFunTemp" placeholder="测试 q 按键">
        <input v-on:keyup.f1="myFunF1" placeholder="测试 f1 按键">
        <input type="text" placeholder="得到任意键的keyCode" v-on:keyup="getKeyCode">
    </div>
    <script type="text/javascript" src="js/vue.js"></script>
    <script type="text/javascript">
        // 自定义 112 keyCode 码为变量f1
        Vue.config.keyCodes.f1=112;
        var vm = new Vue({
            el: '#firstDemo',
            data: {
            },
            methods: {
                myFun: function () {
                    alert('你按了 enter 键')
                },
                getKeyCode: function(event){
                    alert(event.keyCode)
                },
                myFunTemp: function () {
                    alert('您按了 q 键')
                },
                myFunF1: function () {
                    alert('您按了 f1 键')
                }
            }
        })
    </script>
    </body>
    </html>


     

    作者:蓝月

    -------------------------------------------

    个性签名:能我之人何其多,戒骄戒躁,脚踏实地地走好每一步

  • 相关阅读:
    opencv-识别手写数字
    opencv-图像遍历
    533. Lonely Pixel II
    531. Lonely Pixel I
    495. Teemo Attacking
    370. Range Addition
    487. Max Consecutive Ones II
    485. Max Consecutive Ones
    414. Third Maximum Number
    90. Subsets II
  • 原文地址:https://www.cnblogs.com/viplanyue/p/13573738.html
Copyright © 2011-2022 走看看