3.vue语法

快速入门Vue3——基础语法 Vue基础语法开讲啦! 阅读详情
在一个使用vue框架的页面应用程序中,至少要创建一个Vue实例,语法为 new Vue(),vue实例充当了MVVM模式中的ViewModel。创建vue实例时,需要传入一个选项对象,该对象可以包含数据、方法、组件生命周期钩子等。

1.第一个实例
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <!--引入Vue的包(可以官方下载)-->
    <script src="../JS/vue.js"></script>
    <title>第一个vue程序</title>
</head>
<body>
<!-- 将来new出来的vue实例会控制这个元素中的所有内容   这也是MVVM中的V-->
<div id="app">{{ message }}</div>
<script>
    //创建一个Vue的实例
    // 当我们导入包之后,启动浏览器,然后在浏览器的内存中,就多了一个 Vue 构造函数
    //  注意:我们 new 出来的这个 vm 对象,就是我们 MVVM中的 VM调度者
var  vm  = new Vue({
        el: '#app', // el表示,当前我们 new 的这个 Vue 实例,
        //要控制页面上的哪个区域(也就是数据要绑定页面上的哪个值)(也可以叫做挂载)
        // 这里的 data 就是 MVVM中的 M,专门用来保存 每个页面的数据的
        data: { // data 属性中,存放的是 el 中要用到的数据
        // 通过 Vue 提供的指令,很方便的就能把数据渲染到页面上,
            message: 'Hello vue!'
            //程序员不再手动操作DOM元素了
            //【前端的Vue之类的框架,不提倡我们去手动操作DOM元素了】
        }
    });
</script>
</body>
</html>

//另一种挂载方式:
var vm = new Vue({....}).$mount("#app");


2.插值:
{{message}} ->双花括号(也被叫做胡子语法) 用来表示文本插值
1.mustache 标签会替换为vue实例中数据对象上message属性的值。只要绑定的数据对象上
message属性发生了改变,插值处的内容就会被更新
2.mustache语法不能作用于HTML元素的属性上,要解决HTML元素属性值的绑定问题,
需要使用v-bind指令
3.mustache语法不能直接输出HTML元素,会将这些HTML元素当成文本输出出去,所以如果我
们真的想要输出HTML标签就需要使用V-html指令了
4.除了支持简单的绑定属性值外,对于所有的数据绑定,vue.js还提供了完全的
javascript表达式,所以我们还可以在mustache语法中使用表达式,如下:
{{a+b}},{{isLogin?username:'not login'}},
{{message.split('').reverse().join('')}},等。。。
5.插值表达式如果使用if()等语句或者是声明变量等,则不会生效,
会被当成字符串输出出去,如:{{var a =1}},{{if(ok){return message}}}


3.指令:
1.指令是带有v-前缀的特殊属性,其值限定为单个表达式。指令的作用是,
当表达式的值发生改变,将这个变化反映到DOM上。
2.在DOM中使用模板时(直接在一个HTML文件里编写模板),
还需要避免使用大写字符来命名动态参数,这是因为浏览器会把元素的属性名全部转换为
小写字符
3.在vue.js 2.6.0版本开始,指令的参数可以是动态参数,语法为指令:[js表达式],如下:
    <a v-bind:[attribute]="url">新浪网</a> 这里的attribute
    会被当做一个JavaScript的表达式进行动态求值,求得的值将作为最终的参数来使用
    假设vue实例中有一个数据对象属性为attribute,其值为href,那么这个绑定将等价于
    v-bind:href。如果attribute的值计算为null,那么这个绑定值将会被移除,
    最后的渲染效果如下:
            <a>新浪网</a>


4.指令详解:
指令是带有v-前缀的特殊属性,其值限定为单个表达式。指令的作用是,当表达式的值发生改变时,将其产生的连带影响应用到DOM上
4.1.内置指令:

v-show:
v-show指令根据表达式的值的真假,来显示或者隐藏HTML元素。
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <script src="../JS/vue.js"></script>
    <title>v-show</title>
</head>
<body>
<!--使用v-show时,我们可以看到元素本身是要被渲染出来的,
但是显示与否都是通过css样式属性display来控制的
,如果表达式的值计算为false,则样式会被设置为"display:none;",
如果计算出是true则不会。
-->
<div id="app">
    <h1 v-show="yes">yes!</h1>
    <h1 v-show="no">no!</h1>
    <!-- v-show中还可以使用js表达式来判断 -->
    <h1 v-show="age>25">age: {{age}}</h1>
</div>
<script>

    var vm = new Vue({
        el: '#app',
        data: {
            yes: true,
            no: false,
            age: 28
        }
    });
</script>
</body>
</html>



v-if / v-else-if / v-else:
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <script src="../JS/vue.js"></script>
    <title>v-if、v-else-if、v-else</title>
</head>
<body>
<!--使用v-if、v-else-if、v-else这三个指令用于实现条件判断
v-if:和v-show效果相同,但是当我们打开控制台时,可以看到当表达式结果为false的时候,
我们可以看到结果为false的元素并没有生成
v-if和v-show的区别:
v-show是会渲染表达式结果为false的元素,只不过会将该元素的css样式设置为"display:none;",
而v-if则不会生成相应元素
使用区别:v-if有更高的切换开销,而v-show有更高的初始渲染开销,因此,
如果需要非常频繁的切换元素,则使用v-show较好,如果在
运行时条件很少改变,则使用v-if较好

v-else-if、v-else:这两者都是和v-if一起使用的,可以实现互斥的条件判断

-->
<div id="app">
    <h1 v-if="yes">yes!</h1>
    <h1 v-if="no">no!</h1>
    <!-- v-if中也可以使用js表达式来判断 -->
    <h1  v-if="age>200">年龄是:{{age}}</h1>
    <h1 v-else="age>100">age: {{age}}</h1>
    <h1 v-else-if="age>50">年龄为:{{age}}</h1>

</div>
<script>

    var vm = new Vue({
        el: '#app',
        data: {
            yes: true,
            no: false,
            age: 28
        }
    });
</script>
</body>
</html>

需要注意的是当一个条件满足,后续的条件都不会再判断,
使用时,v-else-if和v-else要紧跟v-if



关于元素复用:
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>vue元素复用</title>
</head>
<body>
<script src="../JS/vue.js"></script>
<!--vue底层会为了性能进行输入框复用(想验证的话可以在输入框输入一些数据
然后点击切换,会发现输入框里的数据未被清空)
        所以,如果我们不想进行一些元素的复用,可以给他单独设置一个key
        (key相同代表可以复用,key不相同代表不可以复用)
-->
<div id="app">
    <span v-if="type">
        <label>用户账号:</label>
        <input placeholder="用户账号" key="username">
    </span>
    <span v-else>
        <label>邮箱账号:</label>
        <input placeholder="邮箱账号" key="email">
    </span>
    <button @Click="type = !type">切换按钮</button>
</div>
<script>
    const app=  new Vue({
        el:'#app',
        data:{
            type:true
        }
            // ,
        // methods: {
        //    clicktype() {
        //        this.type= this.type === 'email' ? 'username' :'emails'
        //    }
        // }
    })
</script>
</body>
</html>



v-for:
v-for顾名思义就是通过循环的方式来渲染一个列表,循环的对象可以是数组,也可以是对象

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <script src="../JS/vue.js"></script>
    <title>v-for</title>
</head>
<body>
<!--使用v-for进行循环遍历
  1.表达式语法为item in items,其中items是源数据数组,而item是被迭代的数组元素的别名
  2.v-for中的in也可以使用of来替代: <li v-for="item of movies">{{item}}</li>
  3.v-for中的表达式还支持一个可选的参数作为当前项的索引
  4.vue的核心是数据与视图的双向绑定,为了监测数组中元素的变化,以便能及时将变化反应到视图中,
    vue对数组的一些方法做了变异方法(也就是当数组用以下方式进行改变时,页面的数据跟着变化):
     4.1.push()
     4.2.pop()
     4.3.shift()
     4.4.unshift()
     4.5.splice()
     4.6.sort()
     4.7.reverse()
    数组中还有一些非变异方法:如filter(),concat()和slice(),它们不会改变原始数组,
    而是会返回一个新数组,面对这种方法时要想让vue帮我们更新视图,可以使用新数组替换原来的数组。
  5.vue检测到数组变化时,并不会直接重新渲染整个列表,而是会最大化的复用DOM元素,所以替换数组时,
    含有相同元素的项不会被重新渲染,所以我们可以大胆的使用新数组替换旧数组,而不用担心性能问题。
  6.有些方法导致数组发生变动,vue是不能检测到的:
    6.1.vm.movies[0] = e (根据数组下标来进行值的改变)
    6.2.vm.movies.length = 2 (修改数组的长度)
      如果要解决这种问题,我们可以使用以下的两种方式:
    6.1.1.Vue.set(vm.movies,0,"e") (使用Vue的全局set()方法) 等同于 vm.$set(vm.movies,0,"e")
    6.1.2.vm.movies.splice(0,2,"e") (使用数组原型的splice()方法)
      关于改变数组长度的问题,我们也可以使用数组原型的splice方法来解决:
    6.2.1:vm.movies.splice(2)
  7.过滤和排序问题:
    有时想要显示一个数组经过过滤和排序后的版本,但实际上不想改变原始数据的值,这种时候我们可以使用就算属性来
    帮我们完成这件事(如果计算属性不适用的情况下,我们也可以写一个方法进行)
  8.有关于v-for遍历对象:
    遍历对象的语法形式和遍历数组是一样的,即 value in object,其中object是被迭代的对象,vue是被迭代的对象
    属性的别名。如果要获取对象的属性名,可以使用可选参数的属性名参数(也就是键名)作为第二个参数,
    还可以用index作为第三个参数
  9.关于对象的更新检测:
    vue不能检测对象属性的添加和删除。要解决这个问题,可以使用vue全局的set()和delete()方法来添加或删除属性($set
    和$delete同理),并触发视图更新
    9.1.Vue.set(vm.book,'publishData','2020-12-28')
    9.2.Vue.delete(vm.book,'name')
  10.在<template>上使用v-for:
     类似于v-show和v-if,也可以利用v-for指令来让<template>来循环渲染一堆包含多个元素的内容
  11.有关于v-for中的key属性:
     当vue正在更新使用v-for渲染的元素列表时,它默认使用的是"就地更新"策略。如果数据项的顺序被改变,vue将不会移动
     DOM元素来匹配数据项的顺序,而是就地更新每个元素,并保证它们在每个索引位置正确渲染。所以我们为了给vue一个提示,
     以便它能跟踪每个节点的身份,从而重用和重新排序现有元素,需要为列表的每一项提供一个唯一key属性,key属性的类型
     只能是String或者Number类型
  12.v-for和v-if一同使用时:
   v-for的优先级比v-if高,这意味着v-if将分别重复运行于每个v-for循环中。如果渲染一个列表时,对列表中的某些项需要
   根据条件来判断是否要渲染,那么就可以将v-if和v-for一起使用(说白了就是v-if和v-for可以一起使用)
-->
<div id="app">
    <li v-for="(item,index) in movies">{{index}}-》{{item}}</li>
    <button @Click="btnClick">修改</button>
    <br>
    <li v-for="number in evenNumbers">{{number}}</li>
    <br>
    <li v-for="n in even(numbers)">{{n}}</li>
    <br>
    <!--vue中还可以这样接受整数,它会把模板重复对应的次数-->
    <li v-for="num in 10">{{num}}</li>
    <hr>
    <li v-for="value in book">{{value}}</li>
    <br>
    <li v-for="(value,key) in book">{{key}}:{{value}}</li>
    <br>
<div>
    <ul>
        <!--如果决定要根据某个条件跳过整个循环的执行,那么可以将v-if置于外层元素(比如template)上 -->
        <template v-for="item,index in 5" v-if="item != 5">
            <div v-if="item != 2">{{index}}---{{item}}</div>
        </template>
    </ul>
</div>
    <br>
    <li v-for="(item,index) in numbers" v-if="item != 1">{{index}}-》{{item}}</li>
</div>
<script>

    var vm = new Vue({
        el: '#app',
        data: {
            movies: ["a", "b", "c", "d"],
            numbers: [1, 2, 3, 4, 5],
            book:
                {
                    name: "vue从入门到实战",
                    author: "孙鑫"
                },
            books: [
                {
                    name: "深入理解jvm",
                    author: "孙鑫1"
                },
                {
                    name: "深入理解vue",
                    author: "孙鑫2"
                },
                {
                    name: "深入理解微服务",
                    author: "孙鑫3"
                }
            ]

        },
        //计算属性的形式
        computed: {
            evenNumbers: function (numbers) {
                return this.numbers.filter(function (number) {
                    //  能取模干净的值
                    return number % 2 === 0
                })
            },
            nameEquals: (name) => {
                return name == "孙鑫2"
            }
        },
        //方法的形式
        methods: {
            even: function (numbers) {
                return this.numbers.filter((number) => {
                    return number % 2 === 0
                })
            },
            //Vue.set()的赋值测试
            btnClick() {
                //两者都可以
                // Vue.set(this.movies, 0, "e")
                this.$set(this.movies, 0, "e")
            }
        }

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



v-bind:
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <script src="../JS/vue.js"></script>
    <title>v-bind</title>
</head>
<body>
<!--
   1.v-bind主要是用于更新HTML元素的属性,将一个或者多个属性或者一个组件的prop动态绑定到表达式
   2.v-bind指令还可以直接绑定一个有属性的对象
-->
<div id="app">
    <!--绑定一个属性-->
    <img v-bind:src="imgSrc" >
    <!--语法糖-->
    <img :src="imgSrc" >
    <!--动态属性名(2.6.0以后才支持)-->
    <a :[attrName]="url">链接</a>
    <!--内联字符串拼接-->
    <img :src="'images/'+fileName" >
</div>
<script>

    var vm = new Vue({
        el: '#app',
        data: {
           imgSrc: 'images/img.jpeg',
            attrName:'href',
            url:'https://fanyi.baidu.com/?aldtype=16047#en/zh/',
            fileName:'img.jpeg'
        }
    });
</script>
</body>
</html>



v-model:
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <script src="../JS/vue.js"></script>
    <title>v-model</title>
</head>
<body>
<!--
    v-model指令用在表单<input>,<textarea>及<select>元素上创建双向数据绑定,它会根据控件类型自动获取
    正确的方法来更新元素。尽管有些神奇,但v-model本质上不过是语法糖。它负责监听用户的输入事件以更新数据,并对
    某些极端场景进行特殊处理

-->
<div id="app">
    <h3>{{message}}</h3>
    <input type="text" v-model="message">
</div>
<script>

    var vm = new Vue({
        el: '#app',
        data: {
            message: 'hello world'
        }
    });
</script>
</body>
</html>


v-on:
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <script src="../JS/vue.js"></script>
    <title>v-on</title>
</head>
<body>
<!--
    1.v-on指令用于监听DOM事件,并在触发时运行一些javaScript代码。v-on指令的表达式可以是一段javaScript代码,
      也可以是一个方法或者方法调用语句。
    2.方法是在选项对象的methods属性中定义的,该属性是一个对象属性。在methods属性中定义的方法,可以直接通过Vue
      实例来访问
    3.在开发中尽量不要使用javaScript语句,尽量使用方法的形式
    4.在页面渲染中,并不会在v-on指令所在的元素上出现对应的javaScript事件属性
    5.当vue实例销毁时,所有事件处理器都会被自动删除,所以无需担心如何清理它们
    6.如果在事件绑定的方法中需要访问原始的DOM事件,可以使用特殊变量$event把它传入方法。在使用v-on指令绑定事件
      处理时,就可以使用$event传入原始的DOM事件对象,然后在事件处理器方法中访问原生的事件对象。
    7.事件修饰符:
      事件修饰符是由(.)开头的指令后缀来表示,紧接在事件名称后书写。针对v-on指令,vue还提供了以下的修饰符:
      7.1:.stop:调用event.stopPropagation()(阻止事件冒泡到父元素,阻止任何父事件处理程序被执行。阻止事件继续传播)
      7.2:.prevent:调用event.preventDefault()(通知浏览器不要执行与事件关联的默认动作)
      7.3:.capture:添加事件监听器时使用capture模式(.capture事件修饰符的作用是添加事件侦听器时使用事件捕获模式
          即是给元素添加一个监听器,当元素发生冒泡时,先触发带有该修饰符的元素。
          若有多个该修饰符,则由外而内触发,就是谁有该事件修饰符,就先触发谁。 )
      7.4:.self:只当事件是从特定的元素本身触发时才触发回调
      7.5:{keyCode|keyAlias}:只当事件是从特定按键触发时才会触发回调。
      7.6:.native监听组件根元素的原生事件
      7.7:.once:只触发一次回调
      7.8:初次之外还有一些需要在vue.js的版本在2.2.0以上时才会有
          .left:只当按鼠标左键时触发
          .right:只当按鼠标右键时触发
          .middle:只当按鼠标中键时触发
          .passive:以{passive:true}模式添加侦听器(2.3.0版本)
      7.9.样例:
           //阻止事件继续传播
           <a @click.stop="doThis"/>
           //提交事件不再重新加载页面
           <from v-on:submit.prevent="onSubmit"></from>
           //修饰符是可以串联的
           <a @click.stop.prevent=“doThis”/>
           //也可以只有修饰符
           <from v-on:submit.prevent></from>
           //添加事件监听器时使用事件捕获模式
           //即内部元素触发事件先在该事件处理函数中处理,然后交由内部元素进行处理
           <div v-on:click.capture="doThis">...</div>
           //只当在event.target是当前元素本身时触发函数
           //即事件不是从内部元素触发的
           <div v-on:click.self="doThis">...<div>
           //单击事件处理函数将只执行一次
           <a v-on:click.once="doThis"></a>
      7.10:需要说明的是:
        7.10.1:DOM事件规范支持两种事件模型,即捕获事件和冒泡型事件,捕获型事件从最外层的对象(window)开始,
                知道引发事件的对象;冒泡型事件从引发事件的对象开始,一直向上传播,直到最外层的对象结束。任何发生在
                DOM事件模型中的事件,首先进入捕获阶段,直到最外层对象结束。任何发生在DOM事件模型中的事件,首先进入
                捕获阶段,直到达到目标对象,再进入冒泡阶段。v-on指令提供.stop和.capture修饰符即与此有关。
        7.10.2:修饰符可以串联在一起使用,但顺序很重要。例如,使用v-on:click.prevent.self会阻止所有的单击,而
                v-on:click.self.prevent只会阻止对元素自身的单击
        7.10.3:如果某个时间只需要响应一次,可以使用.once修饰符
    8.按键修饰符:
        .enter
        .tab
        .delete
        .esc
        .space
        .up
        .down
        .left
        .right
      在2.1.0版本中新加:
        .ctrl
        .alt
        .shift
        .meta
      8.1:样例:
           //只有在按键是回车键时调用
           <input @keyup.enter="submit">
           //使用回车键的按键码(有的按键没有现成的时候,我们可以通过按键码来这样做)
           <input v-on:keyup.13="submit">
           //.exact修饰符是2.5.0中新增的,用于精确控制系统修饰符组合触发的事件
           //只有在按住ctrl键而不按其他按键时才会触发
           <button @click.ctrl.exact="onCtrlClick">A</button>
-->
<div id="app">
    <h1>{{count}}</h1>
  <!--1.click事件直接使用javaScript语句-->
   <button @Click="count += 1">添加</button>
    <!--2.click事件使用内联语句调用方法-->
    <button @Click="say('hi')">弹窗</button>
</div>
<script>

    var vm = new Vue({
        el: '#app',
        data: {
            count: 0
        },methods:{
            say(msg){
                alert(msg)
            }
        }
    });
</script>
</body>
</html>



v-text:
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <script src="../JS/vue.js"></script>
    <title>v-text</title>
</head>
<body>
<!--
   1.v-text元素用来更新元素的文本内容
   2.如果只是更新部分文本内容,那么还是用{{Mustache}}插值形式
-->
<div id="app">
    <span v-text="message"></span>
   <!-- 等价于<span v-text>{{message}}</span> -->
</div>
<script>

    var vm = new Vue({
        el: '#app',
        data: {
           message:"HEllO Vue.js"
        }
    });
</script>
</body>
</html>



v-html:
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <script src="../JS/vue.js"></script>
    <title>v-html</title>
</head>
<body>
<!--
   1.v-html指令用于更新元素的innerHTML,该部分内容作为普通的HTML代码插入,不会作为Vue模板进行编译。
   2.在网站上渲染任意的HTML内容是十分危险的,因为容易导致XSS攻击。所以只在可信的内容上使用v-html,永远不要在用户
     提交的内容上使用v-html
-->
<div id="app">
<div v-html="hElt"></div>
</div>
<script>

    var vm = new Vue({
        el: '#app',
        data: {
           hElt:"<h1>HEllO Vue.js</h1>"
        }
    });
</script>
</body>
</html>



v-once:
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <script src="../JS/vue.js"></script>
    <title>v-once</title>
</head>
<style>
    a {
        margin: 20px;
    }
</style>
<body>
<!--
   1.v-once指令可以让元素或组件只渲染一次,该指令不需要表达式。之后再次渲染时,元素/组件及其所有的子节点将被视为
     静态内容并跳过。这可以用于优化更新性能。
   2.具体渲染效果:表面上是没有任何区别的,但是实际上,我们可以在浏览器的console窗口输入下面的语句回车测试
     vm.navs.push({name:'论坛',url:'/bbs'})
     你会发现页面没有任何变化,这就是v-once指令的作用,只渲染一次,渲染的结果在之后将作为静态内容而存在
-->
<div id="app">
    <h1>{{title}}</h1>
    <a v-for="nav in navs" href="nav.url" v-once>{{nav.name}}</a>
</div>
<script>

    var vm = new Vue({
        el: '#app',
        data: {
            title:"v-once指令的用法",
            navs:[
                {name:'首页',url:'/home'},
                {name:'新闻',url:'/news'},
                {name:'视频',url:'/video'}
            ]
        }
    });
</script>
</body>
</html>



v-pre:
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <script src="../JS/vue.js"></script>
    <title>v-pre</title>
</head>
<body>
<!--
   1.v-pre指令也不需要表达式,用于跳过这个元素和它的子元素的编译过程。v-pre指令可以用来显示原始的
     Mustache标签,对于大量没有指令的节点使用v-pre指令可以加快编译的速度
-->
<div id="app">
    <h1 v-pre>{{message}}</h1>
   <!-- 等价于<span v-text>{{message}}</span> -->
</div>
<script>

    var vm = new Vue({
        el: '#app',
        data: {
           message:"HEllO Vue.js"
        }
    });
</script>
</body>
</html>



v-cloak:
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <script src="../JS/vue.js"></script>
    <title>v-cloak</title>
</head>
<style>
    [v-cloak] {
        display: none;
    }
</style>
<body>
<!--
   1.v-cloak指令也不需要表达式,这个指令保持在元素上直到关联实例编译结束,编译结束后该指令被移除。当和
     CSS规则如: [v-clock]{display:none} 一起使用时,这个指令可以隐藏未编译的Mustache标签直到实例准备完毕
   2.浏览器在加载页面时,如果网速较慢或者页面较大,那么浏览器在构造完DOM树后会在页面中直接显示{{message}}字样,
     直到vue的js文件加载完毕,vue实例创建,模板编译后,{{message}}才会被替换成数据对象中的内容。这个过程中页面
     是会有闪烁的,这样用户体验不好,所以我们可以加上一项css规则:[v-cloak]{ display: none;},配合v-cloak
     指令一起使用,就可以解决这个问题
-->
<div id="app">
    <h1 v-cloak>{{message}}</h1>
   <!-- 等价于<span v-text>{{message}}</span> -->
</div>
<script>

    var vm = new Vue({
        el: '#app',
        data: {
           message:"HEllO Vue.js"
        }
    });
</script>
</body>
</html>


自定义指令:
全局自定义指令:
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <script src="../JS/vue.js"></script>
    <title>v-全局注册组件</title>
</head>
<body>
<!--
     自定义指令需要注册后才能使用,vue提供了两种注册方式:
       1.全局注册:
         1.1.全局注册使用 Vue.directive()方法来注册一个全局自定义指令,该方法接受两个
         参数,第一个参数是指令的ID(即名字);第二个参数是一个定义对象或者函数对象,
         指令要实现的功能在这个对象中定义。
         //语法如下:Vue.directive(id,[definition]]),
         指令名称不需要加 v- 前缀,默认是自动加上前缀的,使用指令的时候一定要加上前缀
           全局注册的组件可以在任何Vue实例的模板中使用
           所有自定义组件的第二个函数还可以有其他的值,并且支持动态指令参数
-->
<div id="app" class="demo">
    <!-- 全局注册 -->
    <input type="text" placeholder="我是全局自定义指令" v-focus>
</div>
<script>
    Vue.directive("focus", {
        inserted: function(el){
            el.focus();
        }
    })
    new Vue({
        el: "#app"
    })

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


局部自定义组件:
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <script src="../JS/vue.js"></script>
    <title>v-局部注册组件</title>
</head>
<body>
<!--
     自定义指令需要注册后才能使用,vue提供了两种注册方式:
       1.局部注册:
         1.1.局部注册的自定义指令只能在该实例绑定的视图中使用。
         所有自定义组件的第二个函数还可以有其他的值,并且支持动态指令参数
-->
<div id="app" class="demo">
    <!-- 局部注册 -->
    <input type="text" placeholder="我是局部自定义指令" v-focus2>
</div>
<script>
    new Vue({
        el: "#app",
        directives: {
            focus2: {
                inserted: function(el){
                    el.focus();
                }
            }
        }
    })
</script>
</body>
</html>



自定义指令的钩子函数:
自定义指令的功能是在定义对象中实现的,而定义对象则是由钩子函数组成的,
vue提供了以下几个钩子函数,这些钩子函数都是可选的。
  1.bind:只调用一次,指令第一次绑定到元素时调用。
    指令如果需要一些一次性的初始化设置,可以放在这个钩子函数中。
  2.inserted:被绑定元素插入父节点时调用(父节点存在即可调用,不比存在于document
  对象中)
  3.update:所在组件的VNode更新是调用(无论指令的值是否发生了变化),但是可能发生
  在其子VNode更新之前。可以通过比较更新前后的值来忽略不必要的模板更新。
  4.componentUpdated:指令所在组件的VNode及其子VNode全部更新后调用。
 5.只调用一次,指令与元素解绑时调用

 

「Vue3系列」Vue3 模板语法 在 Vue 3 中,表达式是模板语法中的一个重要概念,它允许你在模板中嵌入 JavaScript 代码来动态地渲染内容、计算值或执行方法。在 Vue 3 中,修饰符(Modifiers)是与指令一同使用的特殊标记,用于修改指令的默认行为。可以在模板中插入 JavaScript 表达式,表达式的值会被计算并插入到 HTML 中。,它用于在监听滚动或触摸事件时优化性能,因为它告诉浏览器你不想阻止这些事件的默认行为。来包裹表达式,这些表达式会在 Vue 实例的数据或方法发生变化时自动更新。 阅读详情

相关推荐

vasp计算练习1-Si

si的vasp训练流程

qq_41074165的博客 3296

Web前端-Vue--组件

组件 1.全局组件 在所有被vue挂载的页面目标中都可以使用 全局组件的渲染 Vue.component("组件标签名称",{ //组件的封装信息 template:"组件显示的页面html", // data: 组件使用的变量 methods:{ 组件的事件驱动函数 } }) ...

yanghainan0318的博客 466

基于ThingsBoard+ESP8266的MQTT远程控制实战:从设备接入到仪表盘交互

本文详细介绍了基于开源物联网平台ThingsBoard与ESP8266开发板,通过MQTT协议实现远程控制的完整实战流程。从环境搭建、设备创建、仪表盘设计到核心代码编写与联调,手把手指导完成从云端到硬端的物联网闭环,为智能家居与物联网原型开发提供低成本、高效率的解决方案。

weixin_29192365的博客 330

Vue行内、{{}}内的多条件,多重判断

Vue行内、{{}}内的多条件,多重判断

qq_38305872的博客 2268

FI 应计对象的创建和摊销

创建/修改:ACACTREE01/ACACTREE02 应计对象的过账:ACACPOSTING

nancyln9711的博客 903

TBOX(Telematics Box)在智能网联汽车中的核心功能与应用场景解析

TBOX(Telematics Box)是智能网联汽车的“中枢神经”,基于Android或Linux操作系统,并通过CAN总线与车辆深度交互。它实现了远程控制、车辆状态监控、OTA升级及紧急呼叫(E-CALL)等核心功能,是提升用车安全、便利性与实现车辆持续进化的关键技术组件。

weixin_29158413的博客 803

Vue —— 条件语句 & 循环语句

Vue 的条件语句——v-if、v-show。及其区别!

HuoZhiyan 的博客 3804

configure: error: no acceptable C compiler found in $PATH解决方案

本文主要介绍了configure: error: no acceptable C compiler found in $PATH解决方案,希望能对使用Linux的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案

weixin_43178406的博客 4万+

vue的模板语法 {{ }} 和 v- 指令

1.模板语法(插值语法) 2.v-if v-else-if v-else 指令 (是否渲染) 3.v-show 指令 (是否显示) 4.v-on 指令 简写(@)(绑定methods里面的事件) 5.v-blind 简写(:) 语法v-blind:属性='属性值' 绑定类名(class)和属性(style) 6.v-model (数据双向绑定) 7.v-for 遍历渲染数据 8.v-html 和 v-text 给标签添加内容 9.事件修饰符 10.按键修饰符......

欢迎来到我的博客!在这里,我将分享我在前端开发方面的知识和经验。让我们一起探索前端开发的无限可能! 4753

YOLOv8模型改进、剪枝、蒸馏和Web端界面的直观展示

模型蒸馏与性能提升 为了进一步优化YOLOv8模型,可以使用蒸馏技术将大型模型的知识转移到小型模型中。在模型蒸馏过程中,通过定义适当的损失函数和训练策略,学生网络可以学习教师网络的知识,并达到接近教师网络性能的效果。这样做不仅可以减少模型的存储和计算开销,还可以提高模型的推理速度和实时应用的响应能力。这样,用户可以直观地观察到模型的性能和应用的效果。为了优化YOLOv8模型并实现直观地观看检测效果或训练结果的全家通应用,本文将探讨如何通过改进、剪枝和蒸馏技术,并结合Web端界面来提升模型性能。

weixin_51988935的博客 2397

【ATC/DTC方法第一期】经典平均/昼夜温度周期ATC/DTC方法介绍(含Python代码实现)

【ATC/DTC方法第一期】经典平均/昼夜温度周期ATC/DTC方法介绍(含Python代码实现)

WW、forever的博客 484

3 vue的if语法

介绍vue的if语法及注意点。

no996yes885的博客 1444

【QNX+Android虚拟化方案】00 - 系列文章链接汇总

【QNX+Android虚拟化方案】00 - 系列文章链接汇总

|~~~热爱生活、努力学习的小伙汁~~~| 1万+

Vue基础——VueJS是什么、Vue的优缺点、vue2和vue3的模板区别、MVVM数据双向绑定、Vue的安装和使用、Vue模板语法-文本渲染、常用的vue的指令

Vue基础——VueJS是什么、Vue的优缺点、vue2和vue3的模板区别、MVVM数据双向绑定、Vue的安装和使用、Vue模板语法-文本渲染、常用的vue的指令

ranran0306的博客 9707

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

【VueJS】sublime text3支持VueJS语法高亮显示插件vue-syntax-highlight

1.sublime text3支持VueJS语法高亮显示插件vue-syntax-highlightgithub地址: https://github.com/vuejs/vue-syntax-highlight 2.下载vue-syntax-highlightgithub包 下载完成得到vue-syntax-highlightgithub包 ...

406

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

vue3之语法糖

vue3比vue2的特别之处

work_fei的专栏 9284

Vue3 中的模板语法

我们可以把 Vue.js 的模板语法,直接理解为 HTML 语法的一种扩展,它所有的模板节点声明、属性设置和事件注册等都是按照 HTML 的语法来进行扩展设计的。按照官方的说法就是“所有的 Vue 模板都是语法层面合法的 HTML,可以被符合规范的浏览器和 HTML 解析器解析”。 Vue 使用一种基于 HTML 的模板语法,使我们能够声明式地将其组件实例的数据绑定到呈现的 DOM 上

weixin_62897746的博客 3744

Vue3 模板语法

特性v-ifv-showv-for(需key渲染方式条件为假时销毁元素始终渲染,切换 CSS动态生成列表项性能初始渲染开销低切换开销低列表变化时依赖key优化适用场景不频繁切换的条件频繁显示/隐藏动态列表数据。

2301_82023822的博客 1750

Vue3基础语法

在这个章节中,简单的看下Vue3的基础语法,有了这些基础后,对写vue3单页也就没有什么问题了。

小张微说的博客 1302

Vue3 基础语法

Vue3 基础语法以其简洁和灵活的特点,适合构建现代 Web 应用。无论是通过 Options API 还是 Composition API,开发者都可以根据需求选择合适的开发方式。单文件组件进一步提升了开发效率,推荐初学者从官方文档和教程入手,逐步深入。功能描述示例创建实例使用并挂载到 DOM 元素文本插值使用{{ }}显示数据指令包括v-bindv-ifv-forv-modelv-on等事件处理通过绑定事件计算属性缓存的派生状态,依赖项变化时重新计算组件可复用的独立单元,通过定义。

likuoelie的博客 1028

Vue3核心语法

点我+1

2301_79518744的博客 1208

Vue3 语法

Vue3 中,和 Vue2 一样,也是通过自定义事件来实现子组件给父组件传值。< template > < button @ click = "toFather" > 按钮 < / button > < / template > < script setup lang = "ts" > const emit = defineEmits([ 'getData' ]) const toFather =() => {// 调用自定义事件,并传值 emit('getData' , 100);

weixin_45137240的博客 1748

在vue3中使用jsx语法

背景 vue3项目中 使用composition-api配合hooks形式,按业务分离,逻辑更清晰,维护更方便; 由于template模板语法受vue文件格式限制,在hooks函数中需要return太多变量,维护麻烦; 使用在hooks文件里面使用jsx代替template就可以解决这类问题。 语法 ::: tip 下面主要通过对比jsx和template不同语法,来实现同样的功能 ::: 一丶 普通内容 普通内容常量,写法是一样的 //jsx 写法 setup() { return ()=&g

希望有一天 2万+
上一篇: 2.es6的语法
下一篇: 4.vue中的计算属性
亦难猿
博客等级 码龄8年 6粉丝 15原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值