To make good looking Vue apps, we need to style our components. To make our lives easier, we can use components with styles built-in.
In this article, we’ll look at how to add text input boxes.
Text Inputs
We can create inputs with text or other values with text, password, number, url, email, search, range, date and more.
For instance, we can add one with the b-form-input component by writing:
<template>
<div id="app">
<b-form-input v-model="text" placeholder="Enter your name"></b-form-input>
<div>{{ text }}</div>
</div>
</template>
<script>
export default {
data() {
return {
text: ""
};
}
};
</script>
v-model binds the text state to the inputted value.
Then we display the text value below it.
When we type something, we’ll see it displayed below it.
Input Types
We can set it to different types.
We can set the type prop to the following values:
textpasswordnumberurlemailsearchrangedatecolor
For instance, we can write:
<template>
<div id="app">
<b-form-input v-model="color" placeholder="Enter color" type="color"></b-form-input>
<div>{{ color }}</div>
</div>
</template>
<script>
export default {
data() {
return {
color: ""
};
}
};
</script>
Then we click the input box, we see a native color picker where we can choose the color. After we pick the color, it’ll be displayed.
v-model.lazy isn’t supported by b-form-input. Instead, we should use the lazy prop for lazy evaluation.
date and time are native browser types. They aren’t customizable date pickers.
Range Type Input
We can set the type prop to range to get a slider.
For instance, we can write:
<template>
<div id="app">
<b-form-input v-model="value" type="range" min="0" max="5"></b-form-input>
<div>Value: {{ value }}</div>
</div>
</template>
<script>
export default {
data() {
return {
value: 0
};
}
};
</script>
to get a slider.
When we slide it then value is updated because of the v-model directive. We can set the steps prop to change the increment or decrement value when we slide.
For example, we can write:
<template>
<div id="app">
<b-form-input v-model="value" type="range" step="0.5" min="0" max="5"></b-form-input>
<div>Value: {{ value }}</div>
</div>
</template>
<script>
export default {
data() {
return {
value: 0
};
}
};
</script>
Control Sizing
We can change the sizing of the controls with the size prop. The value can be sm or lg.
For instance, we can write:
<template>
<div id="app">
<b-form-input size="sm" placeholder="enter your name"></b-form-input>
</div>
</template>
<script>
export default {};
</script>
Then we get an extra small input box.
Validation States
We can display green if the input value is valid. Otherwise, we can display red.
We can write:
<template>
<div id="app">
<b-form-input :state="valid" v-model="name" placeholder="name"></b-form-input>
</div>
</template>
<script>
export default {
computed: {
valid() {
return this.name.length > 0;
}
},
data() {
return {
name: ""
};
}
};
</script>
to display a red border when the input value is empty.
Otherwise, we display a green border. The state prop is the validation state.
Formatter
We can add a formatted function to format the input value the way we want.
For instance, we can write:
<template>
<div id="app">
<b-form-input :formatter="formatter" v-model="value" placeholder="enter some text"></b-form-input>
<p>{{value}}</p>
</div>
</template>
<script>
export default {
data() {
return {
value: ""
};
},
methods: {
formatter(value) {
return value.toLowerCase();
}
}
};
</script>
We added the formatter prop set to the formatter function. Inside it, we return the value state converted to lower case.
Then when we enter upper case text, it’ll be converted to lower case.
Read-Only Input
We can make the input read-only with the readonly prop.
Disabling Mouse Wheel Events on Numeric-Like Inputs
The no-wheel prop can be set to true to disable mouse wheel events on these inputs.
Datalist
We can add an autocomplete list with the datalist element.
For instance, we can write:
<template>
<div id="app">
<b-form-input list="fruits" name="fruit"></b-form-input>
<datalist id="fruits">
<option>apple</option>
<option>orange</option>
<option>grape</option>
</datalist>
</div>
</template>
<script>
export default {};
</script>
The list attribute of the b-form-input component and the id has to be the same.
Debounce
We can add a debounce prop to delay the registering of the input value.
So we can add:
<b-form-input v-model="value" type="text" debounce="500"></b-form-input>
Conclusion
We can add many kinds of text inputs with the b-form-input component.
The value can be formatted and delayed.