指令语法

指令语法用于解析标签(包括标签属性、标签体内容、绑定事件等)。

函数式自定义指令

示例:

  1. <body>
  2. <div id="app">
  3. <h2>当前值是:<span v-text="n"></span></h2>
  4. <br>
  5. <h2>放大10倍后的值是:<span v-big="n"></span></h2>
  6. </div>
  7. </body>
  8. <script>
  9. Vue.config.productionTip = false;
  10. new Vue({
  11. el: '#app',
  12. data: {
  13. n: 1
  14. },
  15. directives: {
  16. // element就是最后渲染出的真实dom标签span
  17. // binding是该标签绑定对象,常用的是bingding.value,获取该指定的值n
  18. big(element, binding){
  19. // 使用原生dom操作
  20. element.innerText = binding.value * 10
  21. }
  22. }
  23. });
  24. </script>

directives中自定义指令。自定义指令在使用时需要加v-前缀,但是定义时不加该前缀。

函数式自定义指令时,函数有2个参数:

  • 参数1:指令对应的真实的dom对象
  • 参数2:指令绑定的对象,常用的是该对象的value属性,也即该指令后面接收的值

自定义指令的函数调用时机:

  1. 指令与元素成功绑定时
  2. 指定所在的模板被重新解析时。(不管变化的变量是不是该指令所用到的,都会重新执行)

对象式自定义指令

函数式自定义的指令首次执行是在指令与元素成功绑定时,这时候指令所在元素可能还没有被加载进页面,还只是位于Vue的ViewModel中。所以有些操作没有办法完成,比如:页面刚进来时使指令所在元素获取焦点、获取指令所在元素的父元素等等,这些功能需要指令所在的元素已经被插入页面后才可以运行。

对于这些需要指令所在元素被插入页面后才能运行的功能,可以使用对象式自定义指令编写。

例如:刚进页面时,使v-fbind指令所在元素获取焦点

  1. directives: {
  2. // 指令与元素绑定时,指令所在元素还没有被插入页面,所以element.focus()在刚进页面时没有执行
  3. // fbind(element, binding) {
  4. // element.value = binding.value;
  5. // element.focus();
  6. // }
  7. // 使用对象式自定义指令
  8. fbind: {
  9. // 指令与元素成功绑定时
  10. bind(element, binding) {
  11. console.log('bind...');
  12. element.value = binding.value;
  13. },
  14. // 指令所在元素被插入页面时
  15. inserted(element, binding) {
  16. console.log('inserted')
  17. element.focus();
  18. },
  19. // 指令所在模板被重新解析时
  20. update(element, binding) {
  21. console.log('update')
  22. element.value = binding.value;
  23. }
  24. }

对象式自定义指令,常用的属性函数有三个:

  • bind:指令与元素成功绑定时执行
  • inserted:指令所在元素被插入页面时执行
  • update:指令所在模板被重写解析时执行

所以,函数式自定义指令,其实就是对象式自定义指令定义了bind和update的内容。

指令名称

如果指令名称由多个单词组成,多个单词之间使用-连接,不支持驼峰命名,驼峰命名会被转成全小写形式。

  1. <div id="app">
  2. <!-- big-number之间使用短横连接,不能使用驼峰命名bigNumber -->
  3. <input type="text" v-big-number:value="n">
  4. </div>
  5. <script>
  6. Vue.config.productionTip = false;
  7. new Vue({
  8. el: '#app',
  9. data: { n: 1 },
  10. directives: {
  11. // big-number在json中需要加引号,或者写成全拼 'big-number':function(element, binding) {}
  12. 'big-number'(element, binding) {
  13. element.value = binding.value * 10;
  14. }
  15. }
  16. });
  17. </script>

定义全局指令:

  1. // 全局函数式自定义指令
  2. Vue.directive('tBig', function(element, binding) {
  3. element.value = binding.value * 10;
  4. });
  5. // 全局对象式自定义指令
  6. Vue.directive('tbind', {
  7. bind(element, binding) {
  8. console.log('bind...');
  9. element.value = binding.value * 20;
  10. },
  11. inserted(element, binding) {
  12. console.log('inserted')
  13. },
  14. update(element, binding) {
  15. console.log('update')
  16. element.value = binding.value * 20;
  17. }
  18. });