Home
Man
Search
Today's Posts
Register

Javascript, Javascript libs and toolkits, LAMP, Apache, MySQL, HTML, and other web coding posts.

Turning jQuery Code into Vue.js

Tags
code, jquery, navbar, setinterval, setinterval(), vue, vue.js, web programming

Login to Reply

 
Thread Tools Search this Thread
# 15  
Old 1 Week Ago
Yes, in your example you still need to call a function to update so it does not accomplish what we have set out to do, which is to insure that when vbuserId updates outside of vue, it updates in vue.

If I take your code and in the dev console type:

Code:
vbuserId  = 0;

The avatar does not change because your codes does not call the function nor update it.

However, if we do only this:

Code:
var timerID = setInterval(getUpdate, 1000);
  function getUpdate ()
    {
       vm.$children["0"].id = vbuserId;
  }

It updates when we change vbuserId in the dev console.

This is the intended result in the browser, to react to changes to an external var change.

The trick, which we have not figured out yet, it do bind vue (vm in this instance) to vbuserId and react to a change outside of the vm instance. The setInterval() code above does that, but I want do do this without setInterval() using a native vue binding.

I just watched a YT video, and in that video, they also used setInterval() to update vue based on an JS var change. So, I'm still searching YT, Google and the entire world, LOL, for Vue method which binds to an external var and reacts when a change is made in the dev console.

See attached video to see this change in the browser by changing vbuserId in the console.
# 16  
Old 1 Week Ago
Note:

The interesting news is that we are now back on the cutting edge of web dev technology with Vue.

The good news is that Vue.js web dev is both powerful and really fun.

I encourage others to learn Vue with us and help us build new components for the forums or for your business or or personal web sites.

OBTW: Here is the current working code with setInterval(). Yes, we could move this function inside of vue (or alias vm.$children["0"]), but I am still looking for a better solution where setInterval() is not required and we can use vue to bind directly to changes in an external var (changes in the dev console, not when a page reloads).

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,
      avatar: vbtheURL
    };
  },
  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>';
    }
  },
  methods: {
    OpenMemberPanel() {
      if (this.id > 0) openMemberPanel();
      else openLogin();
    }
  }
});

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

var timerID = setInterval(getUpdate, 1000);
function getUpdate() {
  vm.$children["0"].id = vbuserId;
}

Also note that it has been nearly 24 hours and no one has responded to my question on this over in the vue forums, but it's the weekend so like here, maybe people are offline:

Bind Vue.js variable to external Javascript variable for reactivity - Get Help - Vue Forum
# 17  
Old 1 Week Ago
In this example, we move setInterval() inside the Vue component.

However, this is still suboptimal, as the goal is to get Vue to react (be reactive) and update to changes to external JS vars in the dev console without reloading the page. This is simply a rearrangement of the code in the prior post. I want to bind the Vue instance to external var changes outside the DOM (outside the Vue instance), and have Vue react to this. The means that when we do vbuserId = "some new value" in the console, the avatar will change. The code below works, but only because it polls vbuserId every second.

We are still searching for a way to do this ....

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,
      avatar: vbtheURL
    };
  },
  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>';
    }
  },
  methods: {
    OpenMemberPanel() {
      if ( this.id > 0 )
        openMemberPanel();
      else
        openLogin();
    },
    GetUID() {
       this.id = vbuserId;
    }
  },
   created(){
    var timerID = setInterval(this.GetUID, 1000);
  }

});

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

# 18  
Old 1 Week Ago
Googl'ing until all links are purple (as Scott says in PMs, LOL), I find that the "setInterval()" solution remains king:

javascript - Binding Vue component data to external state - Stack Overflow
# 19  
Old 1 Week Ago
FYI, I commented out the setInterval() method in the Vue instance and tried this, but it did not meet the stated objective:

Code:
Vue.nextTick()
  .then(function () {
    vm.$children["0"].id = vbuserId;
  })

The hunt continues .......
# 20  
Old 1 Week Ago
We got a suggestion from over a the vue forums:

Bind Vue.js variable to external Javascript variable for reactivity - Get Help - Vue Forum

Alex:

Quote:
Try this.
Code:
var app = new Vue({
    el: '#app',
    data: {
        message: 'Hello Vue!'
    }
})

var myVar = {
    get a() {
        return app.message
    },
    set a(b) {
	app.message = b
    }
}

Quote:
BTW using v-html is not a very good idea.

Instead, you can bind src to a variable and also use conditional rendering:
Code:
<img :src="vbtheURL" v-if="vbuserId">

Quote:
You can do the same for styles:
Code:
<span :style="avatarStyle" v-else>

Code:
computed: {
    avatarStyle() {
        return {
             'font-size': '3em',
             cursor: 'pointer',
             /* etc... */
        }
    }
}

Thank you Alex from the Vue forums .... we will try these suggestions and post back our results.
Login to Reply

« Previous Thread | Next Thread »
Thread Tools Search this Thread
Search this Thread:

Advanced Search
Display Modes

More UNIX and Linux Forum Topics You Might Find Helpful
Thread Thread Starter Forum Replies Last Post
A simple UNIXtime component in Vue.js Neo Web Programming 1 1 Week Ago 09:30 PM
A Simple Way to Set Meta Tags Using Vue.js Neo Web Programming 0 2 Weeks Ago 12:20 AM
JQuery to Add Code Tags to Selected Text Neo What is on Your Mind? 0 09-10-2018 11:22 AM
JQuery and CSS Flex Code for Responsive Forum Home Page Neo What is on Your Mind? 1 08-11-2018 07:45 AM
JQuery and CSS Flex Code for Responsive WOL Page Neo What is on Your Mind? 0 08-10-2018 12:02 PM
Xclient with xming on MSW to HPUX X11 / VUE 10.20 dlanor HP-UX 1 10-11-2007 01:50 PM
HPUX 10.20 and fx5 which patches for vue dlanor HP-UX 0 10-11-2007 01:33 PM
HP VUE Messaginbg system could not be started inquirer HP-UX 2 12-19-2005 10:41 PM


All times are GMT -4. The time now is 08:00 AM.

Unix & Linux Forums Content Copyright 1993-2018. All Rights Reserved.
UNIX.COM Login
Username:
Password:  
Show Password