如何将CKEditor与React.js一起使用,让React能够识别它? [英] How can CKEditor be used with React.js in a way that allows React to recognize it?

查看:5194
本文介绍了如何将CKEditor与React.js一起使用,让React能够识别它?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试过使用componentWillMount和componentDidMount从React的上下文中初始化CKEditor,但是它似乎不工作,不管我尝试什么组合。除了切换编辑器,有没有人找到一个解决方案?

I've tried using componentWillMount and componentDidMount to initialize CKEditor from within the context of React, but it doesn't seem to work no matter what combination I try. Has anyone found a solution to this besides switching editors?

推荐答案

这是一个React组件显示一段文字。如果用户想要编辑段落中的文本,他们可以单击它,然后将附加一个CKEditor实例。当用户完成更改Editor实例中的文本时,将会触发blur事件,将CKEditor数据传输到state属性并销毁CKEditor实例。

This is for a React component which displays a P paragraph of text. If the user wants to edit the text in the paragraph, they can click it which will then attach a CKEditor instance. When the user is done altering the text in the Editor instance, the "blur" event fires which transfers the CKEditor data to a state property and destroys the CKEditor Instance.

import React, {PropTypes, Component} from 'react';

export default class ConditionalWYSIWYG extends Component {
    constructor(props) {
        super(props);
        this.state = {
            field_name:this.props.field_name,
            field_value:this.props.field_value,
            showWYSIWYG:false
        };
        this.beginEdit = this.beginEdit.bind(this);
        this.initEditor = this.initEditor.bind(this);
    }
    render() {
        if ( this.state.showWYSIWYG  ) {
            var field = this.state.field_name;
            this.initEditor(field);
            return (
                <textarea name='editor' cols="100" rows="6" defaultValue={unescape(this.state.field_value)}></textarea>
            )
        } else {
            return (
                <p className='description_field' onClick={this.beginEdit}>{unescape(this.state.field_value)}</p>
            )
        }
    }
    beginEdit() {
        this.setState({showWYSIWYG:true})
    }
    initEditor(field) {
        var self = this;

        function toggle() {
            CKEDITOR.replace("editor", { toolbar: "Basic", width: 870, height: 150 });
            CKEDITOR.instances.editor.on('blur', function() {

                let data = CKEDITOR.instances.editor.getData();
                self.setState({
                    field_value:escape(data),
                    showWYSIWYG:false
                });
                self.value = data;
                CKEDITOR.instances.editor.destroy();
            });
        }
        window.setTimeout(toggle, 100);
    }
}

self.value =数据允许我通过简单的引用从父组件检索文本

The self.value = data allows me to retrieve the text from the parent component via a simple ref

window.setTimeout 给React时间做它做什么。没有这个延迟,我会得到一个无法读取属性的getEditor的未定义的错误在控制台。

The window.setTimeout(); gives React time to do what it does. Without this delay, I would get an Cannot read property 'getEditor' of undefined error in the console.

希望这有助于

这篇关于如何将CKEditor与React.js一起使用,让React能够识别它?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆