Visit The New, Modern Unix Linux Community


Turning jQuery Code into Vue.js


 
Thread Tools Search this Thread
Top Forums Web Development Turning jQuery Code into Vue.js
# 8  
Also, for completeness, I changed the GetAvatar() method to a computed property and it works as well. I personally like this method because it is a few less lines of code and it's easy to use the dev tools Vue debugger to look at the computed data:

Code:
Vue.component("unix-navbar", {
  template: `<div class="neo-table-border vue-navbar">
              <div  class="vue-site-info">
                <a class="vue-site-link" :href="url">{{name}}</a>
              </div>
              <div id="avatar"  v-html="theavatar" @click="OpenMemberPanel()"></div>
            </div>`,

  data() {
    return {
      name: "The UNIX and Linux Forums",
      url: "https://www.unix.com/"
    };
  },
  computed: {
    theavatar: function() {
      if (vbuserId > 0)
        return '<img id="avatar-img" src="' + vbtheURL + '"></img>';
      else return '<i id="avatar-icon" class="fas fa-user"></span>';
    }
  },
  methods: {
    OpenMemberPanel() {
      if (vbuserId > 0) openMemberPanel();
      else openLogin();
    }
  }
});

var navbar = new Vue({
  el: "#vue-navbar"
});

Vue debugger:

Image
# 9  
Here is another question I have. Given this Vue code below, why does id not update when I manually update vbuserId in the dev console?



Code:
Vue.component("unix-navbar", {
  template: `<div class="neo-table-border vue-navbar">
              <div  class="vue-site-info">
                <a class="vue-site-link" :href="url">{{name}}</a>
              </div>
              <div id="avatar"  v-html="theavatar" @click="OpenMemberPanel()"></div>
            </div>`,

  data() {
    return {
      name: "The UNIX and Linux Forums",
      url: "https://www.unix.com/",
      id: vbuserId
    };
  },
  computed: {
    theavatar: function() {
      if (this.id > 0)
        return '<img id="avatar-img" src="' + vbtheURL + '"></img>';
      else return '<i id="avatar-icon" class="fas fa-user"></span>';
    }
  },
  watch: {
    id() {
      console.log("The id has changed!");  /* This never logs as expected */
    }
  },
  methods: {
    OpenMemberPanel() {
      if (this.id > 0) openMemberPanel();
      else openLogin();
    }
  }
});

var navbar = new Vue({
  el: "#vue-navbar"
});

# 10  
I also tried variations of this code, with no joy getting vbuserId changes in the dev console to be reactive in Vue;

Code:
Vue.prototype.$id = vbuserId;
Vue.prototype.$avatar = vbtheURL;

Vue.component("unix-navbar", {
  props: ["myid"],
  template: `<div class="neo-table-border vue-navbar">
        <div  class="vue-site-info">
                <a class="vue-site-link" :href="url">{{name}}</a>
              </div>
              <div id="avatar"  v-html="theavatar" @click="OpenMemberPanel()"></div>
            </div>`,

  data() {
    return {
      name: "The UNIX and Linux Forums",
      url: "https://www.unix.com/"
    };
  },
  computed: {
    theavatar: function() {
      if (this.id > 0)
        return '<img id="avatar-img" src="' + this.$avatar + '"></img>';
      else return '<i id="avatar-icon" class="fas fa-user"></span>';
    },
    id: function() {
      return this.$id;
    }
  },
  methods: {
    OpenMemberPanel() {
      if (this.id > 0) openMemberPanel();
      else openLogin();
    }
  }
});

var vm = new Vue({
  el: "#vue-navbar"
});

Tried various Vue.nextTick() and other Vue methods, but no joy either. And also tried many variations of:

Code:
vm.$el.myid = vbuserId;
vm.myid = vbuserId;

adding [ICODE]myid[/ICODE ]to data() in the component, but no joy.

Again, I must be missing something very basic in Vue Smilie
# 11  
Added vbuserId to the component:
Code:
  data() {
    return {
      ...
      vbuserId: vbuserId
    };
  },
  computed:{
    ...
    id: function() {
      return  this.vbuserId;
    }

I guess there's no need for a computed value there, as it's not actually computing anything.
Turning jQuery Code into Vue.js-vbuserid_changepng
# 12  
What you propose did not change the fact it is not reactive to the JS var.

When I change vbuserId in the dev console, it it worked (was reactive), the avatar would change; but it does not change.

If the conditional in vue is from data(), computed: or from a method: all will change the value internal to Vue, but what I am trying to
do is get Vue to react to changes in the variable in the console which simulates a change outside of Vue.

IMHO, it is not related to data(), computed: or from a method directly, and there is something that needs to be added to get Vue to react (bind) to an external change outside of vue.
Turning jQuery Code into Vue.js-screen-shot-2018-11-09-45018-pmpng
# 13  
Update:

After looking into this; it seems that it's not really in the design of Vue.js to bind and react to Javascript variables outside the Vue instance sandbox.

No big deal... we can manage without this capability and indeed, as Scott has pointed out to me, there are probably good security reasons for this design (Vue.js as a sandbox).

However, in the interest of being complete, I asked this question over at the Vue forums:

Bind Vue.js variable to external Javascript variable for reactivity - Get Help - Vue Forum
# 14  
My "security" suggestion was just a guess.. probably not a very good one, or the right one for the wrong reasons! Encapsulation is good!

When the Vue instance is instantiated the execution context in JS knows about vbuserId, but that doesn't bind it in any way to the Vue instance. I've googled it to death, and can't find a way to make that happen. But it's certainly easy to update both, outside of the context of the Vue components with, for example, a function:
Code:
var vm  =
  new Vue({
    el: "#vue-navbar"
  });

var u = vm.$children["0"];

function updateId(newId) {
  vbuserId = newId || 0;
  u.id = vbuserId;
}

Of course, to anyone who is concerned, this vbuserId is only used for the purposes of displaying an avatar (and only either your own or the default, silhouette one, and doesn't "make you" that user Smilie

Previous Thread | Next Thread
Thread Tools Search this Thread
Search this Thread:
Advanced Search

Test Your Knowledge in Computers #805
Difficulty: Medium
The goal of a Digital Signal Processor (DSP) is usually to measure, filter or compress discrete digital signals.
True or False?

6 More Discussions You Might Find Interesting

1. Web Development

Vue.js component: Beautiful code highlighter

Sooner than later I will render forum discussions in Vue.js to complement the standard way of showing forum threads. Today, I ran across this component, vue-code-highlight Beautiful code syntax highlighting as Vue.js component. https://www.unix.com/members/1-albums225-picture1199.jpg ... (1 Reply)
Discussion started by: Neo
1 Replies

2. Web Development

Vue JS 2 Tutorial by The Net Ninja: A Recommended Vue.js Video Tutorial Series

A number of people have asked me how to get started with Vue.js and my reply before today was to Google "Vue.js". That has changed and my recommendation to anyone who wants to learn the fastest growing, easiest to learn and use Vue.js web dev framework is to watch this video tutorial series: ... (0 Replies)
Discussion started by: Neo
0 Replies

3. Web Development

Simple Vue.js Component to Redirect to External Web Page Using Vue Router

Vue Router has some quirks and on of the quirks is that it is not reliable when adding external links using the vue-router library. After struggling with many solutions, I have found that creating a simple Vue.js component like this one seems to work the best (so far): Component Example: ... (0 Replies)
Discussion started by: Neo
0 Replies

4. What is on Your Mind?

JQuery to Add Code Tags to Selected Text

Hey. Someone find or write some jQuery code where we can select text with our mouse and then click or double click the highlighted / selected text and then it will wrap code tags around the highlighted text (in our editors). :) (0 Replies)
Discussion started by: Neo
0 Replies

5. What is on Your Mind?

JQuery and CSS Flex Code for Responsive Forum Home Page

So far, I have completed making the home page more responsive (except for the forum stats at the top and the WOL box at the bottom, they still use scroll bars). xevV3_iZ8-s For full screen use the link below and set your YT resolution to 1080p60 HD https://youtu.be/xevV3_iZ8-s Here is... (1 Reply)
Discussion started by: Neo
1 Replies

6. What is on Your Mind?

JQuery and CSS Flex Code for Responsive WOL Page

I have just wrote this jQuery to the WOL page, so the table of users on line will not need scrollbars and will instead transform into a responsive table: <script> jQuery(document).ready(function (){ jQuery("#neo-who-flex-tcat"). css({"display":"flex","flex-flow":"row wrap", ... (0 Replies)
Discussion started by: Neo
0 Replies

Featured Tech Videos