前面我们在标签身上用到了一个 v-on 的特殊属性来设置事件监听。实际上除了 v-on 以外,Vue 还提供了很多以 v- 开头的属性,我们把这些属性称为“指令”。

一、v-text 和 v-html

除了使用 {{}} 模板语法来实现数据渲染外,Vue 中还提供了 v-textv-html指令来渲染数据。
示例代码:

  1. <div id="app">
  2. <h1 v-text="msg"></h1>
  3. <h1 v-html="msg"></h1>
  4. </div>
  5. <script>
  6. const vm = new Vue({
  7. el: '#app',
  8. data() {
  9. return {
  10. msg: '<a href="#">Hello</a>',
  11. }
  12. }
  13. })
  14. </script>

其中,v-text 指令和 {{}} 模板语法一样,都是将数据当作普通文本字符串进行解析渲染。而v-html 则会解析数据中的 HTML 标签,并最终将其渲染成一个有效的 HTML 节点。
但是,v-textv-html 都有一个相同的缺点,就是在解析渲染数据时,会将标签中已有的数据覆盖掉。
实例代码:

  1. <div id="app">
  2. <h1 v-text="msg">world</h1>
  3. <h1 v-html="msg">world</h1>
  4. <h1>{{msg}} world</h1>
  5. </div>
  6. <script>
  7. const vm = new Vue({
  8. el: '#app',
  9. data() {
  10. return {
  11. msg: 'Hello',
  12. }
  13. }
  14. })
  15. </script>

数据渲染的三种方式及区别汇总

方法 是否解析 HTML 标签 是否覆盖标签内容
{{}}
v-text
v-html

二、v-show

Vue 中提供了 v-show 指令来控制元素的显示或隐藏,当属性值为 true 时,元素显示;属性值为 false 时,元素会自动添加 display: none 的内联样式实现隐藏。
说明:如果 v-show 的属性值不是布尔值,也会自动转换为布尔值后进行判断。
示例代码:

  1. <div id="app">
  2. <!-- 直接设置布尔值 -->
  3. <h1 v-show="false">看不见我看不见我...</h1>
  4. <!-- 设置非布尔值,但数字 0 会自动转换为 false -->
  5. <h1 v-show="0">看不见我看不见我...</h1>
  6. <!-- 设置 data 中的动态数据 -->
  7. <h2 v-show="isShow">也看不见我...</h2>
  8. </div>
  9. <script>
  10. const vm = new Vue({
  11. el: '#app',
  12. data() {
  13. return {
  14. isShow: false
  15. }
  16. }
  17. })
  18. </script>

三、v-bind

通常 HTML 标签身上的属性,值都是普通字符串。例如:

  1. <!-- href 属性 -->
  2. <a href="http://www.woniuxy.com">蜗牛学苑</a>
  3. <!-- class 属性 -->
  4. <div class="box"></div>
  5. <!-- src 属性 -->
  6. <img src="http://www.woniuxy.com/page/img/logo-500px.png"/>

但是,如果我们希望属性的值不是一个固定的字符串,而是一个可以动态变化的值。就需要用到 Vue 提供的 v-bind 指令,来实现属性的动态绑定。
示例代码:

  1. <div id="app">
  2. <a v-bind:href="link">蜗牛学苑</a>
  3. </div>
  4. <script>
  5. const vm = new Vue({
  6. el: '#app',
  7. data() {
  8. return {
  9. link: 'http://www.woniuxy.com'
  10. }
  11. }
  12. })
  13. </script>

通过 v-bind:属性名 设置的属性,都会变成动态属性,引号 "" 中的属性值不再是一个普通字符串,而是会被当作 JS 表达式进行解析。
例如上例中 href的属性值 link,就会被解析成 data 中的数据名。
同样的,我们还可以在动态属性的值中进行三目运算:

  1. <div id="app">
  2. <h1 v-bind:class="index == 1 ? 'active': ''">这是动态的class</h1>
  3. </div>
  4. <script>
  5. const vm = new Vue({
  6. el: '#app',
  7. data() {
  8. return {
  9. index: 1
  10. }
  11. }
  12. })
  13. </script>

上例表示,当 dataindex 的值为 1 时,就给 h1 设置一个 activeclass,否则就不设置 class
注意:当一个属性变成动态属性后,属性值自身的双引号 **""** 就只是一个格式,已经不具备字符串的功能。因此如果还需要设置字符串类型的属性值时,需要在双引号 **""** 中再添加单引号 **''**