写点什么

Vue3 的基本指令

作者:渔戈
  • 2022-10-19
    广东
  • 本文字数:5532 字

    阅读完需:约 1 分钟

Vue3的基本指令

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 指令

说明:用于更新元素的文本内容。

  • 期望的绑定值类型: string

  • v-text 通过设置元素的 textContent 属性来工作,因此它将覆盖元素中所有现有的内容。如果你需要更新 textContent 的部分,应该使用 mustache interpolations 代替。

<span v-text="msg"></span><!-- 等同于 --><span>{{msg}}</span>
复制代码

4.v-html 指令

说明:更新元素的 innerHTML.

  • 期望的绑定值类型: string

默认情况下,如果我们展示的内容本身是 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 模板。

该指令只在没有构建步骤的环境下需要使用。

  • 当使用直接在 DOM 中书写的模板时,可能会出现一种叫做“未编译模板闪现”的情况:用户可能先看到的是还没编译完成的双大括号标签,直到挂载的组件将它们替换为实际渲染的内容。

  • v-cloak 会保留在所绑定的元素上,直到相关组件实例被挂载后才移除。配合像 [v-cloak] { display: none } 这样的 CSS 规则,它可以在组件编译完毕前隐藏原始模板

    <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 指令

  • 这些内容只有在条件为 true 时,才会被渲染出来;

  • 这三个指令与 JavaScript 的条件语句 if、else、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 的渲染原理:

  • v-if 是惰性的;

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

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

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 指令

说明:基于表达式值的真假性,来改变元素的可见性。

  • 期望的绑定值类型: any

  • 详细信息

    v-show 通过设置内联样式的 display CSS 属性来工作,当元素可见时将使用初始 display 值。当条件改变时,也会触发过渡效果。

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>
复制代码


发布于: 刚刚阅读数: 3
用户头像

渔戈

关注

还未添加个人签名 2022-10-14 加入

还未添加个人简介

评论

发布
暂无评论
Vue3的基本指令_前端_渔戈_InfoQ写作社区