微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

《Vue.j实战》一书 p126 页练习 1 试做

练习1 : 在update 钩子中支持表达式的更新。

Demo在线浏览

解题:当 update 钩子被调用时,传入钩子中的binding对象的属性 expression,已经是更新后的 表达式了,也即是说,我们始终只能在 update 中访问到更新后的表达式字符串,而无法访问更新前的表达式字符串。

在update钩子中支持表达式的更新,我理解,既是当表达式更新后,即可以访问到当前的表达式字符串,也可以访问到之前的表达式字符串。

即,类似于在 update中,既可以访问到当前值 value,也可以访问到更新前的 oldvalue。

如果我的解题是正确的,即,当update钩子被调用时,在钩子中,可以分别访问到表达式的当前值,即 binding.expression,此值始终为更新后的表达式字符串;还可以访问到更新前的表达式字符串,这里设定为 prevExp。

Q:如何在update钩子中访问到表达式的旧值呢?

A:利用 data自定义特性。

在绑定 v-test指令的 html 元素上,分别增设了 2 个自定义 data 特性。见下图:

    <div data-id="0" data-first v-test="1*0"></div>

从上面的代码可知,我为绑定了 v-test指令的 div 元素,添加了 2 个自定义特性,一个是 data-id="0",其用途为在 update 钩子中,用来判断 update 钩子,是否为第一次被调用,如是,进行相应操作,如否,则进行其他操作。

另一自定义特性为data-first,未设置值,其用途为在 bind钩子中,用来传递 binding.expression,即表达式的初始值。这样,在update钩子中,通过 el 的 dataset对象,即可访问到表达式的初始值。见下面的代码

      bind(el,binding,vnode){
        el.dataset.first=binding.expression;
      },

在bind钩子中,为自定义特性first 赋值,如此,在update钩子中,即可访问到表达式的初始值了。

      update(el,vnode){
        if(el.dataset.id++==0){
          var prevExp=el.dataset.first;
          el.dataset.first=binding.expression;
          var currentExp=binding.expression;
          console.log(prevExp);
          console.log(currentExp);
        }
        else{
          prevExp=el.dataset.first;

          currentExp=binding.expression;
          el.dataset.first=binding.expression;
          console.log(prevExp);
          console.log(currentExp);
        }

上面为 update 钩子,留意dataset.id的初始值为 0 ,通过判断其值是否为 0 ,来判断 update 钩子是否为第一次被 调用,如是,则将表达式的初始值赋给变量 prevExp 保存,供后面访问使用。

同时更新dataset.first的值。

如dataset.id不为0,则说明 update 钩子并非第一次被 调用,此时将更新后的dataset.first赋给preExp,同时设置currentExp,再次更新dataset.first的值。

如是,则可在 update 钩子中,同时访问表达式的当前 值 currentExp 和旧值prevExp。

完整代码如下:

<template>
  <div id="app">
    <div data-id="0" data-first v-test="1*0"></div>
  </div>
</template>
<script>

export default {
  data(){
    return{
      
    }
  },methods:{
    
  },directives:{
    test:{
      bind(el,update(el,vnode){
        if(el.dataset.id++==0){
          var prevExp=el.dataset.first;
          el.dataset.first=binding.expression;
          var currentExp=binding.expression;
          console.log(prevExp);
          console.log(currentExp);
        }
        else{
          prevExp=el.dataset.first;

          currentExp=binding.expression;
          el.dataset.first=binding.expression;
          console.log(prevExp);
          console.log(currentExp);
        }



        

        console.log(‘................................‘);


        
        

        console.log(‘................................‘);
      }
    }
  }
}
</script>

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐