簡介
Ace是一個用JavaScript編寫的可嵌入代碼編輯器憎茂。它與Sublime,Vim和TextMate等本機編輯器的功能和性能相匹配。它可以輕松地嵌入任何網(wǎng)頁和JavaScript應用程序中筋帖,React-Ace是Ace 的react 封裝版本迅耘,使用簡單贱枣,方便配合form表單使用。
安裝
npm install react-ace ace-builds
或者
yarn add react-ace ace-builds
業(yè)務(wù)背景
需要在前端頁面實現(xiàn)sql和javascript配置颤专,后臺解析纽哥,計算結(jié)果,(結(jié)算引擎)
react-ace 編輯器屬性
Prop | Default | Type | Description |
---|---|---|---|
name | 'ace-editor' | String | 用于編輯器的唯一ID |
mode | '' | String | 解析和代碼突出顯示的語言 |
splits | 2 | Number | 視圖拆分 |
orientation | 'beside' | String | 拆分的方向在旁邊還是在下面 |
theme | '' | String | 使用的主題 |
value | '' | Array of Strings | 設(shè)置值 |
defaultValue | '' | Array of Strings | 每個編輯器的默認值 |
height | '500px' | String | 高度的CSS值 |
width | '500px' | String | 寬度的CSS值 |
className | String | 自定義類名 | |
fontSize | 12 | Number | 字體大小的像素值 |
showGutter | true | Boolean | 顯示槽 |
showPrintMargin | true | Boolean | 顯示打印邊距 |
highlightActiveLine | true | Boolean | 突出顯示活動行 |
focus | false | Boolean | 是否聚焦 |
cursorStart | 1 | Number | 光標的位置 |
wrapEnabled | false | Boolean | 包裝線 |
readOnly | false | Boolean | 使編輯器為只讀 |
minLines | Number | 顯示的最小行數(shù) | |
maxLines | Number | 顯示的最大行數(shù) | |
enableBasicAutocompletion | false | Boolean | 啟用基本自動補全 |
enableLiveAutocompletion | false | Boolean | 啟用實時自動補全 |
enableSnippets | false | Boolean | 啟用摘要 |
tabSize | 4 | Number | tab空格值 |
debounceChangePeriod | null | Number | onChange事件的抖動延遲時間 |
onLoad | Function | 在編輯器加載時調(diào)用栖秕。第一個參數(shù)是編輯器的實例 | |
onBeforeLoad | Function | 在編輯器加載之前調(diào)用春塌。第一個參數(shù)是的實例ace | |
onChange | Function | 發(fā)生在文檔更改上,它具有2個參數(shù)簇捍,每個編輯器的值和事件 | |
onCopy | Function | 由編輯器copy事件觸發(fā)只壳,并將文本作為參數(shù)傳遞 | |
onPaste | Function | 由編輯器paste事件觸發(fā),并將文本作為參數(shù)傳遞 | |
onSelectionChange | Function | 由編輯器selectionChange事件觸發(fā)暑塑,并且將Selection作為第一個參數(shù)傳遞吼句,并將事件作為第二個參數(shù)傳遞 | |
onCursorChange | Function | 由編輯器changeCursor事件觸發(fā),并且將Selection作為第一個參數(shù)傳遞事格,并將事件作為第二個參數(shù)傳遞 | |
onFocus | Function | 由編輯器focus事件觸發(fā) | |
onBlur | Function | 由編輯器blur事件觸發(fā) | |
onInput | Function | 由編輯器input事件觸發(fā) | |
onScroll | Function | 由編輯器scroll事件觸發(fā) | |
editorProps | Object | 可直接應用于Ace編輯器實例的屬性 | |
setOptions | Object | 直接應用于Ace編輯器實例的選項 | |
keyboardHandler | String | 對應于要設(shè)置的綁定模式(例如vim或emacs) | |
commands | Array | 新命令添加到編輯器 | |
annotations | Array of Arrays | 要在編輯器中[{ row: 0, column: 2, type: ‘error’, text: ‘Some error.’}]顯示的注釋惕艳,即在裝訂線中顯示 | |
markers | Array of Arrays | 要在編輯器中顯示的標記搞隐,即[{ startRow: 0, startCol: 2, endRow: 1, endCol: 20, className: ‘error-marker’, type: ‘background’ }] | |
style | Object | 駝峰屬性 |
編輯器mode選項
編輯器theme選項
使用注意項
首先在全局或者react組件中引入mode和theme
// 引入對應的mode
import 'ace-builds/src-noconflict/mode-javascript'
// 引入對應的theme
import 'ace-builds/src-noconflict/theme-xcode'
// 如果要有代碼提示,下面這句話必須引入!!!
import 'ace-builds/src-noconflict/ext-language_tools'
在render中使用
<AceEditor
ref={editorInstance}
placeholder={placeholder}
mode="javascript"
theme="xcode"
name="UNIQUE_ID_OF_DIV"
fontSize={14}
defaultValue={defaultValue}
editorProps={{
$blockScrolling: false,
}}
onChange={onChange}
onPaste={onChange}
onLoad={complete}
showPrintMargin={false}
showGutter={true}
highlightActiveLine={true}
// 設(shè)置編輯器格式化和代碼提示
setOptions={{
useWorker: false,
enableBasicAutocompletion: true,
enableLiveAutocompletion: true,
// 自動提詞此項必須設(shè)置為true
enableSnippets: true,
showLineNumbers: false,
tabSize: 2,
}}
/>
如果要自定義提詞(此處有坑6А)
const complete = (editor: any) => {
editor.completers = [
// 自己的代碼提示
{
getCompletions: function (
editor: any,
session: any,
pos: any,
prefix: any,
callback: any
) {
callback(null, completers)
},
},
// 編輯器的代碼提示
// ...editor.completers,
]
}
此時如果想要動態(tài)改變提示詞數(shù)組桨吊,上面代碼是做不到的,現(xiàn)在是全量提示磕昼,即在onload加載完之后調(diào)用complete函數(shù)時延都,編輯器的代碼提示已經(jīng)被加載了,如果想要動態(tài)加載代碼提示棠耕,需要強制渲染編輯器余佛,react中我這樣搞的
useEffect(() => {
// !動態(tài)改變編輯器的代碼提示,必須重新設(shè)置
complete(editorInstance.current.editor)
}, [completers])
全部代碼如下:
import React, { useEffect, useRef } from 'react'
import AceEditor from 'react-ace'
import 'ace-builds/src-noconflict/mode-javascript'
import 'ace-builds/src-noconflict/theme-xcode'
import 'ace-builds/src-noconflict/ext-language_tools'
import 'ace-builds/webpack-resolver'
// 編輯器需要自定義時的數(shù)據(jù)結(jié)構(gòu)
// const completers = [
// {
// // name: 'name',
// value: 'price',
// // score: 100,
// meta: '變量類-單價',
// },
// {
// // name: 'name',
// value: 'Waybill.price',
// // score: 100,
// meta: '變量類-單價',
// },
// ]
const SqlEditor = (props: any) => {
const editorInstance = useRef<any>() // 獲取編輯器實例
const { placeholder, defaultValue, onChange, completers } = props
const complete = (editor: any) => {
editor.completers = [
// 自己的代碼提示
{
getCompletions: function (
editor: any,
session: any,
pos: any,
prefix: any,
callback: any
) {
callback(null, completers)
},
},
// 編輯器的代碼提示
// ...editor.completers,
]
}
useEffect(() => {
// !動態(tài)改變編輯器的代碼提示窍荧,必須重新設(shè)置
complete(editorInstance.current.editor)
}, [completers])
return (
<AceEditor
ref={editorInstance}
placeholder={placeholder}
mode="javascript"
theme="xcode"
name="UNIQUE_ID_OF_DIV"
fontSize={14}
defaultValue={defaultValue}
editorProps={{
$blockScrolling: false,
}}
onChange={onChange}
onPaste={onChange}
onLoad={complete}
showPrintMargin={false}
showGutter={true}
highlightActiveLine={true}
setOptions={{
useWorker: false,
enableBasicAutocompletion: true,
enableLiveAutocompletion: true,
enableSnippets: true,
showLineNumbers: false,
tabSize: 2,
}}
/>
)
}
export default SqlEditor
最終實現(xiàn)效果如下:
bug處理
useWorker的時候辉巡,會報錯Unable to infer path to ace from script src, use ace.config.set('basePath', 'path') to enable dynamic loading of modes and themes or with webpack use ace/webpack-resolver, 需要引入:
import 'ace-builds/webpack-resolver'