请你一口气说完所有的 V-前缀 的指令 !

25 阅读2分钟

一、数据绑定类

1. v-text

  • 作用:绑定文本内容(等价于 {{ }},但不会解析 HTML)。

<div id="app">
  <div v-text="message"></div>
</div>

<script src="https://unpkg.com/vue@3/dist/vue.global.prod.js"></script>
<script>
  const app = Vue.createApp({
    data() {
      return {
        message: 'Hello Vue!'
      }
    }
  });
  app.mount('#app');
</script>

2. v-html

  • 作用:绑定并解析 HTML 内容(注意 XSS 风险)。

<div id="app">
  <div v-html="htmlContent"></div>
</div>

<script src="https://unpkg.com/vue@3/dist/vue.global.prod.js"></script>
<script>
  const app = Vue.createApp({
    data() {
      return {
        htmlContent: '<h1 style="color:red">这是红色标题</h1>'
      }
    }
  });
  app.mount('#app');
</script>

3. v-bind(简写 :

  • 作用:绑定一个或多个属性。

<div id="app">
  <img v-bind:src="imgUrl" :alt="imgAlt">
  <a :href="link">点击访问</a>
</div>

<script src="https://unpkg.com/vue@3/dist/vue.global.prod.js"></script>
<script>
  const app = Vue.createApp({
    data() {
      return {
        imgUrl: 'https://picsum.photos/200',
        imgAlt: '示例图片',
        link: 'https://vuejs.org'
      }
    }
  });
  app.mount('#app');
</script>

4. v-model

  • 作用:双向绑定表单元素的值。

<div id="app">
  <input v-model="username" placeholder="请输入用户名">
  <p>你输入的是:{{ username }}</p>
</div>

<script src="https://unpkg.com/vue@3/dist/vue.global.prod.js"></script>
<script>
  const app = Vue.createApp({
    data() {
      return {
        username: ''
      }
    }
  });
  app.mount('#app');
</script>

二、事件处理类

5. v-on(简写 @

  • 作用:绑定事件监听器。

<div id="app">
  <button v-on:click="count++">点击增加</button>
  <button @click="reset">重置</button>
  <p>计数:{{ count }}</p>
</div>

<script src="https://unpkg.com/vue@3/dist/vue.global.prod.js"></script>
<script>
  const app = Vue.createApp({
    data() {
      return {
        count: 0
      }
    },
    methods: {
      reset() {
        this.count = 0;
      }
    }
  });
  app.mount('#app');
</script>

6. v-once

  • 作用:只渲染一次,数据变化后不再更新。

<div id="app">
  <div v-once>{{ message }}</div>
  <button @click="message = '更新后的内容'">修改</button>
</div>

<script src="https://unpkg.com/vue@3/dist/vue.global.prod.js"></script>
<script>
  const app = Vue.createApp({
    data() {
      return {
        message: '初始内容'
      }
    }
  });
  app.mount('#app');
</script>

三、条件渲染类

7. v-if

  • 作用:条件渲染,不满足条件时元素会被销毁。

<div id="app">
  <div v-if="show">显示内容</div>
  <button @click="show = !show">切换</button>
</div>

<script src="https://unpkg.com/vue@3/dist/vue.global.prod.js"></script>
<script>
  const app = Vue.createApp({
    data() {
      return {
        show: true
      }
    }
  });
  app.mount('#app');
</script>

8. v-else

  • 作用:与 v-if 配合使用。
<div id="app">
  <div v-if="isLogin">欢迎回来!</div>
  <div v-else>请先登录</div>
</div>

<script src="https://unpkg.com/vue@3/dist/vue.global.prod.js"></script>
<script>
  const app = Vue.createApp({
    data() {
      return {
        isLogin: false
      }
    }
  });
  app.mount('#app');
</script>

9. v-else-if

  • 作用:多条件判断。

<div id="app">
  <div v-if="score >= 90">优秀</div>
  <div v-else-if="score >= 60">及格</div>
  <div v-else>不及格</div>
</div>

<script src="https://unpkg.com/vue@3/dist/vue.global.prod.js"></script>
<script>
  const app = Vue.createApp({
    data() {
      return {
        score: 75
      }
    }
  });
  app.mount('#app');
</script>

10. v-show

  • 作用:条件显示(通过 display: none 控制,元素始终存在)。

<div id="app">
  <div v-show="visible">我是可见的</div>
  <button @click="visible = !visible">切换</button>
</div>

<script src="https://unpkg.com/vue@3/dist/vue.global.prod.js"></script>
<script>
  const app = Vue.createApp({
    data() {
      return {
        visible: true
      }
    }
  });
  app.mount('#app');
</script>

四、列表渲染类

11. v-for

  • 作用:循环渲染列表(必须配合 key)。

<div id="app">
  <ul>
    <li v-for="item in list" :key="item.id">{{ item.name }}</li>
  </ul>
</div>

<script src="https://unpkg.com/vue@3/dist/vue.global.prod.js"></script>
<script>
  const app = Vue.createApp({
    data() {
      return {
        list: [
          { id: 1, name: '苹果' },
          { id: 2, name: '香蕉' },
          { id: 3, name: '橘子' }
        ]
      }
    }
  });
  app.mount('#app');
</script>

五、其他常用指令

12. v-pre

  • 作用:跳过编译,原样显示标签内容。

<div id="app">
  <div v-pre>{{ message }}</div>
</div>

<script src="https://unpkg.com/vue@3/dist/vue.global.prod.js"></script>
<script>
  const app = Vue.createApp({
    data() {
      return {
        message: 'Hello Vue!'
      }
    }
  });
  app.mount('#app');
</script>

13. v-cloak

  • 作用:防止插值闪烁(配合 CSS)。

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

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

<script src="https://unpkg.com/vue@3/dist/vue.global.prod.js"></script>
<script>
  const app = Vue.createApp({
    data() {
      return {
        message: '加载完成'
      }
    }
  });
  app.mount('#app');
</script>

14. v-slot(简写 #

  • 作用:定义插槽。

<div id="app">
  <my-component>
    <template v-slot:header>
      <h1>头部内容</h1>
    </template>
    <template #default>
      <p>默认内容</p>
    </template>
  </my-component>
</div>

<script src="https://unpkg.com/vue@3/dist/vue.global.prod.js"></script>
<script>
  const app = Vue.createApp({});
  app.component('my-component', {
    template: `
      <div>
        <slot name="header"></slot>
        <slot></slot>
      </div>
    `
  });
  app.mount('#app');
</script>

六、Vue 3 新增指令

15. v-memo

  • 作用:缓存模板片段,仅在依赖变化时重新渲染。

<div id="app">
  <div v-memo="[valueA, valueB]">
    {{ valueA }} + {{ valueB }} = {{ valueA + valueB }}
  </div>
</div>

<script src="https://unpkg.com/vue@3/dist/vue.global.prod.js"></script>
<script>
  const app = Vue.createApp({
    data() {
      return {
        valueA: 1,
        valueB: 2
      }
    }
  });
  app.mount('#app');
</script>

16. v-is

  • 作用:动态绑定组件(解决 DOM 解析限制)。

<div id="app">
  <component v-is="currentComponent"></component>
</div>

<script src="https://unpkg.com/vue@3/dist/vue.global.prod.js"></script>
<script>
  const app = Vue.createApp({
    data() {
      return {
        currentComponent: 'component-a'
      }
    },
    components: {
      'component-a': { template: '<div>组件A</div>' },
      'component-b': { template: '<div>组件B</div>' }
    }
  });
  app.mount('#app');
</script>