How to add dynamically attribute in VueJs

Javascriptvue.jsDynamicVue Component

Javascript Problem Overview


I'm using vuejs and I wanna know how to have control on inputs (add disabled attribute when necessary). Is there any way to add dynamically attribute in vuejs ? Below my Textfield component :

    <template>
     <input type="text" placeholder="{{ placeholder }}" v-model="value">
    </template>
    <script>
    export default  {
      props: {
       disabled: {type: Boolean, default: false},
       placeholder: {type: String, default: ""},
       value: {twoWay: true, default: ""}
      }
     }
    </script>

Usage :

<textfield placeholder="Name" value.sync="el.name" :disabled="true"></textfield>

Javascript Solutions


Solution 1 - Javascript

You can bind it to a variable using v-bind:disabled="foo" or :disabled="foo" for short:

<textfield label="Name" value.sync="el.name" :disabled="myVar">

Then in Vue you can just set this.myVar = true and it will disable the input.

Edit: add this to your template:

<template>
  <input type="text" :disabled="disabled" :placeholder="placeholder" v-model="value">
</template>

Solution 2 - Javascript

As pointed out, you don't need dynamic attributes in your case.

But well, you asked if it is possible, and the answer is yes. You can have dynamic attributes, as of 2.6.0.

Example:

<a v-bind:[attributeName]="whatever">

It is documented here

Solution 3 - Javascript

I am trying to figure out how to set the attribute of the html tags from the array value dynamically when using the Vue v-for loop.

What I am going to show:

Example

  1. There are 3 div elements with different background colors from array value(not static).
  2. Each divs have a input tag and change the value when the user input value
  • The first div's input converts lowercase to uppercase.

  • second represents the mood, if enter 'happy', present 'good'. if enter 'sad', output 'bad'

  • The third div input doubles the input value.

    {{ box.outputData }}

     new Vue({
      el: "#app",
       data: {
         isRounded: false,
           boxes: [
             {
               inputData: "",
               outputData: "",
               color: "green",
               operation: "uppercase"
             },
             {
               inputData: "",
               outputData: "",
               color: "red",
               operation: "feeling"
             },
             {
               inputData: "",
               outputData: "",
               color: "blue",
               operation: "multiple"
             }
           ],
           feeling: {
             good: ["happy", "joyful", "calm"],
             bad: ["sad", "mad", "depressed"]
           }
       },
       methods: {
       	toggle: function(todo){
         	todo.done = !todo.done
         }
       },
       watch: {
         boxes: {
           deep: true,
           immediate: true,
           handler: function(val) {
             this.boxes.map(box => {
               if (box.operation === "uppercase")
                 box.outputData = box.inputData.toUpperCase();
               else if (box.operation === "feeling") {
                 box.outputData = this.feeling.good.includes(box.inputData)
                   ? "GOOD"
                   : this.feeling.bad.includes(box.inputData)
                   ? "BAD"
                   : "";
               } else if (box.operation === "multiple") {
                 if (box.inputData == "") box.outputData = "";
                 else box.outputData = parseInt(box.inputData) * 2;
               }
             });
           }
         }
       },
       mounted() {
         for (var i = 0; i < this.numBox; i++) {
           this.boxValue[i] = "";
           this.bxData[i] = "";
         }
       },
     })
    
    
    
     .clearfix{
      clear: both;
     }
     .full-width{
       width:100%;
     }
     input {
       background: transparent;
       text-decoration: underline;
       color: white;
       border: none;
       text-align: center;
       font-size:30px;
     }
     .box {
       float:left;
       color: white;
       width: 24%;
       margin-right: 1%;
       padding: 20px;
       background: blue;
       height: 100px;
     }
     .box-output {
       width: 100%;
       text-align: center;
       font-size:30px;
     }
     .box-rounded {
       border-radius: 50px;
     }
    

Solution 4 - Javascript

base one condition we can define or change attributes in vue

Please refer official document for the same https://vuejs.org/v2/guide/syntax.html#Attributes

Solution 5 - Javascript

ok, try this if you are passing i18 - **

:placeholder="$t('languagePlaceholder')"

**

Solution 6 - Javascript

I did that with checkboxes:

 <select id="newTwootType" v-model="state.selectedTwootType">
      <option 
      :value="option.value" 
      v-for="(option, index) in state.twootTypes" 
      :key="index">
        {{ option.name }}
      </option>
    </select>

my scripts

export default {
name: 'CreateNewTwootPanel',
setup(props, ctx) {
  const state = reactive({  
      selectedTwootType: 'instant',
      twootTypes: [
          { value: 'draft', name: 'Draft' },
          { value: 'instant', name: 'Instant Twoot' }
      ],
  })

  return {
    state,
    }
  }
}

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionMaria MinhView Question on Stackoverflow
Solution 1 - JavascriptJeffView Answer on Stackoverflow
Solution 2 - Javascriptrosell.dkView Answer on Stackoverflow
Solution 3 - JavascriptBlack HorseView Answer on Stackoverflow
Solution 4 - JavascriptPankaj RupaparaView Answer on Stackoverflow
Solution 5 - JavascriptYogesh WaghmareView Answer on Stackoverflow
Solution 6 - JavascriptCyebukayireView Answer on Stackoverflow