Renders a textarea component with a word limit.
- Use the
React.useState()hook to create thecontentandwordCountstate variables and set their values tovalueand0respectively. - Create a method
setFormattedContent, which usesString.prototype.split(' ')to turn the input into an array of words and check if the result of applyingArray.prototype.filter(Boolean)has alengthlonger thanlimit. - If the afforementioned
lengthexceeds thelimit, trim the input, otherwise return the raw input, updatingcontentandwordCountaccordingly in both cases. - Use the
React.useEffect()hook to call thesetFormattedContentmethod on the value of thecontentstate variable. - Use a
<div>to wrap both the<textarea>and the<p>element that displays the character count and bind theonChangeevent of the<textarea>to callsetFormattedContentwith the value ofevent.target.value.
代码实现
function LimitedWordTextarea({ rows, cols, value, limit }) {
const [content, setContent] = React.useState(value);
const [wordCount, setWordCount] = React.useState(0);
const setFormattedContent = text => {
let words = text.split(' ');
if (words.filter(Boolean).length > limit) {
setContent(
text
.split(' ')
.slice(0, limit)
.join(' ')
);
setWordCount(limit);
} else {
setContent(text);
setWordCount(words.filter(Boolean).length);
}
};
React.useEffect(() => {
setFormattedContent(content);
}, []);
return (
<div>
<textarea
rows={rows}
cols={cols}
onChange={event => setFormattedContent(event.target.value)}
value={content}
/>
<p>
{wordCount}/{limit}
</p>
</div>
);
}
使用样例
ReactDOM.render(
<LimitedWordTextarea limit={5} value="Hello there!" />,
document.getElementById('root')
);