我只是想创建一个包含CodeMirror(4.1)编辑器的react组件。
我偶然发现this problem有一个workround通过在组件加载后强制刷新,但我不太确定在将反应添加到图片中时我需要实现这个工作流程。
建议是克服我需要的错误
“调整包装容器大小后调用.refresh()。”
我的代码目前在编辑器组件中如下:
function ($, React, CodeMirror) {
return React.createClass({
render: function () {
console.log("render-editarea");
return (
<textarea id="editarea">
-- Comment here
USE [All Data Items];
SELECT ID FROM [Test Event]
</textarea>
)
},
componentDidMount: function () {
var onExecute = this.props.onExecute;
var editorNode = document.getElementById("editarea");
console.log("componentDidUpdate-editarea:" + editorNode);
var editor = CodeMirror.fromTextArea(editorNode, {
lineNumbers: true,
matchBrackets: true,
indentUnit: 4,
mode: "text/x-mssql",
extraKeys: {"Ctrl-E": function(cm) {
console.log(editor.getValue());
onExecute(editor.getValue());
}}
});
},
并通过父组件的Render函数加载
我试过了
componentDidMount
中刷新
功能使用$("#editarea").refresh();
但这些似乎都不起作用
如果有人能告诉我正确的方法,我将不胜感激。
很多thx
答案 0 :(得分:2)
所以this pos帮助了我。 .refresh()是CodeMirror上的一个函数,我还没有完全理解。我使用了父母 componentDidLoad事件中该帖子中建议的方法。
componentDidMount: function () {
$('.CodeMirror').each(function(i, el){
el.CodeMirror.refresh();
});
},
答案 1 :(得分:2)
使用ref
属性引用呈现的节点而不是ID或DOM选择器:
function ($, React, CodeMirror) {
return React.createClass({
render: function () {
console.log("render-editarea");
return (
<textarea ref="editarea">
-- Comment here
USE [All Data Items];
SELECT ID FROM [Test Event]
</textarea>
)
},
componentDidMount: function () {
var onExecute = this.props.onExecute;
var editorNode = this.refs.editarea;
console.log("componentDidUpdate-editarea:" + editorNode);
var editor = CodeMirror.fromTextArea(editorNode, {
lineNumbers: true,
matchBrackets: true,
indentUnit: 4,
mode: "text/x-mssql",
extraKeys: {"Ctrl-E": function(cm) {
console.log(editor.getValue());
onExecute(editor.getValue());
}}
});
},