React div 實現一個 textarea

敖天羽發表於2018-05-13

原文:codesky.me/archives/re…

用掘金刊登雖然分流了但是主要是!現在分享的曝光率實在太低了!!所以…………↑支援的請點下原博收藏下關注下以及我的微博。

看到標題,老爺們肯定不滿意,切,用 div 實現一個 textarea 有啥難度,不就是 contenteditable 嗎?

看到 React,又要多加一句:切,跟用什麼庫有什麼關係。實際上在使用的時候,我還是遇到了一點微小的麻煩。

全選

在 textarea 中,全選只需要使用 element.select() 就可以,它的作用是:

The HTMLInputElement.select() method selects all the text in a <textarea> element or an <input> element with a text field.

然而在 div 中,沒有這樣的函式,所以需要自己劃定範圍並且選中:

const selection = window.getSelection()
const range = document.createRange()
range.selectNodeContents(this.textInput) // DOM
selection.removeAllRanges()
selection.addRange(range)
複製程式碼

純文字的切換

textarea 中,所有內容都會變成文字,但是在 div 中,我們很容易受到轉義的影響。

儘管 user-modify: read-write-plaintext-only; 這個可以免於標籤注入的煩惱,但是依舊會遇到換行的問題,換行操作在 div 中是 <br />,對於文字來說是 \n,於是,我們還需要在轉換時做一遍替代:

this.initInput = input.replace(/\n/g, '<br />')
複製程式碼

無警告渲染的方式

在 React 中,如果你用 div 取代輸入,會有一個 warning 警告,雖然不影響使用,但是 warning 總是讓人渾身難受,這種時候以下兩個屬性可以避免這個煩惱:

suppressContentEditableWarning={true}
dangerouslySetInnerHTML={{ __html: this.initInput }}
複製程式碼

剩下的都不是什麼大問題,相信大家是能搞定的!

相關文章