Vue2——Vue自定义指令


vue运行我们进行自定义指令。我们自定义的指令,就是实现对js语句的封装。

需要在directives:

new Vue({
        directives:{
            //指令的配置,两种写法:
            //函数写法
            指令名(element,binding){
             // element:是绑定的真实DOM元素,binding
             // binding:包含绑定的信息,包括绑定的n值
            }
            //或者键值对写法
            指令名: {
            // 指令与元素成功绑定时(一上来)调用
            bind(element,binding) {},
            // 指令所在元素被插入页面时调用
            inserted(element,binding) {},
            // 指令所在模板被重新解析是调用
            update(element,binding){

            }
          },
        }
      });

中进行指令的配置

自定义的指令函数什么时候调用

  • 指令与元素成功绑定时(一上来)。
  • 指令所在的模板被重新解析时.

v-big

定义一个v-big指令,和v-text功能类似,但会把绑定的数值放大10倍。

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
    <script type="text/javascript" src="../js/vue.js"></script>
  </head>
  <body>
    <div id="root">
      <div>当前的n值是:<span v-text="n"></span></div>
      <div>放大10倍的n值是:<span v-big="n"></span></div>
      <button @click="n++">点我n+1</button>
    </div>

    <script type="text/javascript">
      Vue.config.productionTip = false;

      new Vue({
        el: "#root",
        data: {
          n: 1,
        },
        directives:{
            big(element,binding){
                // element:是绑定的真实DOM元素,binding
                // binding:包含绑定的信息,包括绑定的n值
                element.innerText = binding.value*10
            }
        }
      });
    </script>
  </body>
</html>

在这里插入图片描述

v-fbind

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

尝试使用函数形式实现

          fbind(element,binding){
              element.value = binding.value
              element.focus()
          //focus函数需要等element的值修改成功之后执行才奏效,所以这样写第一次是无法获取焦的
          }

但是focus函数需要等element的值修改成功并插入页面后执行才奏效,而使用函数的写法我们无法指定在elemen插入页面后执行focus函数才执行,所以这样写第一次是无法获取焦点的。

所以需要采取对象的(键值对)写法:

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
    <script type="text/javascript" src="../js/vue.js"></script>
  </head>
  <body>
    <div id="root">
      <div>当前的n值是:<span v-text="n"></span></div>
      <div>放大10倍的n值是:<span v-big="n"></span></div>
      <button @click="n++">点我n+1</button>
      <hr />
      <input type="text" v-fbind:value="n" />
    </div>

    <script type="text/javascript">
      Vue.config.productionTip = false;

      new Vue({
        el: "#root",
        data: {
          n: 1,
        },
        directives: {
          big(element, binding) {
            // element:是绑定的真实DOM元素,binding
            // binding:包含绑定的信息,包括绑定的n值
            element.innerText = binding.value * 10;
          },
        //   fbind(element,binding){
        //       element.value = binding.value
        //       element.focus()
        //   focus函数需要等element的值修改成功之后执行才奏效,所以这样写第一次是无法获取焦的
        //   }
          fbind: {
            // 指令与元素成功绑定时(一上来)调用
            bind(element,binding) {
                element.value = binding.value
            },
            // 指令所在元素被插入页面时调用
            inserted(element,binding) {
                element.focus()
            },
            // 指令所在模板被重新解析是调用
            update(element,binding){
                element.value = binding.value
            }
          },
        },
      });
    </script>
  </body>
</html>

在这里插入图片描述

对象写法中,配置对象中常用的3个回调

(1).bind:指令与元素成功绑定时调用。
(2).inserted:指令所在元素被插入页面时调用。
(3).update:指令所在模板结构被重新解析时调用。

自定义指令注意问题

  • 如果定义的指令名由多个单词组成,不要使用驼峰式命名方法。多个单词之间使用-进行分隔。
 <div>放大10倍的n值是:<span v-big-number="n"></span></div>
 <script>
 new Vue({
        el: "#root",
        data: {
          n: 1,
        },
        directives: {
          'big-number'(element, binding) {
            element.innerText = binding.value * 10;
          },
      },
});
 </script>

  • 自定义指令中的this
    都是windows,指令就是DOM操作元素的,所以this都设置成的时windows

全局指令

new Vue({
	 directives: {
	  },
});

中定义的指令时局部指令只能供该vue实例使用。

全局指令的定义

格式:
对象格式的全局定义

      Vue.directive('指令名',{
        配置内容
      })

函数格式的全局定义

      Vue.directive('指令名',function (element, binding) {
       
      })

eg:

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
    <script type="text/javascript" src="../js/vue.js"></script>
  </head>
  <body>
    <div id="root">
      <div>当前的n值是:<span v-text="n"></span></div>
      <div>放大10倍的n值是:<span v-big-number="n"></span></div>
      <button @click="n++">点我n+1</button>
      <hr />
      <input type="text" v-fbind:value="n" />
    </div>

    <script type="text/javascript">
      Vue.config.productionTip = false;
      Vue.directive("fbind", {
        // 指令与元素成功绑定时(一上来)调用
        bind(element, binding) {
          element.value = binding.value;
        },
        // 指令所在元素被插入页面时调用
        inserted(element, binding) {
          element.focus();
        },
        // 指令所在模板被重新解析是调用
        update(element, binding) {
          element.value = binding.value;
        },
      });
      Vue.directive("big-number", function (element, binding) {
        element.innerText = binding.value * 10;
      });

      new Vue({
        el: "#root",
        data: {
          n: 1,
        },
        directives: {
          //   'big-number'(element, binding) {
          //     // element:是绑定的真实DOM元素,binding
          //     // binding:包含绑定的信息,包括绑定的n值
          //     element.innerText = binding.value * 10;
          //   },
          //   fbind(element,binding){
          //       element.value = binding.value
          //       element.focus()
          //   focus函数需要等element的值修改成功之后执行才奏效,所以这样写第一次是无法获取焦的
          //   }
          //   fbind: {
          //     // 指令与元素成功绑定时(一上来)调用
          //     bind(element,binding) {
          //         element.value = binding.value
          //     },
          //     // 指令所在元素被插入页面时调用
          //     inserted(element,binding) {
          //         element.focus()
          //     },
          //     // 指令所在模板被重新解析是调用
          //     update(element,binding){
          //         element.value = binding.value
          //     }
          //   },
        },
      });
    </script>
  </body>
</html>

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue中,v-model是用于实现双向数据绑定的指令。在Vue 2中,v-model用于将表单输入元素的值与Vue实例中的数据进行双向绑定。这意味着当输入元素的值发生变化时,Vue实例中的数据也会相应地更新,反之亦然。 而在Vue 3中,v-model仍然用于实现双向数据绑定,但是它的用法有所改变。Vue 3中的v-model不再是一个指令,而是一个内置的语法糖,它可以更方便地实现双向绑定。在Vue 3中,你可以使用v-model来绑定表单输入元素的值,并且可以根据需要自定义v-model的行为。 另外,Vue 3引入了一个新的功能——模块化架构。通过使用类似于的架构开发Vue应用,可以将应用程序分解为多个独立的模块,每个模块负责管理自己的状态和逻辑。这种模块化的开发方式可以提高代码的可维护性和复用性。 总结起来,v-model在Vue 2和Vue 3中都用于实现双向数据绑定,但在Vue 3中它的用法更灵活。此外,Vue 3还引入了模块化架构的概念,可以让开发者更好地组织和管理Vue应用的代码。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [vue-module-loader:让你用微前端架构搭建Vue应用](https://download.csdn.net/download/weixin_42150745/20696773)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [自定义Vue中的v-module双向绑定的实现](https://download.csdn.net/download/weixin_38623707/12943750)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [vue3中使用jweixin-module报错](https://blog.csdn.net/qq_36093530/article/details/123210986)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值