import { getOptionProps } from './props-util'

export default {
  directives: {
    ref: {
      bind: function (el, binding, vnode) {
        binding.value(vnode.componentInstance ? vnode.componentInstance : vnode.elm)
      },
      update: function (el, binding, vnode) {
        binding.value(vnode.componentInstance ? vnode.componentInstance : vnode.elm)
      },
      unbind: function (el, binding, vnode) {
        binding.value(null)
      },
    },
  },
  methods: {
    setState (state, callback) {
      const newState = typeof state === 'function' ? state(this.$data) : state
      if (this.getDerivedStateFromProps) {
        Object.assign(newState, this.getDerivedStateFromProps(getOptionProps(this), this.$data, true) || {})
      }
      Object.assign(this.$data, newState)
      this.$nextTick(() => {
        callback && callback()
      })
    },
    __emit () { // 直接调用listeners,底层组件不需要vueTool记录events
      const args = [].slice.call(arguments, 0)
      const filterEvent = []
      const eventName = args[0]
      if (args.length && this.$listeners[eventName]) {
        if (filterEvent.includes(eventName)) {
          this.$emit(eventName, ...args.slice(1))
        } else {
          this.$listeners[eventName](...args.slice(1))
        }
      }
    },
  },
}