Я пытаюсь реализовать это решение для выделения текста в текстовой области для моего веб-приложения.Это зависит от Jquery, но я создаю приложение ReactJS, поэтому не могу сделать копию, похожую на аналогичную.
Я посмотрел некоторые пакеты там, но не совсем соответствую моим требованиям, так как мне нужно выделить две категории слов (хороший и плохой), и все пакеты, которые я могу найти, будут толькоПозволяет выделить одну категорию.
Когда пользователь заполняет компонент textarea
, API анализирует текст и возвращает 10 лучших слов и 10 худших слов.Я дошел до того, что мое выделение работает, однако, когда текстовая область прокручивается, я не могу заставить одновременно прокручивать <div>
за ней.
Компонент, которым я пытаюсь манипулироватьв настоящее время выглядит так:
<div className="textarea-container">
<div className="backdrop" ref={this.hightlightsRef} scrollTop ={this.state.scrollTop} >
<div className="highlights" dangerouslySetInnerHTML={this.highlightText()} ></div>
</div>
<textarea
className="form-control text-area"
name="textArea"
id="textAreaInput"
value = {this.state.textArea}
onChange={this.handleInput}
onScroll={this.handleScroll}
>
</textarea>
</div>
В настоящее время я передаю позицию прокрутки в состояние и хочу как-то передать ее компоненту div.
highlightText = () => {
if (this.state.bestWords.length && this.state.worstWords.length) {
let bestWordsRegEx = new RegExp('\\b(' + this.state.bestWords.join("|") + ')\\S*\\b','gi')
let worstWordsRegEx = new RegExp('\\b(' + this.state.worstWords.join("|") + ')\\S*\\b','gi')
let text = this.state.textArea
.replace(/\n$/g, '\n\n')
.replace(bestWordsRegEx, w => {return `<mark class="good">${w}</mark>`})
.replace(worstWordsRegEx, w => {return `<mark class="bad">${w}</mark>`});
return {__html: text};
}
};
handleInput = e => {
this.setState({jobDescription: e.target.value})
}
handleScroll = e => {
this.setState({scrollTop: e.target.scrollTop})
}
PSЯ знаю, что dangourouslySetInnerHTML
определенно не лучшая практика.Это не предмет этого вопроса, но хотелось бы получить идеи о том, как сделать эту работу лучше.