Vuejs

Subscribe to Vuejs feed
most recent 30 from stackoverflow.com 2017-09-14T21:10:11Z
Updated: 7 years 1 week ago

Rendering an email preview in Vue

Thu, 2017-09-07 18:56

I'm creating an internal messaging app in Vue and would like to expose a limited number of predefined variables for a user to choose from when sending a templated message (name, department, etc.).

I'm planning on displaying the rendered variables in a "preview" component which ideally would take the raw html, complete with {{variables}}, fetch the values for the variables and render the preview.

Judging from https://vuejs.org/v2/guide/components there are a number of options that would seem to work, is there an objectively better/worse solution?

Categories: Software

Vue.js: anonymous function with parameter in v-on:event or @event

Thu, 2017-09-07 18:35

I want to execute a simple function after an event is emitted from the child component. The problem is the child component emits data that I need as a parameter for my function.

How can I inject the parameter and run the function in one line in the component?

<div v-on:posted="runTask"> </div>

Or

<div @posted="runTask"> </div>

Important: I would like it to fit in the template (v-on:event or @event) because I want to keep the component in the PHP blade template.

Categories: Software

VueJS list ordering based on async child-gathered data

Thu, 2017-09-07 18:14

I have an interesting situation as follows. I have:

  • a parent component that does a web service call for a list of results (websites)
  • it then renders a "result item" component (v-for) for each result
  • then each "result item" component fires off a number of web service calls to get scores for that url and display them beside it.

Basically the component tree is:

  • page
    • result item (many)
      • x score
      • y score
      • z score

Up until now I've been able to pass down the tree using props just the web url of the result item to the scoring components and keep the score service call and data local to each score component. This nicely separates all the logic.

Nonetheless, what I'd like to achieve now is:

  • Result items v-for list re-orderable based on the "x score", "y score", "z score" async calculated values via user-controlled dropdowns on the page component (e.g. order by x/y/z dropdown and asc/desc dropdown).
  • Results list re-order as the score values come in async-ly (i.e. reactive upfront)

I've been looking at Vuex, and it seems like it may be the best approach but before I dive all the way in I'd like to verify my thoughts and if people think it'd actually work.

Should I:

  • Use a Vuex store to hold my list of results
  • Use a mutation to store the initial results list (list of objects with id/url)
  • Use a computed property in the page component like "orderedResults" and render the "result item" components with v-for from that
  • Use mutations on each scoring component to add the scores to each result item in the store (prob with set method to ensure reactivity on new prop). And does this mean I need to pass an id of the result item and the new score then do a lookup in the result items by id to find and modify it, or can I pass through in the mutation payload the ref I have of the result item given down via props and just use that in the mutation function directly?

Is this the best way to do it? Any gotchas? Thanks!

Categories: Software

Vue js sending data between components

Thu, 2017-09-07 18:07

I would like to know how I can send data between two components. So I would like to send to another component the dynamic value which is rendered on selectedBase.price, and be rendered on another component. I've tried with props but not succeed.

<v-layout row wrap primary-title v-for="base in bases" :key="base.id"> <v-layout column> <v-flex xs6 offset-xs3> <v-avatar size="80px" class="grey lighten-1"> <img :src="base.href" :class="{selected: selectedBase.id == base.id}" @click="selectedBase = base" alt="avatar"> </v-avatar> </v-flex> </v-layout> <v-layout column> <v-flex xs6 offset-xs4> <v-subheader>{{base.name}} {{base.price}}€ {{selectedBase.price}}</v-subheader> </v-flex> </v-layout> </v-layout> <script> export default { data() { return { selectedBase: {}, bases: [{ id: 1, name: "black", price: 4, href: "../../static/black.jpg" }, { id: 2, name: "white", price: 6, href: "../../static/white.jpg" }] } }, computed: { totalBase: function() { var totalBase = 0; for (var i = 0; i < this.bases.length; i++) { if (this.bases[i].selected) { totalBase += this.bases[i].price; } } return totalBase; } }, methods: { getSelectedBase() { return this.selectedBase; } } } </script>
Categories: Software

vuejs multiple themes with scoped css in single file vue components

Thu, 2017-09-07 17:56

So let's assume we have a variables scss file like the following

$darken-percentage: 15%; $primary-color: #2aaae1; $dim-primary-color: darken($primary-color, $darken-percentage); $complementary-color: #faaf48; $dim-complementary-color: darken($complementary-color, $darken-percentage); $background-color: #1d1f29; $middleground-color: #313444; $dim-middleground-color: darken($middleground-color, $darken-percentage); $light-middleground-color: lighten($middleground-color, $darken-percentage);

In the main.js we could use @import 'variables.scss' what if I have two themes and I want to change on user action I could have 2 variables files and conditionally import either based on user actions but what about single file vue components like

<style scoped lang="scss"> @import '../../theme/_variables.scss'; .bm-upload{ background: $primary-color; } </style>

Then the import will not work so is there anyway for me to have global variables files and use it in other files without re importing it

Categories: Software

Using VueJS with Axios post response data disappears

Thu, 2017-09-07 17:54

I have been trying to figure out how to use VueJS, Axios and Python together. I can make a post request to the python file just fine. When I click the submit button, the response data shows correctly, but only for a second and then disappears. Why is this?

insert.py

#!/usr/bin/python3.6 import os import sys import json parsed_json = json.loads(sys.stdin.read()) print ("Content-type: text/html\n") print(parsed_json['firstName']) print(parsed_json['lastName'])

index.html

<!DOCTYPE html> <html lang="en"> <head> <title>index.html</title> </head> <body> <form id="example-1"> <input type="text" ref="firstName"> <input type="text" ref="lastName"> <button v-on:click="submit">Submit</button> {{ output }} </form> <script src="https://unpkg.com/vue@2.4.2/dist/vue.js"></script> <script src="https://unpkg.com/axios/dist/axios.min.js"></script> <script> var example1 = new Vue({ el: '#example-1', data: { output: '' }, methods: { submit: function () { axios.post('/cgi-bin/insert.py', { firstName: this.$refs.firstName.value, lastName: this.$refs.lastName.value }) .then(response => { this.output = response.data; }) .catch(function (error) { console.log(error); }); } } }) </script> </body> </html>
Categories: Software

Vue.js: No image displayed when binding data URI to src attribute of img element

Thu, 2017-09-07 17:29

I'm passing a data URI as a prop to a Vue component and binding it to the src attribute of an img element, but the image does not appear. Here's the relevant code:

Passing the prop to the component (ignore the image_ratio key name, it's a data URI):

<media-image v-if="event.media_type === 'image'" :url="event.media_url" :caption="event.media_caption" :imageUri="event.image_ratio"></media-image>

Accepting the prop within the component:

props: [ 'url', 'caption', 'imageUri' ],

And using binding the src to the prop:

<img :src="imageUri" :data-src="url" class="img-fluid" :id="imageId" :alt="caption">

Other relevant info:

  • The prop is successfully being passed to the component (it appears as a prop using vue-devtools).
  • The data URI appears in the DOM as the src of the img element when inspecting it using DevTools.
  • Copying the data URI and using it as the src of an img element outside of a Vue component works fine.

Thanks!

Categories: Software

When I change router-link not working jquery plugins, but when I refresh it's working

Thu, 2017-09-07 15:46

I have SPA with Laravel and I have main.js file and I set up this file in my main.blade.php file and I write some code in main.js with jquery plugins. Problem is when I change vue-router not working this plugins so main.js file, but when I refresh page everything is fine working.Any idea?

Categories: Software

VUE : state variable undefined when accessing it in data() section through computed mapGetters()

Thu, 2017-09-07 15:42

I've been using ...mapGetters a lot in my solution with success, but now that i need to access the variable directly in the data() section, it seems that the variable isn't set/ready when accessed..

the mapGetters are in the computed:{} section..

When debugging i notice that data() runs before computed:, so.. do i need to put a watch in some way here ?

Code :

data(){ return { FiltersVisible: false, orderList: { currentPage: 1, totalPages: ordersCount / 20, // totalPages:80, itemsPerPage: 20 } } }, computed: { ...mapGetters(['orders', 'ordersCount']) // ...mapGetters(['orders']) },

Screenshot of Vue state (Chrome)

Notice that the getters are initialized correctly....

enter image description here

Categories: Software

Vuex - passing multiple parameters to action

Thu, 2017-09-07 15:29

I am trying to authenticate a user using vuejs and laravel's passport.

I am not able to figure out how to send multiple parameters to the vuex mutation via an action.

- store -

export default new Vuex.Store({ state: { isAuth: !!localStorage.getItem('token') }, getters: { isLoggedIn(state) { return state.isAuth } }, mutations: { authenticate(token, expiration) { localStorage.setItem('token', token) localStorage.setItem('expiration', expiration) } }, actions: { authenticate: ({ commit }, token, expiration) => commit('authenticate', token, expiration) } })

- login method -

login() { var data = { client_id: 2, client_secret: '**************************', grant_type: 'password', username: this.email, password: this.password } // send data this.$http.post('oauth/token', data) .then(response => { // this part is not working this.$store.dispatch({ type: 'authenticate', token: response.body.access_token, expiration: response.body.expires_in + Date.now() }) }) }



I would be very thankful for any kind of help!

Categories: Software

npm ERR! Unexpected end of JSON input

Thu, 2017-09-07 15:22

I have a project with vuejs on frontend and after I did merge with another branch from a colleague I tried to install a module but I got this error:

npm ERR! Unexpected end of JSON input

The project works fine, but the problem is that I can't use npm install or update, etc. I have no idea in what file is the error. I tried

npm cache clean --force

but still the same error.

This is the whole error from debug.log

0 info it worked if it ends with ok 1 verbose cli [ 'C:\Program Files\nodejs\node.exe', 1 verbose cli 'C:\Program Files\nodejs\node_modules\npm\bin\npm-cli.js', 1 verbose cli 'i' ] 2 info using npm@5.0.3 3 info using node@v8.1.4 4 verbose npm-session 2706d6ef334eddd9 5 silly install runPreinstallTopLevelLifecycles 6 silly preinstall company@1.0.0 7 info lifecycle company@1.0.0preinstall: company@1.0.0 8 silly lifecycle company@1.0.0preinstall: no script for preinstall, continuing 9 silly install loadCurrentTree 10 silly install readLocalPackageData 11 silly install loadIdealTree 12 silly install cloneCurrentTreeToIdealTree 13 silly install loadShrinkwrap 14 verbose stack SyntaxError: Unexpected end of JSON input 14 verbose stack at JSON.parse () 14 verbose stack at module.exports (C:\Program Files\nodejs\node_modules\npm\lib\utils\parse-json.js:3:15) 14 verbose stack at BB.join (C:\Program Files\nodejs\node_modules\npm\lib\install\read-shrinkwrap.js:31:20) 14 verbose stack at tryCatcher (C:\Program Files\nodejs\node_modules\npm\node_modules\bluebird\js\release\util.js:16:23) 14 verbose stack at Holder$3._callFunction (eval at generateHolderClass (C:\Program Files\nodejs\node_modules\npm\node_modules\bluebird\js\release\join.js:92:16), :14:44) 14 verbose stack at Holder$3.checkFulfillment (eval at generateHolderClass (C:\Program Files\nodejs\node_modules\npm\node_modules\bluebird\js\release\join.js:92:16), :29:30) 14 verbose stack at Promise.eval (eval at thenCallback (C:\Program Files\nodejs\node_modules\npm\node_modules\bluebird\js\release\join.js:14:16), :6:20) 14 verbose stack at Promise._settlePromise (C:\Program Files\nodejs\node_modules\npm\node_modules\bluebird\js\release\promise.js:566:21) 14 verbose stack at Promise._settlePromise0 (C:\Program Files\nodejs\node_modules\npm\node_modules\bluebird\js\release\promise.js:614:10) 14 verbose stack at Promise._settlePromises (C:\Program Files\nodejs\node_modules\npm\node_modules\bluebird\js\release\promise.js:693:18) 14 verbose stack at Promise._fulfill (C:\Program Files\nodejs\node_modules\npm\node_modules\bluebird\js\release\promise.js:638:18) 14 verbose stack at Promise._settlePromise (C:\Program Files\nodejs\node_modules\npm\node_modules\bluebird\js\release\promise.js:582:21) 14 verbose stack at Promise._settlePromise0 (C:\Program Files\nodejs\node_modules\npm\node_modules\bluebird\js\release\promise.js:614:10) 14 verbose stack at Promise._settlePromises (C:\Program Files\nodejs\node_modules\npm\node_modules\bluebird\js\release\promise.js:693:18) 14 verbose stack at Promise._fulfill (C:\Program Files\nodejs\node_modules\npm\node_modules\bluebird\js\release\promise.js:638:18) 14 verbose stack at C:\Program Files\nodejs\node_modules\npm\node_modules\bluebird\js\release\nodeback.js:42:21 15 verbose cwd C:\EasyDoSecureAccess 16 verbose Windows_NT 10.0.10586 17 verbose argv "C:\Program Files\nodejs\node.exe" "C:\Program Files\nodejs\node_modules\npm\bin\npm-cli.js" "i" 18 verbose node v8.1.4 19 verbose npm v5.0.3 20 error Unexpected end of JSON input 21 verbose exit [ 1, true ]
Categories: Software

Phonegap Vue js Android uploading CAMERA image to API server

Thu, 2017-09-07 14:58

I'm trying to upload picture taken by Android Camera (cordova-plugin-camera). My code for that is

takePicture () { navigator.camera.getPicture(result => { this.newUnit.addedPic = true this.newUnit.image = result }, error => { alert(error); }, { sourceType : Camera.PictureSourceType.CAMERA, destinationType: Camera.DestinationType.FILE_URI, encodingType: Camera.EncodingType.JPEG, }); },

In my this.newUnit.addedPic I got the path like:

file:///storage/emulated/0/Android/data/.../1234.jpg

How can I use it to upload the picture to server from mobile app? In my web part I use FormData to upload the picture.

I was trying to do it by FileTransfer but I get error code 1:

let win = r => {alert(`win`)} let fail = error => { alert("An error has occurred: Code = " + error.code); console.log("upload error source " + error.source); console.log("upload error target " + error.target); } var options = new FileUploadOptions(); options.fileKey = "file"; options.fileName = this.newUnit.image.substr(this.newUnit.image.lastIndexOf('/') + 1); options.mimeType = "image/jpeg"; var params = {}; params.name = "test"; params.creator = 3; options.params = params; var ft = new FileTransfer(); ft.upload(this.newUnit.image, encodeURI("http://myserver/api/v0/units/"), win, fail, options);
Categories: Software

How can I watch synchronously a state change in vuex?

Thu, 2017-09-07 14:23

I am using an opensource vuejs + vuex project and this is the source https://github.com/misterGF/CoPilot/tree/master/src/components

I am currently having problems knowing how to trigger an event from one components to another.

I can use this.$state.store.commit("foo", "bar") to store information in vuex, but when two seperate have two difference export default {} I don't know how I can make the app aware whenever "foo" is for exampled changed to "baz" ... unless I refresh/reload the app, there is no way for me to know the changes

Categories: Software

VueJS: Replace/Update Array

Thu, 2017-09-07 14:08

I currently have an array of object that I am rendering to a table. I am trying to follow the examples provided by Vuejs to use a "single source of truth" shared between multiple vues on the same page.

Overall, I am trying to make it where when vue1.refresh() is triggered, all the vues update their data when the "single source of truth" is updated. However, self.surveys = surveys; only updates the data on vue1.

// The single source of truth var cache = { data: [{...}] // Array of objects } var vue1 = new Vue({ el: "#table", data: { surveys: cache.data // Points to the single source of truth }, methods: { refresh: function(){ var self = this; // After getting data back from an ajax call .done(function(surveys) { self.surveys = surveys; }); }, } }); var vue2 = new Vue({ el: "#table", data: { surveys: cache.data // Points to the single source of truth }, methods: { // Methods } });
Categories: Software

Vue.js rounds string output from toFixed?

Thu, 2017-09-07 13:30

I have a review that be an int or possible have a decimal. If it is an int I need to display it as 8.0 instead of 8.

Currently my computed method to achieve this looks like this:

reviewAverage() { return Number(this.hotel.cra_average).toFixed(1); }

This works fine and when I check my Vue devtools I get this when I am dealing with an int of 8:

reviewAverage:"8.0"

Whenever I output the value in my template:

<div class="review">{{ reviewAverage }}</div>

I am back to simply seeing 8.

So my computed property works fine but it seems the template resets my string to an int(wtf)?

Is this even possible or is something else going on here?

Categories: Software

How to reset a prop value to it's original value in Vuejs

Thu, 2017-09-07 13:30

I have a vue component which posts data from a form and it's working fine, however, I need to reset the 'selected' prop to an empty value after submitting the form, how can I do that? Here's the blade.php file :

<form action="{{ url('/cart') }}" method="POST" class="side-by-side reset"> {{ csrf_field() }} {{-- form for my super not working with options vue component --}} <input type="hidden" name="id" v-model="this.id" value="{{ $product->id }}"> <input type="hidden" name="name" v-model="this.name" value="{{ $product->name }}"> <input type="hidden" name="price" v-model="this.price" value="{{ $product->price }}"> @if( ! $product->group->options->isEmpty() ) <select name="options" class="options" v-model="selected" autofocus required> <option value="">Please select one</option> @foreach($product->group->options as $option) <option class="reset" value="{{ $option->name }}">{{ $option->name }}</option> @endforeach </select> @endif <addToCart :product="{{ $product }}" :selected="selected" @submit.prevent="onSubmit()"></addToCart>

here's my vue file :

export default { props: ['product', 'selected'], data() { return { id: this.product.id, quantity: 1, name: this.product.name, price: this.product.price, options: this.selected } }, watch: { selected: function() { return this.options = this.selected; //this is initially empty, I want to reset it after form submits } }, methods: { addtocart() { axios.post('/cart/', this.$data) .then(flash(this.product.name + ' was added to cart')) .then( this.resetForm()); },

I need to reset the selected prop to it's original empty value, but I get errors, Vuejs doesn't let me modify the prop value directly and I can't figure out how to reset it. Thanks for your help.

Categories: Software

Using props to set different text on every page in vue.js

Thu, 2017-09-07 13:16

I am using laravel + vue. I want to do title of page in navbar, so when you are in index, in navbar is text index. When you are in settings, navbar says settings etc.

I think props is good for it, but when I use that, it works not good. Look here:

blade.php of index:

@extends('layout.app') @section('content') <index :msg="msg"></index> @endsection

index.vue:

props: [ 'msg' ],

Now navbar:

<template> <nav class="navbar"> <a></a> <p>{{msg}}</p> </nav> </template> <script> export default { props: [ ], data() { return { } }, } </script>

and layout:

<body> <div id="app"> <navbar></navbar> @yield('content') </div> </body>

How I can change that {{msg}} paragraph in navbar when we are on different pages? My code doesn't work.

[Vue warn]: Property or method "msg" is not defined on the instance but referenced during render. Make sure to declare reactive data properties in the data option.
Categories: Software

Vue.js 2 + Native PHP - what is the right way to keep user in session?

Thu, 2017-09-07 13:11

I have created a small application using Vue.js 2, Axios, native PHP 7.1 (without using php frameworks e.t.c.), MySQL.

I have a login and registration modal windows and some native crud operations with data in my datatable.

I am using Axios to send get/post requests to manage this table and access the database data. This is my login example in Vue:

var loginModal= new Vue ({ el: '#login-modal', data: { ... errors: [], ... userLogin: {action: "", usernameOrEmail: "", password: ""}, ... }, methods: { login: function () { loginModal.userLogin.action = "login"; axios.post("../../route/route.php", JSON.stringify(loginModal.userLogin)) .then(function (response) { loginModal.clearUserLogin(); if (response.data !== "") { console.log(response); if (response.data.error) { loginModal.errors = JSON.parse(response.data.error); } else if (response.data.userId) { header.authenticated = true; loginModal.sessionUserId = response.data.userId; loginModal.modalSuccessMessage = "Success login! Greetings!"; groupManagerModule.sessionUser.userId = response.data.userId; } else { loginModal.modalErrorMessage = "Undefined login error occurs. Try again later."; } } }); },

If login is successfull - I am storing some user id in PHP session:

class LoginController { public static function postLogin() { session_start(); $userDao = New UserDaoImpl(); $errorList = array(); $user = FormValidator::validateLogin($errorList, $userDao); if (!empty($errorList)) { $_SESSION['errorList'] = $errorList; echo json_encode(array('error' => json_encode(array_values($errorList)))); } else { $_SESSION['user'] = $user->getId(); echo json_encode(array('userId' => $user->getId())); } }

... Everything is working fine. If user is logged in - he can manage some information in this table.

But I am trying to find some right and secure solution to keep user in session even after the browser is closed and I am not sure that my variant is correct (I have begined to create a cookie signs), and after new opening the user must to be in the session and could moderate data.

Question:

What is the best practice for this? (Secure and right way) (cookies, Database token, e.t.c. ?)

(I am newbie in PHP and Vue, sorry for possible dublicate, Thanks!)

Categories: Software

materialize modal popup auto initialize not working in vue js

Thu, 2017-09-07 12:50

Materialize modal popup is working properly in onclick functions, but not working in mounted() or created()

testingmodel:function(){ $('#firstlogintour').modal('open'); } mounted() { this.testingmodel(); },

enter image description here

Categories: Software

Do a select list in Vuejs/laravel and databse/axios

Thu, 2017-09-07 12:41

I'm currently working on Laravel & Vuejs. I would like to create a select using values from my database: When I select "france" it's supposed to only users from this country.

My users' information shows correctly but it does not react to changes within the select.

my blade.php

<div id ="app"> <select v-model="selected"> <option value="">Country</option> <option value="usa">USA</option> <option value="france">france</option> <option value="uk">United Kingdom</option> <option value="sweden">Sweden</option> </select> <ul> <li v-for="application in applicationsFiltered">@{{ application }}</li> </ul> <apps></apps> </div>

my app.js

Vue.component('apps',{ template : ` <table class="users"> <thead> <tr> <th>id</th> <th>OfficialName</th> <th>Country</th> </tr> </thead> <tbody> <tr v-for="app in apps"> <th>{{ app.id }}</th> <th>{{ app.OfficialName }}</th> <th>{{ app.Country }}</th> </tr> </tbody> </table> `, data: function() { return { users: [] } }, created: function() { this.getApps(); }, methods: { getUsers: function(){ axios.get("/users").then((response) => {this.users = response.data}) } }, }), new Vue({ el: '#app', data() { return { selected: '', } }, });

I'm new in Vuejs and I don't know how to do my select list / my methods. Do you have any ideas ? :)

Thank you.

Categories: Software

Pages