vue2.0 插件,指令

247 阅读2分钟

插件

js

import Vue from 'vue'
import Pop from './index.vue'

//创建Dialog构造器
let PopConstrutor = Vue.extend(Pop)
let instance

const pop = function(options = {}) {
    //设置默认参数为对象,如果参数为字符串,参数中message属性等于该参数,回调函数为空
    if(typeof options === 'string') {
        options = {
            content: options,
            onOk: () => {},
            onCancel: () => {}
        }
    }
    //创建实例
    instance = new PopConstrutor({
        data: options
    })
    //将实例挂载到body下
    document.body.appendChild(instance.$mount().$el)
}

export default pop

vue文件

export default {
    name: 'pop',
    data() {
      return {
        //显示标题,默认为“提示”
        title: '提示',
        //显示内容
        content: '',
        //左按钮显示文本,默认为“取消”
        left_buttton: '取消',
        //右按钮显示文本,默认为“确定”
        right_buttton: '确定'
      }
    },
    methods: {
      //点击取消按钮
      cancel() {
        this.onCancel()  //点击取消的回调函数
        this.$destroy(true)  //销毁组件
        this.$el.parentNode.removeChild(this.$el)  //父元素中移除dom元素($el为组件实例)
      },
      //点击确定按钮
      ok() {
        this.onOk()  //点击确定的回调函数
        this.$destroy(true)  //销毁组件
        this.$el.parentNode.removeChild(this.$el)  //父元素中移除dom元素($el为组件实例)
      }
    }
}

挂载

1.引入封装好的全局组件地址
import 组件名 from './地址' //一般放置在./src/components下

2.导出
exports default{
    install (app) {
    // 此处形参为main.js文件中use()方法自动传进来的Vue实例
        app.component('自定义组件名,最好与组件内的name一致', 组件名)
    }
}

3.main.js中挂载到Vue实例中

import { createApp } from 'vue'
import App from './App.vue' //vue3中引入Vue实例方式

import component from './components'// 引入公共组件
// 链式添加一项 .use(component) 来引入配置好的公共组件
createApp(App).use(component).mount('#app')
4.使用
<自定义组件名 />

调用

//传入对象参数
    this.$pop({
      title: '提示',
      content: '这是一段提示信息',
      left_buttton: '取消',
      right_buttton: '确定',
      onOk: () => {
          console.log('ok');
      },
      onCancel: () => {
          console.log('cancel');
      }
    })

    //传入字符串参数(该参数会做为参数中content属性的值,回调函数为空)
    // this.$pop('这是一段提示信息')

指令

el: 父级元素对象,binding:子元素对象,vnode:虚拟节点

import Vue from 'vue'
import loading from '@/components/loading'
const loadingDireives = {
  /**
   * 元素插入父节点时调用
   * @param {dom元素} el 
   * @param {dom元素绑定的信息} binding 
   */
   inserted(el, binding) {
    // 获取自定义组件
    const loadingCor = Vue.extend(loading)
    // 实列化组件
    const loadingComp = new loadingCor().$mount()
    // 元素插入父节点时调用
    el.inserted = loadingComp
    
    // 绑定的值为true时
    if(binding.value) {
      // 插入元素
      append(el)
    }
  },

  /**
   * 组件的 VNode 更新时调用
   * @param {dom元素} el 
   * @param {dom元素绑定的信息} binding 
   */
  update(el, binding) {
    // 新的值不等于旧的值
    if(binding.value != binding.oldValue) {
      binding.value ? append(el) : remove(el)
    }
  }
}

function append(el) {
  el.appendChild(el.inserted.$el)
} 

function remove(el) {
  el.removeChild(el.inserted.$el)
}

export default loadingDireives
1.创建文件并导出配置
export default {
    install(app){
        app.directive('自定义指令名',{ //在创建自定义名称时不要带v-,使用时再携带
            mounted(el,binding){
                // el 为携带自定义指令的dom节点
                // binding 为指令后携带的参数通过.value取出
                功能
            }
        })
    }
}
2.main.js文件中注册
import direction from './directives'
createApp(App).use(directive).mount('#app')
3.全局使用
<div v-自定义指令名='...'></div> 

  • bind:只调用一次,指令第一次绑定到元素时调用,用这个钩子函数可以定义一个绑定时执行一次的初始化动作。

  • inserted:被绑定元素插入父节点时调用(父节点存在即可调用,不必存在于document中)。

  • update:被绑定于元素所在的模板更新时调用,而无论绑定值是否变化。通过比较更新前后的绑定值,可以忽略不必要的模板更新。

  • componentUpdated:被绑定元素所在模板完成一次更新周期时调用。

  • unbind:只调用一次,指令与元素解绑时调用。