IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> JavaScript知识库 -> Vue | Vue.js 基础 模版语法 -> 正文阅读

[JavaScript知识库]Vue | Vue.js 基础 模版语法

🖥? Vue.js专栏:Vue 基础 模版语法
🧑?💼 个人简介:一个不甘平庸的平凡人🍬

? 个人主页:CoderHing的个人主页

🍀 格言: ?? 路漫漫其修远兮,吾将上下而求索??

👉 你的一键三连是我更新的最大动力??


目录

一、Mustache语法

模版语法

二、Mustache双大括号语法(掌握)

三、常见的基本指令

v-once指令(了解)

v-text指令

V-html指令

V-pre指令

v-cloak? cloak=>斗篷的意思

v-memo(新)

四、v-bind绑定属性

绑定基本属性

五、绑定class 和style

绑定class介绍

绑定class-对象语法

绑定class-数组语法

绑定style属性介绍

动态绑定属性

绑定一个对象

v-on绑定事件

v-on的用法

v-on的基本使用

v-on参数传递

v-on的修饰符

六、Vue的条件渲染

条件渲染

template元素

v-show

v-show和v-if的区别


一、Mustache语法

模版语法

React的开发模式:

React使用jsx 所以对应的代码都是编写类似于js的一种语法;

之后通过Babel将jsx编译成React.creatElement函数调用

Vue也支持jsx的开发模式

大多情况下,使用基于HTML的模版语法;

在模版中 允许开发者以声明式的方式将DOM底层组件实例的数据?绑定在一起

在底层的实现中,Vue将模版编译成虚拟DOM渲染函数,

二、Mustache双大括号语法(掌握)

如果我们希望把数据显示到模版中,使用最多的语法是"Mustache语法(双大括号)的文本插值"

data返回的对象?是有添加到Vue的响应式系统中

data中的数据发生变化时?对应的内容也会发生更新

当然 Mustache中不仅仅可以是data中的属性 也可以是一个 JavaScript的表达式

JavaScript
<div id="app">
????<!-- 1 基本使用 -->
????<h2>{{message}}</h2>
????<h2>当前计数:{{counter}}</h2>

????<!-- 2 表达式 -->
????<h2>计数双倍:{{ counter * 2 }}</h2>
????<h2>展示信息:{{ infos.split(" ") }}</h2>

????<!-- 3 三元运算符 -->
????<h2>{{ age>=18? "成年人":"未成年人" }}</h2>

????<!-- 4 调用methods中的函数 -->
????<h2>{{ formateDate(time) }}</h2>

????<!-- 5 注意:这里不能定义语句! if语句也不支持 -->
</div>
<script src="../lib/vue.js"></script>
<script>
????// 创建app
????const app = Vue.createApp({
????????data: function () {
????????????return {
????????????????message: "Hello Vue!",
????????????????counter: 100,
????????????????infos: "my name is xiong",
????????????????age: 22,
????????????????time: 123
????????????}
????????},
????????methods: {
????????????formateDate(data) {
????????????????return "2020-10-10 " + data
????????????}
????????}
????})
????// 挂载app
????app.mount('#app')

三、常见的基本指令

v-once指令(了解)

v-once用于指定元素或组件只能渲染一次

当数据发生变化时?元素或组件以及其所有子元素将视为静态内容?并且跳过

该指令可以用于性能优化

HTML
<div id="app">
????????<!-- 指令:v-once =>只渲染一次 -->
????????<h2 v-once>{{ message }}
????????????<span>数字:{{counter}}</span>
????????</h2>
????????<h1>{{ message }}</h1>
????????<button @click="changeMessage">改变message</button>
????</div>

JavaScript
<script src="../lib/vue.js"></script>
????<script>
????????// 创建app
????????const app = Vue.createApp({
????????????data: function () {
????????????????return {
????????????????????message: "Hello Vue!",
????????????????????counter: 100
????????????????}
????????????},
????????????methods: {
????????????????changeMessage() {
????????????????????this.message = "你好,Vue!"
????????????????????this.counter += 100
????????????????????console.log(this.message, this.counter)
????????????????}
????????????}
????????})
????????// 挂载app
????????app.mount('#app')

v-text指令

用于更新元素textContent:

JavaScript
?<h2 v-text="message">aaaa</h2> //此时拿到message 会把'aaaa'覆盖掉

V-html指令

默认情况下,展示的内容本身是html的,那么vue不会对他进行特殊的解析

如果我们希望这个内容被Vue解析出来,可以使用v-html来展示

HTML
<div id="app">
????????<h2>{{content}}</h2>
????????<h2 v-html="content"></h2>

????</div>

JavaScript
<script src="../lib/vue.js"></script>
????<script>
????????// 创建app
????????const app = Vue.createApp({
????????????data: function () {
????????????????return {
????????????????????content: '<span style="color:red;font-size:30px;">哈哈哈哈</span>'
????????????????}
????????????},
????????})
????????// 挂载app
????????app.mount('#app')
????</script>

V-pre指令

v-pre用于跳过元素和它的子元素的编译过程,显示原始的Mustache标签:

跳过不需要编译的节点,加快编 译的速度

HTML
<div id="app">
????????<h2>{{message}}</h2>
????????<p>当前计数{{counter}}</p>
????????<!-- 当加了v-pre之后 ?将不会编译 -->
????????<p v-pre>{{}}</p>
????</div>

JavaScript
<script>
????????// 创建app
????????const app = Vue.createApp({
????????????data: function () {
????????????????return {
????????????????????message: "Hello Vue!",
????????????????????counter: 0
????????????????}
????????????},
????????})
????????// 挂载app
????????app.mount('#app')

????</script>

v-cloak? cloak=>斗篷的意思

这个指令保持在元素上直到关联组件实例结束编译

它必须和css一起使用,这个指令可以隐藏未编译的Mustache标签直到组件实例准备完毕

CSS
<style>
????????[v-cloak] {
????????????display: none;
????????}
????</style>

HTML
<div id="app">
????????<h2 v-cloak>{{message}}</h2>
????</div>

JavaScript
<script src="../lib/vue.js"></script>
<script>
????setTimeout(() => {
????????// 创建app
????????const app = Vue.createApp({
????????????data: function () {
????????????????return {
????????????????????message: "Hello Vue!"
????????????????}
????????????},
????????})
????????// 挂载app
????????app.mount('#app')
????}, 3000);
</script>

v-memo(新)

指定数据发生改变,才改变其他数据,其他数据发生改变,不会改变

HTML
<div id="app">
????????<div v-memo="[name]">
????????????<h2>姓名:{{name}}</h2>
????????????<h2>年龄:{{age}}</h2>
????????????<h2>身高:{{height}}</h2>
????????????<!-- 需求 只有name发生改变 其他东西才改变 ?-->
????????</div>
????????<button @click="updataInfo">改变信息</button>
????</div>

JavaScript
<script src="../lib/vue.js"></script>
????<script>
????????// 创建app
????????const app = Vue.createApp({
????????????data: function () {
????????????????return {
????????????????????name: "xiong",
????????????????????age: 18,
????????????????????height: 1.88
????????????????}
????????????},
????????????methods: {
????????????????updataInfo() {
????????????????????this.name = "kobe"
????????????????????// this.age = 20
????????????????}
????????????}
????????})
????????// 挂载app
????????app.mount('#app')

四、v-bind绑定属性

前面的这些指令,主要是将值 插入到 模版内容中

但是除了内容需要动态来决定外,某些 属性 我们也希望动态来绑定

????????如 动态绑定a元素的href属性 ?动态绑定img元素的src属性

绑定属性我们使用v-bind:

????????缩写:?:

????????预期:any|Object

????????参数:attrOrProp

????????修饰符:?.camel - 将kebab-case attribute 名转换为 camelCase

????????用法:动态地绑定一个或多个attribute或一个组件prop到表达式

绑定基本属性

v-bind用于绑定一个或多个属性值,或者向另一个组件传递props值

HTML
<div id="app">
????<!-- 1 绑定img的src属性 -->
????<img v-bind:src="imgUrl" alt="">
????<!-- <img :src="imgUrl" alt=""> 语法糖写法 -->

????<!-- 2 绑定a的超链接 -->
????<a v-bind:href="href">百度一下</a>
????<!-- <a :href="href">百度一下</a> -->
</div>

JavaScript
<script src="../lib/vue.js"></script>
<script>
????// 创建app
????const app = Vue.createApp({
????????data: function () {
????????????return {
????????????????message: "Hello Vue!",
????????????????imgUrl: "http://p1.music.126.net/SZx_bVkBZ20dKE1YZrH_wQ==/109951167861631226.jpg",
????????????????href: "http://www.baidu.com"
????????????}
????????},
????})
????// 挂载app
????app.mount('#app')
</script>

五、绑定class 和style

绑定class介绍

在开发中,我们的元素class也是动态的,如:

????????当数据为某个状态时 字体为红色

????????当数据为另一个状态时,字体为黑色

绑定class有两种方式:

????????对象语法

????????数组语法

绑定class-对象语法

对象语法: 我们可以传给 :class一个对象,动态切换class

JavaScript
<div id="app">
????<!-- 1 基本绑定class -->
????<h2 class="classes">Hello World</h2>

????<!-- 2 动态class可以写对象语法 -->
????<button :class=" isActive ? 'active':'' " @click="btnC">我是按钮</button>

????<!-- 2 1 对象语法的基本使用 -->
????<button :class="{ active:isActive }" @click="btnC">我是按钮</button>

????<!-- 2 2 对象语法的多个键值对 -->
????<button :class="{ active:isActive , xiong:true , kobe:false }" @click="btnC">我是按钮</button>

????<!-- 2 3 动态绑定class是可以和普通的class同时使用的 -->
????<button class="abc cba" :class="{ active:isActive , xiong:true , kobe:false }" @click="btnC">我是按钮</button>

????<!-- 2 4 ?-->
????<button class="abc cba" :class="getClasses()" @click="btnC">我是按钮</button>
</div>
<script src="../lib/vue.js"></script>
<script>
????// 创建app
????const app = Vue.createApp({
????????data: function () {
????????????return {
????????????????classes: "abc cba nba",
????????????????isActive: false
????????????}
????????},
????????methods: {
????????????btnC() {
????????????????this.isActive = !this.isActive
????????????},
????????????getClasses() {
????????????????return { active: this.isActive, xiong: true, kobe: false }
????????????}
????????}
????})
????// 挂载app
????app.mount('#app')

</script>

绑定class-数组语法

数组语法:可以把数组传给:class 以应用一个class列表

JavaScript
<tempale id="app">
????<!--1 直接传入一个数组-->
????<h2 :class="['abc','cba','nba']">Hello Array</h2>
????<!--2 数组中也可以使用三元运算符 或绑定变量-->
????<h2 :class="['abc',cba,isnba?'nba':'']">Hello Array</h2>
????<!--3 数组中也可以使用对象语法-->
????<h2 :class="['abc',cba,{'nba':isnba}]">Hello Array</h2>
</template>

绑定style属性介绍

我们可以利用v-bind:style来绑定一些CSS内联样式:

????????因为某些样式我们需要根据数据动态来决定

????????如某字段的颜色 大小等等

Css property名可以用 驼峰式或短横线分割(短横线分割要用引号括起来)来命名

绑定class有两种方式:

????????对象语法

????????数组语法

对象语法:

JavaScript
<h2 :style="{color:fontColor,'font-size':fontSize+'px'}">Hello World</h2>

数组语法:

style的数组语法可以将多个样式对象应用到同一个元素上

JavaScript
<h2 :style="[styleObj1,styleObj2]">Hello World</h2>

动态绑定属性

在某些情况下,我们 属性的名称?可能也不是固定的

????????前面我们无论绑定src href class style 属性名称都是固定的

????????如果 属性名称 不是固定的?我们可以使用 :[属性名]="值"的格式来定义

????????这种绑定的方式 我们称之为 动态绑定属性

绑定一个对象

如果我们希望将一个 对象的所有属性?绑定到元素上的所有属性 应该怎么做?

????????我们可以直接使用v-bind绑定一个对象;

HTML
<!-- v-bind绑定对象: 给组件传递参数-->
<!-- 简写 -->
<h2 :="props">Hello Bind</h2>
<h2 v-bind="props">Hello Bind</h2>

v-on绑定事件

在前端开发,我们需要经常和用户进行各种各样的交互

????????这个时候 我们就必须监听用户发生的事件 如 点击 拖拽 键盘事件等等

????????在Vue中如何监听时间呢? 使用v-on指令

v-on的用法

v-on的使用:

????????缩写:@

????????预期:Function|InIne Statement|Object

????????参数:event

????????修饰符:

????????.stop - 调用event-stopPropagation()

????????.prevent - 调用event-preventDefault()

????????.capture - 添加事件侦听器时 使用capture模式

????????.self - 只当事件是从侦听器绑定的元素本身触发时才触发回调

????????.{keyAlias} - 仅当事件从特定键触发时才触发回调

????????.once - 只触发一次回调

????????.left - 只当点击鼠标左键时触发

????????.right - 只当点击鼠标右键时触发

????????.middle - 只当点击鼠标中间时触发

????????.passive - {passive:true}模式添加侦听器

v-on的基本使用

我们可以使用v-on来监听一下点击事件:

JavaScript
?<!-- 1 基本的写法 -->
<div class="box" v-on:click="divClick"></div>

v-on:click可以写成@click 是它的语法糖写法:

JavaScript
<!-- 2 语法糖写法 (重点掌握)-->
<div class="box" @click="divClick"></div>

当然 我们也可以绑定 其他事件:

JavaScript
<!-- 4 绑定其他事件 (掌握)-->
<div class="box" @mousemove="divMouseMove"></div>

如果我们希望一个元素 绑定多个事件 这个时候可以传入一个对象:

JavaScript
<!-- 5 元素绑定多个事件 (掌握)-->
<div class="box" @mousemove="divMouseMove" @click="divClick"></div>
<!-- 下面这种写法 不太常见 了解就行 -->
<div class="box" @="{click:divClick,mousemove:divMouseMove}"></div>

v-on参数传递

当通过methods中定义方法,以供@click调用时 需要注意参数问题:

????????一:如果该方法不需要额外参数,那么方法后的()可以不添加

????????????????但是:如果方法本身没有一个参数 那么会默认将原生事件event参数传递进去

????????二:如果需要同时传入某个参数 同时需要event时 可以通过$event传入事件

JavaScript
<div id="app">
????????<!-- 1 默认传递 event对象 -->
????????<button @click="btnClick">按钮1</button>

????????<!-- 2 只有自己的参数 明确的参数-->
????????<button @click="btn2Click('xiong',age)">按钮2</button>

????????<!-- 3 自己的参数 和 event对象 -->
????????<!-- 在模版中 想要明确的获取event对象 ?固定语法:$event -->
????????<button @click="btn3Click('xiong',age,$event)">按钮3</button>

????????<h2>{{message}}</h2>
????</div>
????<script src="../lib/vue.js"></script>
????<script>
????????// 创建app
????????const app = Vue.createApp({
????????????data: function () {
????????????????return {
????????????????????message: "Hello Vue!",
????????????????????age: 18 ?// 如果没写这个不会报错 会直接undefined
????????????????}
????????????},
????????????methods: {
????????????????// 1 默认参数:event对象
????????????????// 总结 如果在绑定事件的时候 没有传递任何参数,
????????????????// 那么evnet对象会被默认传递进来
????????????????btnClick(event) {
????????????????????console.log('btnClick', event);
????????????????},
????????????????btn2Click(name, age) {
????????????????????console.log('btn2Click', name, age);
????????????????},
????????????????btn3Click(name, age, event) {
????????????????????console.log('btn3Click', name, age, event);
????????????????}
????????????}
????????})
????????// 挂载app
????????app.mount('#app')
????</script>

v-on的修饰符

v-on支持 修饰符,修饰符相当于对事件进行了一些特殊的处理:

????????.stop - 调用event-stopPropagation()

????????.prevent - 调用event-preventDefault()

????????.capture - 添加事件侦听器时 使用capture模式

????????.self - 只当事件是从侦听器绑定的元素本身触发时才触发回调

????????.{keyAlias} - 仅当事件从特定键触发时才触发回调

????????.once - 只触发一次回调

????????.left - 只当点击鼠标左键时触发

????????.right - 只当点击鼠标右键时触发

????????.middle - 只当点击鼠标中间时触发

????????.passive - {passive:true}模式添加侦听器

HTML
<div id="app">
????<div class="box" @click="divClick">
????????<button @click.stop="btnClick">按钮</button>
????????<!--阻止冒泡-->
????</div>
</div>

六、Vue的条件渲染

条件渲染

在某些情况下,我们需要根据当前的条件决定某些元素或组件是否需要渲染,这个时候我们就需要进行条件判断了

Vue提供了下面的指令来进行条件判断:

????????V-if

????????V-else

????????V-else-if

????????V-show

????????V-if ?v-else ?v-else-if

它们用于根据条件来渲染某一块内容

????????这些内容只有再条件为true时 才会被渲染出来 ?这三个指令与Js的条件语句if else else if类似

JavaScript
<div id="app">
????<h1 v-if="score > 90">优秀</h1>
????<h2 v-else-if="score > 80">良好</h2>
????<h3 v-else-if="score >= 60 ">及格</h3>
????<h4 v-else>不及格</h4>
</div>

v-if的渲染原理:

v-if是惰性的

条件为false时 判断的内容完全不会被渲染或者会被销毁掉

条件为true时 才会真正渲染条件块中的内容

template元素

因为v-if是一个指令 所以必须将其添加到一个元素上

????????如果我们希望切换的是多个元素呢?

????????此时我们渲染div但是我们并不希望 div这种元素被渲染

????????这个时候 我们可以选择使用template

template元素可以当做不可见的包裹元素,且在v-if上使用,但最终template不会被渲染出来

????????有点类似于小程序中的block

JavaScript
<div id="app">
????<!-- v-if="条件" 当条件成立执行什么-->
????<template v-if="Object.keys(info).length">
????????<h2>个人信息</h2>
????????<ul>
????????????<li>姓名{{info.name}}</li>
????????????<li>年龄{{info.age}}</li>
????????</ul>
????</template>
????<!-- v-else -->
????<template v-else>
????????<h2>没有输入个人信息</h2>
????????<p>请输入个人信息后 再进行展示</p>
????</template>
</div>

v-show

v-show和v-if的用法 看起来是一致的 也是根据一个条件决定是否显示元素或组件;

v-show和v-if的区别

用法上的区别:

v-show是不支持template

v-show不可以和v-else一起使用

其次 本质的区别:

v-show元素无论是否需要显示到浏览器上,它的DOM实际都是存在的,只是通过css的display属性来进行切换

v-if当条件为false时 其对应的元素压根不会被渲染到DOM中

开发中如何选择?

如果我们的元素需要显示和隐藏之间频繁切换 那么使用v-show

如果不会频繁的发生切换 那么使用v-if

  JavaScript知识库 最新文章
ES6的相关知识点
react 函数式组件 & react其他一些总结
Vue基础超详细
前端JS也可以连点成线(Vue中运用 AntVG6)
Vue事件处理的基本使用
Vue后台项目的记录 (一)
前后端分离vue跨域,devServer配置proxy代理
TypeScript
初识vuex
vue项目安装包指令收集
上一篇文章      下一篇文章      查看所有文章
加:2022-10-22 21:06:34  更:2022-10-22 21:10:47 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/17 18:27:54-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码