Vue 自定义指令

Vue  自定义指令

https://vuejs.bootcss.com/guide/custom-directive.html

被调用时机

  1. 指令与元素成功绑定时(初始化时)
  2. 指令所在模板被重新解析时

函数式:

<!DOCTYPE html>
<html>
<head>
    <meta lang="zh-cn">
    <meta charset="UTF-8">
    <title></title>
    <script src="./vue.js"></script>
</head>

<body>
  <div id="root">

    <h2><span v-big="n"></span></h2>

  </div>
</body>
<script>
  let vm = new Vue({
    el: '#root',
    data: {
      n: 1,
    },
    directives: {
      big(element, binding){
        console.log('binding: ', binding);
        console.dir('element: ', element);
        console.log(this);                // 注意:此处的this是window
        element.innerText = binding.value * 10; // 此指令实现将数据放大10倍然后显示
      }
    }
  });
</script>
</html>

 

 对象式:

 定义一个 v-fbind 指令,和 v-bind 指令类似,但可以让所绑定的input元素默认获得焦点。

<!DOCTYPE html>
<html>
<head>
    <meta lang="zh-cn">
    <meta charset="UTF-8">
    <title></title>
    <script src="./vue.js"></script>
</head>

<body>
  <div id="root">

    <input type="text" v-fbind:value="n">

  </div>
</body>
<script>
  let vm = new Vue({
    el: '#root',
    data: {
      n: 1,
    },
    directives: {
      // fbind(element, binding){
      //   element.value = binding.value;
      //   element.focus(); // 无法实现获得焦点,因为在节点放入DOM树之前无法进行只有在DOM树上才能进行的操作
      //   // 第一次被调用是元素与指令成功绑定时,此时节点没放入DOM树,无法调用 focus。模板会先编译,再用指令处理,再放入DOM树
      //   // 之后再触发此指令时,可以成功获得焦点
      // }
      fbind:{
        // 指令与元素绑定时
        bind(element, binding){
          element.value = binding.value;
        },
        // 元素插入页面时
        inserted(element, binding){
          element.focus();
        },
        // 指令所在模板被重新解析
        update(element, binding){
          element.value = binding.value;
          element.focus();
        },
        // 还有 componentUpdated unbind 见vue文档
      }
    }
  });
</script>
</html>

 

posted @ 2022-08-15 17:31  某某人8265  阅读(18)  评论(0编辑  收藏  举报