如何在draft.js中实现link?
How to implement link in draft.js?
官方 link example 已损坏(没有 contentState 传递给 findLinkEntities 函数)。
link 是否还有其他通过 draft.js 实现的方法?
我找到了这个问题的解决方案。
'use strict';
import React, { Component } from 'react';
import { observer } from 'mobx-react';
import { Entity, RichUtils } from 'draft-js';
@observer
class Draft_Link extends Component {
render() {
const input = (
<form className="draft__link__form dropDown__angle" onSubmit={this._handle_submit.bind(this)}>
<input type="text" ref='url' placeholder='type or paste link here'
onChange={this._handle_change.bind(this)} />
<button type="submit">
<icon className="icon-checkmark3"></icon>
</button>
<grip className="draft__link__close" onClick={this._close_form.bind(this)}>
<icon className="icon-close"></icon>
</grip>
</form>
)
return (
<div className="draft__link__wrap">
<grip className="draft__toggle draft__link__toggle" onClick={this._show_form.bind(this)}>
<icon className="icon icon-link"></icon>
<div className="tooltip">
Make link
</div>
</grip>
{ this.state.showURLInput ? input : null }
</div>
);
}
constructor(props) {
super(props);
this.state = {
showURLInput: false,
urlValue: '',
};
}
_show_form(event) {
event.preventDefault();
const { editorState } = this.props;
const selection = editorState.getSelection();
if (!selection.isCollapsed()) {
this.setState({
showURLInput: true,
urlValue: '',
}, () => {
setTimeout(() => this.refs.url.focus(), 0);
});
}
}
_close_form() {
this.setState({
showURLInput: false,
urlValue: '',
});
}
_handle_change(event) {
this.setState({ urlValue: event.target.value });
}
_handle_submit(event) {
event.preventDefault();
this._confirm_link();
}
_confirm_link() {
this._set_link(this.state.urlValue);
this.setState({
showURLInput: false,
urlValue: '',
});
}
_set_link(url) {
const { editorState } = this.props;
const selection = editorState.getSelection();
const contentState = editorState.getCurrentContent();
if (url.length > 0) {
const entityKey = Entity.create('LINK', 'MUTABLE', { url: url });
this._toggle_link(selection, entityKey);
}
}
_toggle_link(selection, entityKey) {
this.props.onChange(RichUtils.toggleLink(this.props.editorState, selection, entityKey));
}
}
export default Draft_Link;
官方 link example 已损坏(没有 contentState 传递给 findLinkEntities 函数)。 link 是否还有其他通过 draft.js 实现的方法?
我找到了这个问题的解决方案。
'use strict';
import React, { Component } from 'react';
import { observer } from 'mobx-react';
import { Entity, RichUtils } from 'draft-js';
@observer
class Draft_Link extends Component {
render() {
const input = (
<form className="draft__link__form dropDown__angle" onSubmit={this._handle_submit.bind(this)}>
<input type="text" ref='url' placeholder='type or paste link here'
onChange={this._handle_change.bind(this)} />
<button type="submit">
<icon className="icon-checkmark3"></icon>
</button>
<grip className="draft__link__close" onClick={this._close_form.bind(this)}>
<icon className="icon-close"></icon>
</grip>
</form>
)
return (
<div className="draft__link__wrap">
<grip className="draft__toggle draft__link__toggle" onClick={this._show_form.bind(this)}>
<icon className="icon icon-link"></icon>
<div className="tooltip">
Make link
</div>
</grip>
{ this.state.showURLInput ? input : null }
</div>
);
}
constructor(props) {
super(props);
this.state = {
showURLInput: false,
urlValue: '',
};
}
_show_form(event) {
event.preventDefault();
const { editorState } = this.props;
const selection = editorState.getSelection();
if (!selection.isCollapsed()) {
this.setState({
showURLInput: true,
urlValue: '',
}, () => {
setTimeout(() => this.refs.url.focus(), 0);
});
}
}
_close_form() {
this.setState({
showURLInput: false,
urlValue: '',
});
}
_handle_change(event) {
this.setState({ urlValue: event.target.value });
}
_handle_submit(event) {
event.preventDefault();
this._confirm_link();
}
_confirm_link() {
this._set_link(this.state.urlValue);
this.setState({
showURLInput: false,
urlValue: '',
});
}
_set_link(url) {
const { editorState } = this.props;
const selection = editorState.getSelection();
const contentState = editorState.getCurrentContent();
if (url.length > 0) {
const entityKey = Entity.create('LINK', 'MUTABLE', { url: url });
this._toggle_link(selection, entityKey);
}
}
_toggle_link(selection, entityKey) {
this.props.onChange(RichUtils.toggleLink(this.props.editorState, selection, entityKey));
}
}
export default Draft_Link;