part4 - 模块1 - 02 - Vue基础指令

262 阅读4分钟

笔记来源:拉勾教育 - 大前端就业集训营

文章内容:学习过程中的笔记、感悟、和经验

Vue基础指令

Vue指令

指令本质上来说就是Html自定义属性

Vue指令就是以v-开头的自定义属性

内容处理指令

v-once

使元素内部差值表达式之生效一次,不随着数据的变化而变化

<body>
  <div id="app">
    <!-- 对比v-once区别 -->
    <p>我会随数据变化而变化,数据:{{one}}</p>
    <p v-once>我不会随数据变化而变化,因为我设置了v-once,数据:{{one}}</p>
  </div>
  <script>
    const vm = new Vue({
      el: '#app',
      data: {
        // 后期我们在控制台修改one数值发现只有第一个p变化了,第二个p不会变化
        one: '1'
      },
      methods: {}
    })
  </script>
</body>

v-text

将元素内容整体替换为纯文本数据,这里的值可以是vue数据也可以是固定数据,但是一般情况下都会使用vue数据

<body>
  <div id="app">
    <!-- 对比v-text,第二个p因为设置了v-text所以内部文本被替换掉 -->
    <p>如果你看见我说明没被替换</p>
    <p v-text="content">如果你看见我说明没被替换</p>
  </div>
  <script>
    const vm = new Vue({
      el: '#app',
      data: {
        content: '内容文本'
      },
      methods: {}
    })
  </script>
</body>

注意:v-text只能设置文本内容,内部无法书写html标签,就算书写也会被转换为文本内容

v-html

元素内容整体被替换为Html文本

<body>
  <div id="app">
    <!-- 对比v-text和v-html -->
    <!-- v-text无法添加html解构 -->
    <p v-text="content"></p>
    <!-- v-html可以将标签结构生成html解构,打开调试工具可以发现这个p元素里面还嵌套了一层p -->
    <p v-html="content"></p>
  </div>
  <script>
    const vm = new Vue({
      el: '#app',
      data: {
        content: '<p>内容文本<p>'
      },
      methods: {}
    })
  </script>
</body>

属性绑定

v-bind - 绑定指令

用于绑定Html属性

<body>
  <div id="app">
    <!-- 把元素的title属性绑定content数据 -->
    <p v-bind:title="content">我设置了v-bind,打开也米娜看一下p的属性吧</p>
    <!-- 使用v-bind简写 -->
    <p :title="content">我设置了v-bind,打开也米娜看一下p的属性吧</p>

    <!-- v-bind内部可以使用表达式 -->
    <p :class="'num' + 1 + 2 + 3">v-bind内部使用表达式</p>
    <p :class="one + tow">v-bind内部使用表达式,表达式使用数据</p>
  </div>
  <script>
    const vm = new Vue({
      el: '#app',
      data: {
        content: 'title属性',
        one: '1',
        tow: 2
      },
      methods: {}
    })
  </script>
</body>

注意:v-bind:属性名可以简写为:属性名

同时绑定多个数据

<body>
  <div id="app">
    <!-- 同时绑定多个数据 -->
    <p v-bind="bind">使用v-bind同时绑定多个属性</p>
  </div>
  <script>
    const vm = new Vue({
      el: '#app',
      data: {
        // 创建一个多个属性的v-bind数据
        bind: {
          id: 'one',
          class: "tow",
          // 因为js不能识别-,所以使用引号包裹起来
          'data-title': '这是data-title'
        }
      },
      methods: {}
    })
  </script>
</body>

v-bind绑定class

通过v-bind绑定的class可以和普通方式书写的class共存

<body>
  <div id="app">
    <!-- 可以同时存在普通class和绑定v-bind绑定class -->
    <p class="one" :class="cls">我会有两个类名,一个是one,另一个是动态的</p>
  </div>
  <script>
    const vm = new Vue({
      el: '#app',
      data: {
        cls: 'tow'
      },
      methods: {}
    })
  </script>
</body>

注意事项

  • 绑定class不可以在:class内部只能绑定一个数据,如果想同时绑定多个class,可以把多个class同时写在一个数据内(以空格隔开)
  • :class内部可以写三元表达式用于判断条件

class绑定的特殊处理方式

class绑定支持数组和对象方式绑定

<body>
  <div id="app">
    <!-- 使用对象方式绑定类名,内部为 类名:布尔值 ,布尔值可以绑定data数据,根据数据更改类名是否生效-->
    <p :class="{ x: true, y: isY, z: isZ, 'data-a': true,}">以对象方式绑定类名</p>
    <!-- 使用数组方式绑定类名,效果和上面一样,注意静态类名要使用冒号包裹('data-a'和‘x’),否则就会在data中寻找,动态类名直接写名字即可(classB) -->
    <p :class="['x', {y: isY}, {z: isZ}, 'data-a', classB]">以数组方式绑定类名</p>
  </div>
  <script>
    const vm = new Vue({
      el: '#app',
      data: {
        isY: true,
        isZ: false,
        classB: 'b'
      },
      methods: {}
    })
  </script>
</body>

v-bind绑定style

使用v-bind绑定的style可以和行内style共存

<body>
  <div id="app">
    <!-- 绑定style属性 -->
    <p :style="style" style="width: 100px;">绑定style属性</p>

    <!-- 同时绑定多个数据,我们可以设置一个公共样式提取出来,使用数组绑定style -->
    <p :style="[baseStyle, style1]">绑定公共样式和style1</p>
    <p :style="[baseStyle, style2]">绑定公共样式和style2</p>
  </div>
  <script>
    const vm = new Vue({
      el: '#app',
      data: {
        style: {
          width: '200px',
          height: '200px',
          backgroundColor: '#ccc'
        },
        // 设置公共样式
        baseStyle: {
          width: '100px',
          height: '100px'
        },
        // 设置独立样式
        style1: {
          'background-color': 'red'
        },
        style2: {
          'background-color': 'blue'
        }
      },
      methods: {}
    })
  </script>
</body>

注意事项

  • 如果发生设置形同属性,:style会覆盖style属性
  • 单属性例如background-color可以采用引号包裹或者驼峰命名方式书写

渲染指令

v-for - 结构创建

用于遍历数据从而渲染结构,常用数组和对象都可以遍历

<body>
  <div id="app">
    <!-- 使用v-for -->
    <ul>
      <!-- 遍历one数组,使用差值表达式把item设置为li内容 -->
      <!-- (item, index) => (值,索引值) -->
      <li v-for="(item, index) in one">{{item}},索引为{{index}}</li>
    </ul>
    <ul>
      <!-- 遍历tow对象,使用差值表达式把item设置为li内容 -->
      <!-- (item, key, index) => (值,属性名, 索引值) -->
      <li v-for="(item, key, index) in tow">{{item}},属性名为{{key}}索引为{{index}}</li>
    </ul>
    <ul>
      <!-- 如果我们只是想创建多个元素而不使用data,直接写数值即可,内部也可以使用索引值 -->
      <li v-for="item in 5">{{item}}</li>
    </ul>
  </div>
  <script>
    const vm = new Vue({
      el: '#app',
      data: {
        // 创建对象和数组
        one: [1, 2, 3, 4, 5],
        tow: {
          name: 'cwn',
          age: 19,
          sex: 1
        }
      }
    })
  </script>
</body>

v-for指令进阶

  • 使用v-for,应该是种制定唯一的key属性,可以提高渲染性能并避免问题

    <body>
      <div id="app">
        <ul>
          <!-- 给v-for添加key属性提高渲染效率,并且可以避免很多问题,key属性用于给当前元素添加唯一的标示 -->
          <li v-for="item in list" :key="item.id">{{item.value}}</li>
        </ul>
      </div>
      <script>
        const vm = new Vue({
          el: '#app',
          data: {
            // 在创建v-for数据的时候,建议添加一个id属性
            list: [{
                id: 1,
                value: 2
              },
              {
                id: 2,
                value: 3
              },
              {
                id: 3,
                value: 4
              },
              {
                id: 4,
                value: 2
              },
            ]
          }
        })
      </script>
    </body>
    
  • 通过<template>标签设置模版占位符,可以将部分元素和内容作为整体操作

    <body>
      <div id="app">
        <!-- template是一个模版占位符号,并不是真实的元素,并且不会渲染,所以不需要设置:key -->
        <template v-for="item in list">
          <!-- 我们可以在占位符内部书写大段结构与,系统会把这一段结构当做一个整体带入v-for中 -->
          <span>{{item}}</span><br>
        </template>
      </div>
      <script>
        const vm = new Vue({
          el: '#app',
          data: {
            list: [1, 2, 3]
          }
        })
      </script>
    </body>
    

v-show - 控制现实和隐藏

用于控制元素的显示和隐藏,适用于现实和隐藏的元素频换切换时使用

v-show接受布尔值(表达式也要返回布尔值),true表示显示,flase表示隐藏,布尔值可以通过data获取

<body>
  <div id="app">
    <!-- 使用v-show -->

    <!-- 直接给值 -->
    <p v-show="true">文本内容1</p>
    <p v-show="false">文本内容2</p>

    <!-- 使用表达式 -->
    <p v-show="11 > 12">文本内容1</p>
    <p v-show="11 < 12">文本内容2</p>

    <!-- 使用数据 -->
    <p v-show="a">文本内容1</p>
    <p v-show="b">文本内容2</p>
  </div>
  <script>
    const vm = new Vue({
      el: '#app',
      data: {
        a: true,
        b: false
      }
    })
  </script>
</body>

注意事项

  • template模版无法使用v-show指令,因为v-show原理是切换display属性设置显示隐藏,而template不是一个真实存在的元素

v-if - 条件判断

用于根据条件添加或者移除元素结构

  • 语法形式和if条件分支语句很类似,原理基本相同,也可以使用else-if和else分支
  • 和v-show一样也可以使用data中的数据和表达式

注意事项

  • v-show是控制显示和隐藏,元素一直都存在,v-if是控制元素的添加和移除,如果为flase则元素就不会存在,所以两者原理完全不一样

  • 给使用的v-if同类型元素绑定不同的key,可以避免因为vue的逻辑产生的问题

    <body>
      <div id="app">
        <!-- 使用v-if的时候添加:key可以避免很多问题 -->
        <div v-if="type === 'username'" :key="'username'">
          请输入用户名<input type="text">
        </div>
        <div v-else :key="'email'">
          请输入邮箱<input type="text">
        </div>
      </div>
      <script>
        const vm = new Vue({
          el: '#app',
          data: {
            type: 'username'
          }
        })
      </script>
    </body>
    
  • 出于性能考虑,应避免v-if和v-for应用于同一个标签,在vue中v-for的优先级会更高,会执行完v-for才会执行v-if,这样会浪费资源

    • 可以将v-if放在v-for父元素上,这样只要v-if判断为flase,就不会再执行v-for了