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>
Using v-bind for Dynamic Attributes If you need a dynamic value in an attribute, you need to prefix the attribute with v-bind: . And then, inside the attribute, just use the variable name.
To make the component dynamic, we can bind it to a set property with the v-bind directive. Your component is now bound with the component property in the data. If you switch the component to Test2 , it will automatically mount the Test 2 component. Test it out on your browser.
$v is an object that calls vuelidate (at the time of writing the comment, supported in version Vue. js 2.0), which is intended to check every input, which is made in a non-html form.
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>
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
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
Each divs have a input tag and change the value when the user input value
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;
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With