【Vue】模板语法 —— 表达式、插值、指令

简介: 【Vue】模板语法 —— 表达式、插值、指令

简介

模板语法大家多少都有所接触,例如百度模板引擎、ejs 等等


同样 Vue.js 也使用了基于 HTML 的模板语法,允许开发者声明式地将 DOM 绑定至底层 Vue 实例的数据


所有 Vue.js 的模板都是合法的 HTML ,所以能被遵循规范的浏览器和 HTML 解析器解析,通俗的讲 Vue 模板语法就是在使用 Vue.js 开发时,你可以写在 HTML 元素上的操作语法,让你开发更高效,例如:绑定样式,循环出元素列表等


表达式

在前端的发展历程中,为了提高开发效率,诞生了很多模板引擎,方便渲染元素或者绑定数据,很多引擎模板都采用 {{双大括号表达式}} 的语法进行插值


同样 Vue.js 也借鉴了Angular.js 的双花括号的方式,进行向页面输出数据和调用对象方法。让我们感受一下双大括号表达式.

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>模板语法</title>
        <script src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.9/vue.js"></script>
    </head>
    <body>
        <div id="app">
            <p>
                name:
                <input type="text" v-model="name">
            </p>
            <p>
                webSite:
                <input type="text" v-model="webSite">
            </p>
            <p>name: {{ name }}</p>
            webSite: <a :href="webSite">{{ webSite }}</a>
        </div>
        <script>
            new Vue({
                el: "#app",
                data: {
                    name: "",
                    webSite: ""
                }
            })
        </script>
    </body>
</html>


双大括号中的 {{name}}和{{webSite}},绑定至底层 Vue 实例的数据,在浏览器中就被渲染成实例 data 选项中的值。


6.png6..png





插值

文本

通过使用 v-once 指令你也能执行一次性地插值,当数据 改变时,插值处的内容 不会更新。但是你需要注意一下,该元素节点下面其他数据的绑定,数据改变,内容也不会更新


<p>name: {{ name }}</p>

修改

<p v-once>name: {{ name }}</p>

你可以发现此时数据并没有和加了v-once的标签进行动态绑定


[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VO7wp6NJ-1638169143370)(https://blog-img.uiuing.com/notes/images/202111291339938.png)]


HTML

此外, vue还支持对Html进行渲染, 添加指令v-html

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>模板语法</title>
        <script src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.9/vue.js"></script>
    </head>
    <body>
        <div id="app">
            <p>
                <input type="text" v-model="htmlData">
            </p>
            <p v-html="htmlData"></p>
        </div>
        <script>
            let vm = new Vue({
                el: "#app",
                data: {
                    htmlData: "",
                }
            })
        </script>
    </body>
</html>

7.png

特性

双大括号语法不能作用在 HTML 特性(标签属性)上,需要对标签属性操作,应该使用 v-bind 指令, 也可以缩写为:, 这仅限于 v-bind 指令

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>模板语法</title>
        <script src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.9/vue.js"></script>
    </head>
    <body>
        <div id="app">
            <input type="checkbox" :checked="isChecked"/></div>
        <script>
            let vm = new Vue({
                el: "#app",
                data: {
                    isChecked: false
                }
            })
        </script>
    </body>
</html>

8.png8..png

你也可以试试:class, 它的语法比较特殊, 类似键值对, 布尔值的value决定了String类型的Key是否显示

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>模板语法</title>
        <script src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.9/vue.js"></script>
        <style>
            .MagnifyText {
                font-size: 32px;
                font-weight: bold;
            }
        </style>
    </head>
    <body>
        <div id="app">
            <input type="checkbox" :checked="isChecked"/>
            <span v-bind:class="{'MagnifyText': fontResult}">uiu</span>
            <span :class="{'MagnifyText': !fontResult}">uiu</span>
        </div>
        <script>
            let vm = new Vue({
                el: "#app",
                data: {
                    isChecked: false,
                    nameStyle: "MagnifyWords",
                    fontResult: true
                }
            })
        </script>
    </body>
</html>

9.png


JavaScript 表达式

对于所有的数据绑定,Vue.js 都提供了完全的 JavaScript 表达式支持

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>模板语法</title>
        <script src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.9/vue.js"></script>
    </head>
    <body>
        <div id="app">
            <p>
                1 + 1 = {{ 1 + 1 }}
            </p>
            <p>
                {{ strReverse }} 反转:{{ strReverse.split("").reverse().join("") }}
            </p>
        </div>
        <script>
            let vm = new Vue({
                el: "#app",
                data: {
                    strReverse: "abc"
                }
            })
        </script>
    </body>
</html>


[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lkK2m3xy-1638169143376)(https://blog-img.uiuing.com/notes/images/202111291432728.png)]



指令

指令 (Directives) 是带有 v- 前缀的特殊特性。


参数

一些指令能够接收一个“参数”,在指令名称之后以冒号表示。


v-bind 指令可以用于响应式地更新 HTML 特性


例如第一次出现的

<a :href="webSite">{{ webSite }}</a>

v-on 指令,用于监听 DOM 事件


例如点击事件

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>模板语法</title>
        <script src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.9/vue.js"></script>
    </head>
    <body>
        <div id="app">
            <h1>{{ strTest }}</h1>
            <button v-on:click="strReverse">反转</button>
        </div>
        <script>
            let vm = new Vue({
                el: "#app",
                data: {
                    strTest: "abc"
                },
                methods: {
                    strReverse: function () {
                        this.strTest = this.strTest.split('').reverse().join('');
                    }
                }
            })
        </script>
    </body>
</html>


[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-s1wv2xpj-1638169143378)(https://blog-img.uiuing.com/notes/images/202111291443568.png)]

10.png


动态参数

上面属性或者事件我们都是写死的,其实在 Vue 它也可以是动态的。

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>模板语法</title>
        <script src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.9/vue.js"></script>
    </head>
    <body>
        <div id="app">
            <h1>{{ strTest }}</h1>
            <button v-on:[dp]="strReverse">反转</button>
        </div>
        <script>
            let vm = new Vue({
                el: "#app",
                data: {
                    strTest: "abc",
                    dp: "click"
                },
                methods: {
                    strReverse: function () {
                        this.strTest = this.strTest.split('').reverse().join('');
                    }
                }
            })
        </script>
    </body>
</html>


效果是一样的, 点击按钮时会触发事件回调


修饰符

修饰符是以半角句号 . 指明的特殊后缀,用于指出一个指令应该以特殊方式绑定,大致分为三类:


  • 事件修饰符
  • 按键修饰符
  • 系统修饰符


例如,事件修饰符中的.prevent修饰符和原生 event.preventDefault() 效果一样,可以阻止事件默认行为,在表单中点击提交按钮,就会发生页面跳转,但是使用了 .prevent 就不会发生跳转



指令缩写

v-bind

前面有提到过 v-bind ,可以直接简写为:


<a :href="https://uiuing.com">blog</a>

1

其他属性也可以简写


v-on

与 v-bind 有一些差异,v-on: 使用 @简写


<button @click="strReverse">反转</button>


相关实践学习
Serverless极速搭建Hexo博客
本场景介绍如何使用阿里云函数计算服务命令行工具快速搭建一个Hexo博客。
目录
相关文章
|
23天前
|
JavaScript API 开发者
Vue是如何进行组件化的
Vue是如何进行组件化的
|
24天前
|
JavaScript 前端开发 开发者
vue 数据驱动视图
总之,Vue 数据驱动视图是一种先进的理念和技术,它为前端开发带来了巨大的便利和优势。通过理解和应用这一特性,开发者能够构建出更加动态、高效、用户体验良好的前端应用。在不断发展的前端领域中,数据驱动视图将继续发挥重要作用,推动着应用界面的不断创新和进化。
|
26天前
|
JavaScript 前端开发 开发者
vue学习第一章
欢迎来到我的博客!我是瑞雨溪,一名热爱前端的大一学生,专注于JavaScript与Vue,正向全栈进发。博客分享Vue学习心得、命令式与声明式编程对比、列表展示及计数器案例等。关注我,持续更新中!🎉🎉🎉
31 1
vue学习第一章
|
23天前
|
JavaScript 前端开发 开发者
Vue是如何劫持响应式对象的
Vue是如何劫持响应式对象的
21 1
|
23天前
|
JavaScript 前端开发 API
介绍一下Vue中的响应式原理
介绍一下Vue中的响应式原理
27 1
|
23天前
|
JavaScript 前端开发 开发者
Vue是如何进行组件化的
Vue是如何进行组件化的
|
23天前
|
存储 JavaScript 前端开发
介绍一下Vue的核心功能
介绍一下Vue的核心功能
|
JavaScript 测试技术 容器
Vue2+VueRouter2+webpack 构建项目
1). 安装Node环境和npm包管理工具 检测版本 node -v npm -v 图1.png 2). 安装vue-cli(vue脚手架) npm install -g vue-cli --registry=https://registry.
1059 0
|
26天前
|
JavaScript 前端开发 索引
vue学习第三章
欢迎来到瑞雨溪的博客,一名热爱JavaScript与Vue的大一学生。本文介绍了Vue中的v-bind指令,包括基本使用、动态绑定class及style等,希望能为你的前端学习之路提供帮助。持续关注,更多精彩内容即将呈现!🎉🎉🎉
24 1
vue学习第三章
|
26天前
|
缓存 JavaScript 前端开发
vue学习第四章
欢迎来到我的博客!我是瑞雨溪,一名热爱JavaScript与Vue的大一学生。本文介绍了Vue中计算属性的基本与复杂使用、setter/getter、与methods的对比及与侦听器的总结。如果你觉得有用,请关注我,将持续更新更多优质内容!🎉🎉🎉
35 1
vue学习第四章