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)