四、vue基本指令(一)

1. v-text

更新元素的 textContent。如果要更新部分的 textContent ,需要使用 {{ Mustache }} 插值。

<span v-text="msg"></span>
<!-- 和下面的一样 -->
<span>{{msg}}</span>
2. v-once

通过使用 v-once 指令,你也能执行一次性地插值,当数据改变时,插值处的内容不会更新。但请留心这会影响到该节点上的其它数据绑定:

<span v-once>这个将不会改变: {{ msg }}</span>
3. v-html

双大括号会将数据解释为普通文本,而非 HTML 代码。为了输出真正的 HTML,你需要使用 v-html 指令:

<p>Using mustaches: {{ rawHtml }}</p>
<p>Using v-html directive: <span v-html="rawHtml"></span></p>

在这里插入图片描述
这个 span 的内容将会被替换成为属性值 rawHtml,直接作为 HTML——会忽略解析属性值中的数据绑定。注意,你不能使用 v-html 来复合局部模板,因为 Vue 不是基于字符串的模板引擎。反之,对于用户界面 (UI),组件更适合作为可重用和可组合的基本单位。

你的站点上动态渲染的任意 HTML 可能会非常危险,因为它很容易导致 XSS 攻击加粗样式。请只对可信内容使用 HTML
插值,绝不要对用户提供的内容使用插值。

在单文件组件里,scoped 的样式不会应用在 v-html 内部,因为那部分 HTML 没有被 Vue 的模板编译器处理。如果你希望针对
v-html 的内容设置带作用域的 CSS,你可以替换为 CSS Modules 或用一个额外的全局

4. v-show

根据表达式之真假值,切换元素的 display CSS 属性。当条件变化时该指令触发过渡效果。
带有 v-show 的元素始终会被渲染并保留在 DOM 中。v-show 只是简单地切换元素的 CSS 属性 display

注意,v-show 不支持 元素,也不支持 v-else。

5. v-if

根据表达式的值的真假条件渲染元素。在切换时元素及它的数据绑定 / 组件被销毁并重建。如果元素是 ,将提出它的内容作为条件块。
当条件变化时该指令触发过渡效果。
1) 多个元素上使用v-if
因为 v-if 是一个指令,所以必须将它添加到一个元素上。但是如果想切换多个元素呢?此时可以把一个 元素当做不可见的包裹元素,并在上面使用 v-if。最终的渲染结果将不包含 元素。

<template v-if="ok">
  <h1>Title</h1>
  <p>Paragraph 1</p>
  <p>Paragraph 2</p>
</template>

2)v-else
v-else 元素必须紧跟在带 v-if 或者 v-else-if 的元素的后面,否则它将不会被识别。

<div v-if="Math.random() > 0.5">
  Now you see me
</div>
<div v-else>
  Now you don't
</div>

3)v-else-if
类似于 v-else,v-else-if 也必须紧跟在带 v-if 或者 v-else-if 的元素之后。

<div v-if="type === 'A'">
  A
</div>
<div v-else-if="type === 'B'">
  B
</div>
<div v-else-if="type === 'C'">
  C
</div>
<div v-else>
  Not A/B/C
</div>

4)用 key 管理可复用的元素

	<!--模板-->
    <div id="key-example">
        <template v-if="loginType === 'username'">
          <label>Username</label>
          <input placeholder="Enter your username" key="username-input">
        </template>
        <template v-else>
          <label>Email</label>
          <input placeholder="Enter your email address" key="email-input">
        </template>
        <button @click="toggleLoginType">Toggle login type</button>
    </div>
    <script>
        new Vue({
          el: '#key-example',
          data: {
            loginType: 'username'
          },
          methods: {
            toggleLoginType: function () {
              return this.loginType = this.loginType === 'username' ? 'email' : 'username'
            }
          }
        })
    </script>
  1. v-if 与 v-show 对比

v-if 是“真正”的条件渲染,因为它会确保在切换过程中条件块内的事件监听器和子组件适当地被销毁和重建。

v-if 也是惰性的:如果在初始渲染时条件为假,则什么也不做——直到条件第一次变为真时,才会开始渲染条件块。

相比之下,v-show 就简单得多——不管初始条件是什么,元素总是会被渲染,并且只是简单地基于 CSS 进行切换。

一般来说,v-if 有更高的切换开销,而 v-show 有更高的初始渲染开销。因此,如果需要非常频繁地切换,则使用 v-show
较好;如果在运行时条件很少改变,则使用 v-if 较好。

6) v-if 和 v-for
不推荐同时使用 v-if 和 v-for。当 v-if 与 v-for 一起使用时,v-for 具有比 v-if 更高的优先级。

6. v-for

v-for 来遍历一个对象的属性。

<div id="demo">
        <ul>
            <li v-for="item in items">{{item.message}}</li>
            <li v-for="(item,index) in items" :key="index">{{index}}{{item.message}}</li>
            <li v-for="value in object">{{value}}</li>
            <li v-for="(value,key) in object" :key="key">{{key}}:{{value}}</li>
        </ul>
    </div>
    <script>

        //Vm实例
        var vm = new Vue({
            el:"#demo",  //挂载元素
            data:{
                items: [
                  { message: 'Foo' },
                  { message: 'Bar' }
                ],
                object: {
                  title: 'How to do lists in Vue',
                  author: 'Jane Doe',
                  publishedAt: '2016-04-10'
                }
            }
        });

    </script>

key 的特殊属性主要用在 Vue 的虚拟 DOM 算法,在新旧 nodes 对比时辨识 VNodes。如果不使用 key,Vue 会使用一种最大限度减少动态元素并且尽可能的尝试修复/再利用相同类型元素的算法。使用 key,它会基于 key 的变化重新排列元素顺序,并且会移除 key 不存在的元素。

有相同父元素的子元素必须有独特的 key。重复的 key 会造成渲染错误。
最常见的用例是结合 v-for:

<ul>
  <li v-for="item in items" :key="item.id">...</li>
</ul>

它也可以用于强制替换元素/组件而不是重复使用它。当你遇到如下场景时它可能会很有用:

完整地触发组件的生命周期钩子
触发过渡
例如:

<transition>
  <span :key="text">{{ text }}</span>
</transition>

当 text 发生改变时, 会随时被更新,因此会触发过渡。

发布了25 篇原创文章 · 获赞 2 · 访问量 3323

猜你喜欢

转载自blog.csdn.net/sinat_24918465/article/details/102517585