Hello,我是渔戈!今天我们来学习一下关于 Vue3 的基本指令.
1.Mustache 双大括号语法(插值表达式)
说明:双大括号标签会被替换为相应组件实例中 msg
属性的值。同时每次 msg
属性更改时它也会同步更新。
如果我们希望把数据显示到模板(template)中,使用最多的语法是 “Mustache”语法 (双大括号) 的文本插值.
<!-- 1.mustache的基本使用 -->
<template id="my-app">
<h2>{{message}} - {{message}}</h2>
<!-- 2.是一个表达式 -->
<h2>{{counter*10}}</h2>
<h2>{{message.split(" ").reverse().join(" ")}}</h2>
<!-- 3.也可以调用函数 -->
<!-- 可以使用computed(计算属性) -->
<h2>{{getReverseMessage()}}</h2>
<!-- 4.三元运算符 -->
<h2>{{isShow?"哈哈哈":""}}</h2>
<button @click="toggle">切换</button>
<!-- 错误用法 -->
<!-- var name ="abc"-> 赋值语句 -->
<!-- <h2>{{var name ="abc"}}</h2>
<h2>{{if(isShow) {return "hhh"}}}</h2> -->
</template>
复制代码
<script>
const App = {
template: "#my-app",
data() {
return {
message: "hello world!",
counter: 100,
isShow: true
}
},
methods: {
getReverseMessage() {
return this.message.split(" ").reverse().join(" ");
},
toggle() {
this.isShow = !this.isShow
}
}
}
Vue.createApp(App).mount("#app");
</script>
复制代码
2.v-once 指令
说明:v-once 用于指定元素或者组件只渲染一次;当数据发生变化时,元素或者组件以及其所有的子元素将视为静态内容并且跳过;该指令可以用于性能优化;
<template id="my-app">
<h2 v-once>{{counter}}</h2>
<!--
v-once用于指定元素或组件只渲染一次:
当数据发生变化时,元素或者组件以及其所有的子元素都将视为静态内容并且跳过;
该指令可以用于性能优化;
-->
<div v-once>
<h2>{{counter}}</h2>
<h2>{{message}}</h2>
</div>
<button @click="increment">+1</button>
</template>
复制代码
<script>
const App = {
template: "#my-app",
data() {
return {
counter: 100,
message: "abc"
}
},
methods: {
increment() {
this.counter++
}
}
}
Vue.createApp(App).mount("#app");
</script>
复制代码
3.v-text 指令
说明:用于更新元素的文本内容。
<span v-text="msg"></span>
<!-- 等同于 -->
<span>{{msg}}</span>
复制代码
4.v-html 指令
说明:更新元素的 innerHTML.
默认情况下,如果我们展示的内容本身是 html 的,那么 vue 并不会对其进行特殊的解析。
如果我们希望这个内容被 Vue 可以解析出来,那么可以使用 v-html 来展示;
<template id="my-app">
<h2>{{message}}</h2>
<!--
v-text指令:用于更新元素的textContent:
-->
<h2 v-text="message"></h2>
</template>
<script src="../js/vue.js"></script>
<script>
const App = {
template: "#my-app",
data() {
return {
message: "hello world!"
}
}
}
Vue.createApp(App).mount("#app");
</script>
复制代码
5.v-pre 指令
说明:v-pre 用于跳过元素和它的子元素的编译过程,显示原始的 Mustache 标签:
<template id="my-app">
<!--
v-pre:用于跳过元素和它的子元素的编译过程,显示原始的Mustache标签:
跳过不需要编译的节点,加快编译的速度;
-->
<h2 v-pre>{{message}}</h2>
</template>
<script src="../js/vue.js"></script>
<script>
const App = {
template: "#my-app",
data() {
return {
message: "hello world!"
}
}
}
Vue.createApp(App).mount("#app");
</script>
复制代码
6.v-cloak
说明:用于隐藏尚未完成编译的 DOM 模板。
该指令只在没有构建步骤的环境下需要使用。
<template id="my-app">
<!--
v-pre:用于跳过元素和它的子元素的编译过程,显示原始的Mustache标签:
跳过不需要编译的节点,加快编译的速度;
-->
<h2 v-pre>{{message}}</h2>
</template>
<script src="../js/vue.js"></script>
<script>
const App = {
template: "#my-app",
data() {
return {
message: "hello world!"
}
}
}
Vue.createApp(App).mount("#app");
</script>
复制代码
7.v-bind 指令
动态的绑定一个或多个 attribute,也可以是组件的 prop。
缩写: :
或者 .
(当使用 .prop
修饰符)
期望: any (带参数) | Object (不带参数)
参数: attrOrProp (可选的)
修饰符:
.camel
——将短横线命名的 attribute 转变为驼峰式命名。
.prop
——强制绑定为 DOM property。3.2+
.attr
——强制绑定为 DOM attribute。3.2+
用途:
当用于绑定 class
或 style
attribute,v-bind
支持额外的值类型如数组或对象。详见下方的指南链接。
在处理绑定时,Vue 默认会利用 in
操作符来检查该元素上是否定义了和绑定的 key 同名的 DOM property。如果存在同名的 property,则 Vue 会把作为 DOM property 赋值,而不是作为 attribute 设置。这个行为在大多数情况都符合期望的绑定值类型,但是你也可以显式用 .prop
和 .attr
修饰符来强制绑定方式。有时这是必要的,特别是在和自定义元素打交道时。
当用于组件 props 绑定时,所绑定的 props 必须在子组件中已被正确声明。
当不带参数使用时,可以用于绑定一个包含了多个 attribute 名称-绑定值对的对象。
<!-- 绑定 attribute -->
<img v-bind:src="imageSrc" />
<!-- 动态 attribute 名 -->
<button v-bind:[key]="value"></button>
<!-- 缩写 -->
<img :src="imageSrc" />
<!-- 缩写形式的动态 attribute 名 -->
<button :[key]="value"></button>
<!-- 内联字符串拼接 -->
<img :src="'/path/to/images/' + fileName" />
<!-- class 绑定 -->
<div :class="{ red: isRed }"></div>
<div :class="[classA, classB]"></div>
<div :class="[classA, { classB: isB, classC: isC }]"></div>
<!-- style 绑定 -->
<div :style="{ fontSize: size + 'px' }"></div>
<div :style="[styleObjectA, styleObjectB]"></div>
<!-- 绑定对象形式的 attribute -->
<div v-bind="{ id: someProp, 'other-attr': otherProp }"></div>
<!-- prop 绑定。“prop” 必须在子组件中已声明。 -->
<MyComponent :prop="someThing" />
<!-- 传递子父组件共有的 prop -->
<MyComponent v-bind="$props" />
<!-- XLink -->
<svg><a :xlink:special="foo"></a></svg>
复制代码
8.v-on 指令
说明:给元素绑定事件监听器。
缩写: @
期望的绑定值类型: Function | Inline Statement | Object (不带参数)
参数: event
(使用对象语法则为可选项)
修饰符:
.stop
——调用 event.stopPropagation()
。
.prevent
——调用 event.preventDefault()
。
.capture
——在捕获模式添加事件监听器。
.self
——只有事件从元素本身发出才触发处理函数。
.{keyAlias}
——只在某些按键下触发处理函数。
.once
——最多触发一次处理函数。
.left
——只在鼠标左键事件触发处理函数。
.right
——只在鼠标右键事件触发处理函数。
.middle
——只在鼠标中键事件触发处理函数。
.passive
——通过 { passive: true }
附加一个 DOM 事件。
详细信息
事件类型由参数来指定。表达式可以是一个方法名,一个内联声明,如果有修饰符则可省略。
当用于普通元素,只监听原生 DOM 事件。当用于自定义元素组件,则监听子组件触发的自定义事件。
当监听原生 DOM 事件时,方法接收原生事件作为唯一参数。如果使用内联声明,声明可以访问一个特殊的 $event
变量:v-on:click="handle('ok', $event)"
。
v-on
还支持绑定不带参数的事件/监听器对的对象。请注意,当使用对象语法时,不支持任何修饰符。
<!-- 方法处理函数 -->
<button v-on:click="doThis"></button>
<!-- 动态事件 -->
<button v-on:[event]="doThis"></button>
<!-- 内联声明 -->
<button v-on:click="doThat('hello', $event)"></button>
<!-- 缩写 -->
<button @click="doThis"></button>
<!-- 使用缩写的动态事件 -->
<button @[event]="doThis"></button>
<!-- 停止传播 -->
<button @click.stop="doThis"></button>
<!-- 阻止默认事件 -->
<button @click.prevent="doThis"></button>
<!-- 不带表达式地阻止默认事件 -->
<form @submit.prevent></form>
<!-- 链式调用修饰符 -->
<button @click.stop.prevent="doThis"></button>
<!-- 按键用于 keyAlias 修饰符-->
<input @keyup.enter="onEnter" />
<!-- 点击事件将最多触发一次 -->
<button v-on:click.once="doThis"></button>
<!-- 对象语法 -->
<button v-on="{ mousedown: doThis, mouseup: doThat }"></button>
复制代码
9.v-if、v-else、v-else-if 指令
<template id="my-app">
<input type="text" v-model="score">
<h2 v-if="score > 90">优秀</h2>
<h2 v-else-if="score > 80">良好</h2>
<h2 v-else-if="score > 60">普通</h2>
<h2 v-else>不及格</h2>
</template>
<script src="../js/vue.js"></script>
<script>
const App = {
template: '#my-app',
data() {
return {
score: 95
}
}
}
Vue.createApp(App).mount('#app');
</script>
复制代码
v-if 的渲染原理:
template 元素因为 v-if 是一个指令,所以必须将其添加到一个元素上:
但是如果我们希望切换的是多个元素呢?
此时我们渲染 div,但是我们并不希望 div 这种元素被渲染;
这个时候,我们可以选择使用 template;
template 元素可以当做不可见的包裹元素,并且在 v-if 上使用,但是最终 template 不会被渲染出来:
<template id="my-app">
<template v-if="isShowHa">
<h2>哈哈哈哈</h2>
<h2>哈哈哈哈</h2>
<h2>哈哈哈哈</h2>
</template>
<template v-else>
<h2>呵呵呵呵</h2>
<h2>呵呵呵呵</h2>
<h2>呵呵呵呵</h2>
</template>
</template>
复制代码
10.v-show 指令
说明:基于表达式值的真假性,来改变元素的可见性。
v-show 和 v-if 的用法看起来是一致的,也是根据一个条件决定是否显示元素或者组件:
<template id="my-app">
<h2 v-show="isShow">哈哈哈哈</h2>
</template>
<script src="../js/vue.js"></script>
<script>
const App = {
template: '#my-app',
data() {
return {
isShow: true
}
}
}
Vue.createApp(App).mount('#app');
</script>
复制代码
11.v-show 和 v-if 的区别
首先,在用法上的区别:
v-show 是不支持 template;
v-show 不可以和 v-else 一起使用;
其次,本质的区别:
v-show 元素无论是否需要显示到浏览器上,它的 DOM 实际都是有渲染的,只是通过 CSS 的 display 属性来进行切换;
v-if 当条件为 false 时,其对应的原生压根不会被渲染到 DOM 中;
开发中如何进行选择呢?
如果我们的原生需要在显示和隐藏之间频繁的切换,那么使用 v-show;
如果不会频繁的发生切换,那么使用 v-if;
<template id="my-app">
<h2 v-if="isShow">哈哈哈哈</h2>
<h2 v-show="isShow">呵呵呵呵</h2>
</template>
<script src="../js/vue.js"></script>
<script>
const App = {
template: '#my-app',
data() {
return {
isShow: true
}
}
}
Vue.createApp(App).mount('#app');
</script>
复制代码
评论