冇事来学系--Vue2.0中自定义指令

简介: 什么是自定义指令vue官方提供了v-text、v-for、v-if、v-model等指令,此外vue还允许开发者自定义指令

自定义指令


什么是自定义指令

vue官方提供了v-text、v-for、v-if、v-model等指令,此外vue还允许开发者自定义指令

私有自定义指令


directives节点下声明私有自定义指令

<script>
  export default {
    // 私有自定义指令的节点
    directives: {
      // 定义名为color的指令,指向一个配置对象
      color: {
        // 当指令第一次被绑定到元素上的时候,会立即触发bind函数
        // 形参el表示当前指令所绑定的那个DOM对象(element)
        bind(el){
          console.log('触发了v-color的bind函数')
          el.style.color = 'red'  // 将相应DOM对象的文字改为红色
        }
      }
    }
  }
</script>


<!-- 使用自定义指令 -->
<template>
  <h1 v-color>自定义指令color</h1>
  <!-- 触发v-color指令时,会立刻调用里面的bind函数 -->
  <!-- h1内的文字会变成红色 -->
</template>



bind函数的第二个形参binding(官方的写法,写作别的名字如obj也可以)

<template>
  <h1 v-color="color">使用变量指定属性值,由data的数据</h1>
  <h2 v-color=" 'red' "> </h2>
  <!-- 注意不带引号是变量,带引号才是一个表达式的值 -->
</template>
<script>
  export default {
    data(){
      color: blue
    },
    // 私有自定义指令的节点
    directives: {
      // 定义名为color的指令,指向一个配置对象
      color: {
        // 形参el表示当前指令所绑定的那个DOM对象
        bind(el, binding){
          console.log('触发了v-color的bind函数')
          console.log(binding)
          // binding绑定的意思
          // 打印binding得到一个对象,其中的value属性就是使用指令时传递的数据
          el.style.color = binding.value  // 使用 用户指定的颜色
        }
      }
    }
  }
</script>



自定义属性中的update函数

bind函数的缺点:只能在自定义属性第一次绑定到元素上的时候触发一次,当数据改变的时候(DOM更新的时候),不会自动触发bind函数,因而页面也不会重新渲染

update函数会在每次DOM更新时被调用(指令所在的模板被重新解析时)

<script>
  export default {
    directives: {
      // 定义名为color的指令,指向一个配置对象
      color: {
        // 形参el表示当前指令所绑定的那个DOM对象
        bind(el, binding){
          console.log('触发了v-color的bind函数')
          el.style.color = binding.value  
        },
        // 每次DOM更新时被调用
        update(el, binding){
          console.log('触发了v-color的update函数')
          el.style.color = binding.value
        }
      }
    }
  }
</script>


函数简写

上面的bind函数和update函数中的逻辑完全相同,这种情况下 对象格式的自定义指令 可以简写为函数格式

<script>
  export default {
    directives: {
    // 在bind函数和update函数中会触发相同的业务逻辑
     // color: function(el, binding){ }
      color(el, binding){
        el.style.color = binding.value
      }
    }
  }
</script>



补充:

  1. 我们之前写了 自定义指令与元素成功绑定时(一上来)就调用bind函数,每次DOM更新时(指令所在的模板被重新解析时)调用update函数,这都能实现自定义指令的操作。此外,还有一个时间点,就是自定义指令所在的元素被插入到页面的时候,就会调用inserted函数
<script>
  export default {
    directives: {
        color: {
          // 自定义指令与元素成功绑定时(一上来)就调用bind函数
          bind(element,binding){},
          // 自定义指令所在的元素被插入到页面的时候,就会调用inserted函数
          inserted(element,binding){},
          // 每次DOM更新时(指令所在的模板被重新解析时)调用update函数
          update(element,binding){}
        }
    })
  }
</script>
  1. 所有由Vue管理的函数,他们的this都指向的是vm实例对象;而directives节点里面的自定义指令中的函数,他们的this都指向的是window(因为这些函数都是要操作DOM的)

全局自定义指令

全局共享的自定义指令需要通过 Vue.directive( ) 进行声明

注意:全局声明的自定义指令、过滤器等都要写在main.js里面

// 在main.js里面写入
  // 参数1:字符串,表示全局自定义指令的名字
  // 参数2:对象,用来接收指令的参数值
  Vue.directive('color', {
        bind(el, binding){
          console.log('触发了v-color的bind函数')
          el.style.color = binding.value  
        },
        // 每次DOM更新时被调用
        update(el, binding){
          console.log('触发了v-color的update函数')
          el.style.color = binding.value
        }
    }
  // 函数形式简写
  Vue.directive('color', function(el, binding){
    el.style.color = binding.value
  })


目录
相关文章
|
JavaScript 容器
冇事来学系--Vue2.0中VueComponent(组件)
组件的本质 组件的本质就是一个 构造函数 f VueComponent (options) { this._init(options); } ,是Vue.extend( )生成的 当我们使用组件时,写了组件的标签,Vue解析时就会创建该组件的实例对象,即Vue帮我们执行了这一句代码 new VueComponent(options) (options就是我们写的data、methods、computed等数据) 每次调用Vue.extend( )时,返回的都是一个全新的VueComponent
308 0
|
存储 JavaScript 前端开发
冇事来学系--Vue2.0中vuex(上)
专门在Vue中实现集中式状态 (数据) 管理的一个Vue插件,对vue中多个组件的共享状态进行集中式的管理(读/写) ,适用于任意组件之间的通信
185 0
|
存储 前端开发 JavaScript
冇事来学系--Vue2.0中路由Router
路由的概念与原理 路由(router),就是对应关系。即 Hash地址(锚点链接) 与 组件 之间的对应关系 注意:锚点链接的特点-->不会刷新页面,但是会产生浏览历史
204 0
|
JavaScript 前端开发
冇事来学系--Vue2.0中讲讲生命周期吧
生命周期(Life Cycle) 是指一个组件从创建->运行->销毁的整个阶段,强调的是一个时间段。 生命周期函数:是由vue框架提供的内置函数,会伴随着组件的生命周期,自动按次序执行 。是vue在关键时刻帮我们调用的一些特殊名字的函数。 生命周期函数中的this指向的是vm或组件实例对象
177 0
|
JavaScript
冇事来学系--Vue2.0 组件开发详讲(下)
组件的自定义属性props props节点是和data、methods等同级的节点,值是一个数组
130 0
|
前端开发 JavaScript 数据库
冇事来学系--Vue2.0中Promise详讲(上)
回调地狱 多层回调函数的相互嵌套,就形成了回调地狱
306 0
|
前端开发
冇事来学系--Vue2.0中Promise详讲(下)
then-fs的基本使用 可以通过node下载then-fs。 npm install then-fs
164 0
|
JavaScript 前端开发
冇事来学系--Vue2.0中vue-cli使用
单页面应用程序(Single Page Application) 一个web网站只有一个HTML页面,所有的功能与交互都在这一个页面上完成
127 0
|
JavaScript 前端开发
哆啦A梦的口袋!Vue3的内置组件Teleport!
前言 Vue3 相较于 Vue2 而言,新增了很多新特性。其中 Teleport 内置组件就是 Vue3 新增的新特性之一,我们通常把它称为传送门,也可以把它比作哆啦 A 梦的口袋,那么这个新特性到底是干什么用的呢?感觉很神奇一般,接下来就让我们一起来学习这个新的内置组件吧!
358 0
哆啦A梦的口袋!Vue3的内置组件Teleport!
|
JavaScript 前端开发 API
vue3,你还为状态为何物而发愁吗?(一)
为啥需要状态?因为组件划分的非常原子化(细腻),所以造成了很多的组件,那么组件之间就需要一种“通讯方式”,这个就是状态了。不仅仅是传递数据,还可以实现事件总线。
vue3,你还为状态为何物而发愁吗?(一)