美文网首页
Vue核心知识-Vue的原生指令

Vue核心知识-Vue的原生指令

作者: 王童孟 | 来源:发表于2018-09-07 09:27 被阅读0次

    v-text

    标签中显示的内容。

    与双大括号写法类似,区别是没有双大括号灵活,如<div v-text="'Text:' + text"></div>,双大括号<div>Text: {{text}}</div>

    import Vue from 'vue'
    
    new Vue({
      el: '#root',
      template: `
        <div v-text="text"></div>
      `,
      data: {
        text: 1,
        active: false
      }
    })
    

    v-html

    把内容作为 HTML 插入标签中。

    new Vue({
      el: '#root',
      template: `
          <div v-html="html"></div>
      `,
      data: {
        html: '<span>this is html</span>'
      }
    })
    

    v-show

    是否显示节点。

    原理:在对应节点添加样式 display:none;

    new Vue({
      el: '#root',
      template: `
        <div>
          <div v-show="active">{{text}}</div>
        </div>
      `,
      data: {
        text: 1,
        active: false
      }
    })
    

    v-if

    是否把节点放在文档流中。

    new Vue({
      el: '#root',
      template: `
        <div>
          <div v-if="active">{{text}}</div>
        </div>
      `,
      data: {
        text: 1,
        active: false
      }
    })
    

    如果只是控制显示与隐藏,使用 v-show;如果使用 v-if,会动态增删节点,引起重绘和重排,影响性能。

    v-else

    v-if 配合并列使用。

    new Vue({
      el: '#root',
      template: `
        <div>
          <div v-if="active">{{text}}</div>
          <div v-else>else content</div>
        </div>
      `,
      data: {
        text: 1,
        active: false
      }
    })
    

    v-else-if

    v-if v-else 配合并列使用。

    new Vue({
      el: '#root',
      template: `
        <div>
          <div v-if="active">{{text}}</div>
          <div v-else-if="text === 1">else if content</div>
          <div v-else>else content</div>
        </div>
      `,
      data: {
        text: 1,
        active: false
      }
    })
    

    v-for

    遍历显示。

    new Vue({
      el: '#root',
      template: `
          <ul>
            <li v-for="item in arr">{{item}}</li>
          </ul>
      `,
      data: {
        arr: [1, 2, 3]
      }
    })
    

    index

    拿到 index

    new Vue({
      el: '#root',
      template: `
          <ul>
            <li v-for="(item, index) in arr">{{item}}:{{index}}</li>
          </ul>
      `,
      data: {
        arr: [1, 2, 3]
      }
    })
    

    遍历对象

    new Vue({
      el: '#root',
      template: `
          <ul>
            <li v-for="(val, key) in obj">{{val}}:{{key}}</li>
          </ul>
      `,
      data: {
        obj: {
          a: '123',
          b: '456',
          c: '789'
        }
      }
    })
    

    遍历对象时的 index

    和遍历数组一样,也是0,1,2...

    JS 的逻辑:通过 Object.keys() 得到对 key 值的数组,从而得到 index

    new Vue({
      el: '#root',
      template: `
          <ul>
            <li v-for="(val, key, index) in obj">{{val}}:{{key}}:{{index}}</li>
          </ul>
      `,
      data: {
        obj: {
          a: '123',
          b: '456',
          c: '789'
        }
      }
    })
    

    key

    使用 v-for 时,需要给每一项加 key值。

    一般情况下,我们 使用 v-for 做数据列表,这对应后台的数据,数据一般有自己的 id,把唯一的 id 作为 key 值。由于数据经常变动,vue 会重新渲染列表,并放入 DOM 中,性能开销比较大。如果指定 key,在下一次遍历中,vue 从缓存中拿到相同的 key,就会复用 key 所在的节点,不需要重新生成,从而节省性能开销

    推荐不要使用 index 作为 key,因为数组元素顺序的变化,和数组内容是没有关系的,可能导致错误的缓存

    // 这里把 item 作为 key,正常使用 id值
    new Vue({
      el: '#root',
      template: `
          <ul>
            <li v-for="(item, index) in arr" :key="item">{{item}}:{{index}}</li>
          </ul>
      `,
      data: {
        arr: [1, 2, 3]
      }
    })
    

    v-on

    事件监听

    简写,@

    v-on 其实是在 vue 对象实例上绑定事件,方便我们在 template 中使用,对应着vm.$on()的操作;可以理解成拿到 vue 组件对象后,通过 $on 绑定事件。如果是 div 节点,它并不是 vue 的实例,v-on 会进行判断,如果是 dom 节点,会使用 addEventListener 的方式添加事件,如果是 vue 组件,使用 $on添加事件

    new Vue({
      el: '#root',
      template: `
          <div @click="clickDiv">click this div</div>
      `,
      methods: {
        clickDiv () {
          console.log('clicked')
        }
      }
    })
    

    v-bind

    v-model

    默认用在 input 上。

    给自定义组件加上 v-model。

    给表单绑定数据。

    绑定 input

    new Vue({
      el: '#root',
      template: `
        <div>
          <div>{{text}}</div>
          <input type="text" v-model="text"/>
        </div>
      `,
      data: {
        text: 1,
      }
    })
    

    绑定 checkbox

    显示数组中的一列值,勾选 arr 中有,不勾选 arr 中没有。

    new Vue({
      el: '#root',
      template: `
          <div>
            <input type="checkbox" :value="1" v-model="arr"/>
            <input type="checkbox" :value="2" v-model="arr"/>
            <input type="checkbox" :value="3" v-model="arr"/>
          </div>
      `,
      data: {
        arr: [1, 2, 3]
    })
    

    绑定 radio

    new Vue({
      el: '#root',
      template: `
          <div>
            <input type="radio" value="one" v-model="picked"/>
            <input type="radio" value="two" v-model="picked"/>
          </div>
      `,
      data: {
        picked: ''
      }
    })
    

    修饰符

    .number

    把输入的数据转换成 number 类型。

    new Vue({
      el: '#root',
      template: `
          <input type="text" v-model.number="text"/>
      `,
      data: {
        text: 1
      }
    })
    

    .trim

    去除首尾空格。

    <input type="text" v-model.trim="text"/>
    

    .lazy

    监听方式不同,input 输入过程,并不会改变数据,点开一次性改变。

    <input type="text" v-model.lazy="text"/>
    

    v-pre

    使用 v-pre 后,div 中的内容都不会被解析,也就是原样显示。

    <div v-pre>{{text}}</div>
    

    v-cloak

    webpack开发的项目都用不到。

    使用唯一场景:直接在页面上,引入了 vue 的库代码,在页面上写 vue 的代码,模板是写在 body 的 html 中,浏览器原样显示,用户体验差,这时使用 v-cloak,在 vue 代码没有加载完成前,给 vue 代码加一个隐藏样式(display:none:),当 vue 代码加载完成后,vue 第一时间会把这个隐藏样式去掉。

    基本用不到。

    <div v-clock>{{text}}</div>
    

    v-once

    数据绑定的内容只执行一次。

    使用场景:对应节点内容都是静态内容,没有动态数据。

    作用:节省性能开销,vue 不会再次检测,不会进行虚拟 DOM 的对比。

    new Vue({
      el: '#root',
      template: `
        <div>
          <div v-once>{{text}}</div>
          <input type="text" v-model="text"/>
        </div>
      `,
      data: {
        text: 1,
      }
    })
    

    相关文章

      网友评论

          本文标题:Vue核心知识-Vue的原生指令

          本文链接:https://www.haomeiwen.com/subject/dxmqgftx.html