Hello fellow readers!
In this article I am going to show you how to build a simple char counter component that can be used anywhere, for example on a simple text input or even a text area!
The final result is the following:
The char counter component
Let's start with this simple component. This is going to be a stateless component that just receives the current count and the total count.
type CharCountProps = {
current: number;
total: number;
};
const CharCount = ({ current, total }: CharCountProps) => {
return (
<span style={{ color: current > total ? 'red' : 'black' }}>
{`${current}/${total}`}
</span>
);
};
As you can see, I also applied a color
style to change the text to red if the current count is greater than the total.
Now let's apply this component to a text input!
Applying to a text input
We are now creating the text input that will hold the CharCount
component.
To make it flexible, this custom input has a maxLength
prop that tells us how many characters are allowed.
Also, our CharCount
component is only going to render if this prop is different from undefined
.
Note below that the input onChange
handler updates the value
state, which length
property is used on CharCount
.
type CustomInputProps = {
maxLength?: number;
};
const CustomInput = ({ maxLength }: CustomInputProps) => {
// This state holds the input's text
const [value, setValue] = useState<string>('');
return (
<fieldset>
{/* Here is our input that is being watched */}
<input
type="text"
value={value}
onChange={(e) => setValue(e.currentTarget.value)}
/>
{/* The char counter only renders if the maxLength prop is provided */}
{maxLength !== undefined && (
/* The CharCount component receives the current string length and the max length supported for this field */
<CharCount current={value.length} total={maxLength} />
)}
</fieldset>
);
};
Wrapping up
Lets now just create a CustomInput
with a defined maxLength
:
export default function App() {
return <CustomInput maxLength={10} />;
}
This renders an input with a char counter validation! You may now add some behavior, like alerting the user that the input content cannot be greater than the expected.
Here we used a simple useState
hook to hold our input's data and pass it further to the CharCount
stateless component.
You may find the complete code clicking here.
That's it for now! I hope you all enjoyed it!
Feel free to use the comment section below to share your ideas!
Top comments (0)