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:
text
password
number
url
email
search
range
date
color
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.