vue总结

vue.js 顾兴福
文章标签: vue

1.v-cloak指令

<style type="text/css">
      [v-cloak] {
          display: none;
      }
</style>

<p v-cloak>{{age}}</p>

这个指令是用来提高用户体验的,因为有一次我无意间疯狂刷新发现Mustache 能显示出来的。

然后就去查了一下关于这个的问题,vue的作者是有考虑到这一点的。提供了v-cloak这个指令配合display:none;就可以完美解决这个问题

2.Vue.nextTick(),vm.$nextTick()

官方文档的解释是:在下次 DOM 更新循环结束之后执行延迟回调。在修改数据之后立即使用这个方法,获取更新后的 DOM。

后半句很重要,我有一次在vue里面使用jQuery操作DOM的时候。发现居然没作用,原因就是jQuery获取的DOM是数据更新之前的DOM,数据更新后DOM也重新更新了。所以就没有效果出来。

来看个示例

html代码

<button @click="show">点击改变count</button>
<p class="span" v-for="i in count">测试Vue.nextTick()</p>

js代码

<script type="text/javascript">
        const vm = new Vue({
            el: '#app',
            data: {
                age: 18,
                count: 1
            },
            methods: {
                show() {
                    this.count++;
                    $('.span').css('color', 'red');
                }
            },
        })
</script>

初始效果

捕获.PNG

点击一次之后

捕获.PNG

这里我们发现,只有一个p标签变红了。因为jQuery获取的DOM是数据更新之前的DOM,就导致了这样的情况。

然后我们改一下代码,把jQuery对DOM操作的代码写到this.$nextTick()这方法里面。

show() {
     this.count++;
     this.$nextTick(function(){
          $('.span').css('color', 'red');
     })
}

捕获.PNG

我们发现全部变了颜色,也就是说jQuery操作的DOM是数据更新后的DOM了。这样我们就可以愉快的写jQuery代码了。

不过Vue的宗旨是数据驱动视图,我们还是按照它的规矩来吧。除非没别的办法了,再来直接进行DOM操作。

Vue.nextTick()可以作为一个Promise使用,它就是一个异步操作

Vue.nextTick()
  .then(function () {
    // DOM 更新了需要对DOM的操作写这里
})

3.Vue.directive(),自定义指令

官网的介绍:

除了核心功能默认内置的指令 (v-model 和 v-show),Vue 也允许注册自定义指令。注意,在 Vue2.0 中,代码复用和抽象的主要形式是组件。然而,有的情况下,你仍然需要对普通 DOM 元素进行底层操作,这时候就会用到自定义指令。

看了一下,感觉有可能会用到,就去看了一下它的用法,如下:

js代码

// 注册全局指令
//el: 指令所绑定的元素,可以用来直接操作 DOM 。
//binding: 包含指令相关信息数据的对象
Vue.directive('test',function(el,binding){//test就是指令名使用:v-test
    // console.log(el,binding)
    el.innerText = binding.value.toUpperCase();
});

const vm = new Vue({
     el: '#app',
     data: {
         msg:'I Love You'
     },
})

html代码

<p v-test='msg'></p>

这里我们给绑定指令的节点设置了innerText,并利用toUpperCase()把字母全部转成了大写。效果如下:

捕获.PNG

还可以注册局部指令

js代码

const vm = new Vue({
    el: '#app',
     data: {
        msg:'I Love You'
    },
    directives: {//注意这里directives,后面多了个s
       'test1':function(el,binding){// key:value的格式
             //el: 指令所绑定的元素,可以用来直接操作 DOM 。
             //binding: 包含指令相关信息数据的对象
             el.innerText = binding.value.toLowerCase();
        },  
    },
})

html代码

<p v-test1='msg'></p>

效果如下:

捕获.PNG

还能输出{{restrictNumber}}个字符  
  • {{reply.author}}

    {{CommonUtil.formateDate(reply.ac_CommentDate).shortTime}}
  • 回复了{{Comments.author}} :