Facebook Draft.jsを使用しています。テキストに有効なURLが検出されたときにLINKエンティティを作成する必要があります。Facebook内のデコレータでリンクエンティティを作成する方法Draft.js
現在、draft-js-linkify-pluginのようなテキストにリンクがあるかどうかを検出する戦略を実装していますが、そのテキストを不変のLINKエンティティに変更する際に問題があります。
実際、エディターの小道具で飾るのですが、私はエディターの状態を変更することができませんので、この新しいLINKエンティティを適用してください。
デコレータ:
const decorator = new CompositeDecorator([{
strategy: findLinks,
component: decorateComponentWithProps(Link, {
getEditorState: this.getEditorState.bind(this),
setEditorState: this.onChange.bind(this)
}),
}]);
戦略:
function findLinks(contentBlock, callback) {
const links = linkify.match(contentBlock.getText());
if (links) {
links.map(link => callback(link.index, link.lastIndex))
}
}
コンポーネント:私はそこに問題がslectionStateであるか、テキストブロックを取得する知っている
const Link = (props) => {
const editorState = props.getEditorState();
const contentState = editorState.getCurrentContent();
const selectionState = editorState.getSelection();
const contentStateWithEntity = contentState.createEntity(
'LINK',
'IMMUTABLE',
{ url: props.decoratedText }
);
const entityKey = contentStateWithEntity.getLastCreatedEntityKey();
const contentStateWithLink = Modifier.applyEntity(
contentStateWithEntity,
selectionState,
entityKey
);
const entity = contentStateWithLink.getEntity(entityKey);
const { url } = entity.getData();
const type = entity.getType();
const newEditorState = EditorState.set(editorState, {
currentContent: contentStateWithEntity
});
props.setEditorState(newEditorState);
return <a href={url} target="_blank">{url}</a>;
};
cの代わりにそれを修正する新しいエンティティをリベートするが、私は少し失われている。私はこれを作るのに正しい論理を使っていますか?あなたの助けのための
おかげで、
これを解決できましたか?私は同様の問題に直面している。 – curial
いいえ、デコレータがエンティティと競合しているために私の方法を見直しました。私は答えの状況に応じて2つの選択肢を提案しました。あなたが両方を必要とする場合、代替案を一緒に実装することができます。 –