When using a Vue custom directive, the context of 'this' is not available and is therefore undefined

I recently encountered a problem while trying to create a basic Vue directive. I faced difficulty accessing 'this' within the directive code. Despite following an example from the official Vue documentation and not using arrow functions, this issue persisted.

To replicate the problem: https://codesandbox.io/s/suspicious-lichterman-forud

Vue version being used: v2.6.11

The directive in question:

// The 'console.log' statement produces 'undefined'
// Attempts were made to place this code in main.js / App.vue
Vue.directive("example", {
  twoWay: true, // Experimented with setting this as false / true
  bind: function() {
    console.log(this);
  },
  unbind: function() {
    console.log("unbind", this);
  }
});

Answer №1

Your reference to the v0.12 documentation does not match the example provided, which uses the current version of Vue (v2.6.11). According to the 2.x binding documentation, the API for bind has changed:

Vue.directive('demo', {
  bind: function (el, binding, vnode) {
    var s = JSON.stringify
    el.innerHTML =
      'name: '       + s(binding.name) + '<br>' +
      'value: '      + s(binding.value) + '<br>' +
      'expression: ' + s(binding.expression) + '<br>' +
      'argument: '   + s(binding.arg) + '<br>' +
      'modifiers: '  + s(binding.modifiers) + '<br>' +
      'vnode keys: ' + Object.keys(vnode).join(', ')
  }
})

In the 2.x version, data accessible through this is now passed via hook arguments (i.e., el, binding, and vnode). Additionally, in 2.x, twoWay no longer exists as you can utilize Vue.set() without specifying any props.

Check out the updated Codesandbox here

Similar questions

If you have not found the answer to your question or you are interested in this topic, then look at other similar questions below or use the search

What is the best way to transfer an array from an Express Server to an AJAX response?

My AJAX request successfully communicates with the server and receives a response that looks like this: [{name: 'example1'}, {name: 'example2'}] The issue arises when the response is passed to the client-side JavaScript code - it is t ...

Top-notch strategy for creating Node Package Manager packages that are interdependent

As we work on developing two React-based applications, let's call them app-a and app-b, we also manage two dependencies. One is a shared-components package, which contains components shared between the two applications, and the other is a shared-utili ...

Developing pledges in AngularJS

I am currently working on implementing a promise in Angular using the $q service to retrieve an object from a web service. The unique aspect of this implementation is that if the object is already cached, it should be returned without making a call to the ...

Is it possible for the r.js optimizer to generate a fresh index.html file that links to the compiled files

After using r.js to optimize my project, I'm wondering how to generate a single index.html file that includes just one optimized script and one CSS file. Would I need to manually write this post-build or is there another way to achieve this? ...

Can the background color of HTML header text be altered using JavaScript in JQGRID?

Can the background color of HTML header text be modified using JavaScript? Updated: Oops, I forgot to mention that it is for the header text in jqGrid. My apologies for that oversight. ...

Saving data for editing on a Laravel page can be achieved by leveraging the powerful features

I have implemented my create page using vue.js. I called the vue.js file using a component. Now, for the edit page, I followed the same procedure by calling the vue component in the blade. However, I am unsure how to save data for the edit page. Can anyone ...

The FileReader.result is found to be null

Currently, I am in the process of setting up a page that allows users to upload a txt file (specifically a log file generated by another program) and then modify the text as needed. Initially, my goal is to simply console.log the text, but eventually, I pl ...

How can Ajax assist in utilizing a JavaScript variable within a Rails call that is made within a JavaScript function?

I'm facing a challenge where I need to update a Ruby on Rails partial within a view using a JavaScript object-defined variable, but I'm struggling to make it work. Despite my research pointing towards using an Ajax call as the only viable solutio ...

Incorporating payment processing into React Native using JavaScript

I am looking to incorporate payment processing into my react native app, but I encountered an issue with using RN's webview as it does not render on the web platform. Additionally, I need to be able to read the response from the server. Can someone re ...

A guide on retrieving a JSON static file that has been imported using Webpack

I have a JSON static file named someFile.json within my project directory. This JSON file contains a stringified array of objects: [{...},{...},etc] To import it using Webpack (version 4.41.2), I use the following line in my App.js file: import '.. ...

calling requestAnimationFrame from within a freshly created instance

I'm encountering an issue with executing an animation. Specifically, this problem arises within var ob1 = function() {};. Once triggered, the animation runs for a brief period before I receive the error message Uncaught RangeError: Maximum call stack ...

Enable interactive features on collapsible navigation links

The original code included data-toggle="tab", but I decided to switch it to collapse. This change worked perfectly for my needs. Now, I am looking to add the "active" class to the nav-link element for CSS styling purposes. I have experimented with a coup ...

Rejuvenating a template generated on the server in AngularJS

I have a specific partial which is a report - simply a static list of names and dates designed for viewing and printing purposes. For efficiency reasons, the report is rendered server-side, so when a report request is made, my API responds with HTML rathe ...

Revamp your AngularJS controller for a fresh new look

How can a controller be refreshed in Angular? Take into account the scenario below: <div ng-controller="MsgCtrl" ng-repeat="m in messages">{{m}}<br></div> <script> var ws = new WebSocket(something, something); function MsgCtrl($sco ...

Is there a way to alter visibility once a radio button has been selected?

I have a shape resembling a cube with 4 faces, all of which are currently visible. However, I would like to hide the other 3 faces when one face is showing. For example: I attempted setting the opacity of the other cube sides to 0 when the first radio but ...

Challenges encountered when using random values in Tailwind CSS with React

Having trouble creating a react component that changes the width based on a parameter. I can't figure out why it's not working. function Bar() { const p =80 const style = `bg-slate-500 h-8 w-[${p.toFixed(1)}%]` console.log(styl ...

Tips for eliminating any hidden image whitespace in a category filtering system

I recently implemented a category filter feature that hides images I don't need. When I click on the car logo at the top, I want to hide every element that doesn't have the "car" id. However, I'm facing an issue where hidden images still ret ...

Guide to enabling cross-domain uploads of files

After following a tutorial, I successfully implemented an HTML5 uploader on my website. The source of the tutorial can be found here: The uploader works perfectly; however, I am now facing an issue where I want to upload files to a different domain. Accor ...

Troubining AJAX for Generating a New Template: Addressing Missing Template Error

I have been working on integrating AJAX into my to-do application, but I keep encountering a missing template error (Missing template items/create, application/create with {:locale=>[:en], :formats=>[:html], :variants=>[], :handlers=>[:erb, :bu ...

Retrieve the jQuery widget instance by selecting an element within the widget

I am currently developing a widget using the Jquery widget factory. The abbreviated version of the code looks something like this: _create: function(){ this.element.hide(); //hides original input element this.newInput=$("<input>"); //creates ...