用掘金刊登雖然分流了但是主要是!現在分享的曝光率實在太低了!!所以…………↑支援的請點下原博收藏下關注下以及我的微博。
看到標題,老爺們肯定不滿意,切,用 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 }}
複製程式碼
剩下的都不是什麼大問題,相信大家是能搞定的!