how to define a method inside the Vue directive? how to define a method inside the Vue directive? vue.js vue.js

how to define a method inside the Vue directive?


I don't think you can add a method inside the directive itself. But you can declare the method outside the directive and call it from inside it.

function method1 (el, binding, vnode) { ...}export const OutsideClick = { bind (el, binding, vnode) {  console.log(new Vue());  method1(el, binding, vnode) }, componentUpdated(el, binding, vnode)  {  console.log('updated comp', binding);  if(binding.value[1]()) {   method1(el, binding, vnode)  } }, unbind(el, binding, vnode) {   console.log('unbinding')  method1(el, binding, vnode) }}


Well, you need to add the function outside of the directive and call it inside the lifecycle methods as per below example.

Vue.directive("color", {  "bind": function() {    console.log("directive active");    hello();  },  "unbind": function() {    console.log("directive deactive");  },  "update": function(newValue, oldValue) {    var el = $(this.el);     if (this.arg == 'background')      el.css('background', newValue);    else      el.css('color', newValue);  },});function hello() {  console.log('hello');}new Vue({  el: '#app'});
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/1.0.24/vue.min.js"></script><script src="https://code.jquery.com/jquery-2.2.4.min.js"></script><div id="app">  <h2>Color</h2>  <select v-model="color">    <option value="#f00">Red</option>    <option value="#0f0">Green</option>    <option value="#00f">Blue</option>    <option value="#000" selected>Black</option>  </select>  <br><br>  <div v-color="color">    Hello world!!!  </div>  <h2>Background</h2>  <select v-model="color2">    <option value="#f00">Red</option>    <option value="#0f0">Green</option>    <option value="#00f">Blue</option>    <option value="#000" selected>Black</option>  </select>  <br><br>  <div v-color:background="color2">    Hello world!!!  </div></div>


Maybe someone will find it helpful. The trick is to wrap a directive with a constructor function.

function myDirective() {  this.myMethod = function() {    console.log('My method')  }  return {    bind: function(el) {      el.addEventListener('click', this.myMethod)    }.bind(this),    update: function() {      this.myMethod()    }.bind(this),    unbind: function(el) {      el.removeEventListener('click', this.method)    }.bind()  }}Vue.directive('myDirective', new myDirective())new Vue({  el: '#app'});
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script><div id="app">  <button v-my-directive>Just a button</button></div>

Also functions with .bind(this) could be replaced with lambdas () => {}.