如何从 draftjs 中检索文本
How retrieve text from draftjs
我正在尝试编辑文本然后检索它并在服务器端更新数据库
这是我正在使用的代码
constructor(props,context){
super(props,context);
this.handleOnClick = this.handleOnClick.bind(this);
const processedHTML = DraftPasteProcessor.processHTML(this.props.rule.description.replace(/\n/g, "<br />"));
const contentState = ContentState.createFromBlockArray(processedHTML);
var editorState = EditorState.createWithContent(contentState);
var editorState = EditorState.moveFocusToEnd(editorState);
this.state = {editorState: editorState};
this.onChange = (editorState) => this.setState({editorState});
}
handleOnClick(event) {
var text = this.state.editorState.getCurrentContent().getBlocksAsArray();
var finalText;
text.map((item) => {
finalText = item.getText() + finalText});
console.log(finalText)
render(){
return(
<div>
<Col smOffset={2} mdOffset={1}>
<PageHeader>
{this.props.rule.title}
</PageHeader>
<Editor
editorState={this.state.editorState}
onChange={this.onChange}
/>
</Col>
<Col smOffset={2} mdOffset={1}>
<Button onClick = {this.handleOnClick()}>Update rule</Button>
</Col>
</div>
);
}
但是我有一个问题,draftJs returns 没有 \n 的文本所以我会保存格式错误的文本,有什么方法可以让文本带有分隔线吗?
您可以使用 DraftJS 的 convertToRaw 函数,如下所示获取带换行的文本:
import {
convertToRaw,
} from 'draft-js';
const blocks = convertToRaw(editorState.getCurrentContent()).blocks;
const value = blocks.map(block => (!block.text.trim() && '\n') || block.text).join('\n');
检索文本的最佳方法是使用
editorState.getCurrentContent().getPlainText('\u0001')
请注意,函数 getPlainText
将始终在块之间创建单个 space,因此您需要将 \u0001
作为参数发送
Piyush Zalani 的回答几乎是正确的,但如果块中没有任何内容,最后的连接会导致额外的新行被追加。
这里是一个稍微修改过的版本,它正确地解释了只有换行符的块:
const blocks = convertToRaw(editorState.getCurrentContent()).blocks;
const mappedBlocks = blocks.map(
block => (!block.text.trim() && "\n") || block.text
);
let newText = "";
for (let i = 0; i < mappedBlocks.length; i++) {
const block = mappedBlocks[i];
// handle last block
if (i === mappedBlocks.length - 1) {
newText += block;
} else {
// otherwise we join with \n, except if the block is already a \n
if (block === "\n") newText += block;
else newText += block + "\n";
}
}
const { blocks } = convertToRaw(editorState.getCurrentContent());
const mappedBlocks = blocks.map(
block => (!block.text.trim() && "\n") || block.text,
);
return mappedBlocks.reduce((acc, block) => {
let returned = acc;
if (block === "\n") returned += block;
else returned += `${block}\n`;
return returned;
}, "");
};```
我正在尝试编辑文本然后检索它并在服务器端更新数据库
这是我正在使用的代码
constructor(props,context){
super(props,context);
this.handleOnClick = this.handleOnClick.bind(this);
const processedHTML = DraftPasteProcessor.processHTML(this.props.rule.description.replace(/\n/g, "<br />"));
const contentState = ContentState.createFromBlockArray(processedHTML);
var editorState = EditorState.createWithContent(contentState);
var editorState = EditorState.moveFocusToEnd(editorState);
this.state = {editorState: editorState};
this.onChange = (editorState) => this.setState({editorState});
}
handleOnClick(event) {
var text = this.state.editorState.getCurrentContent().getBlocksAsArray();
var finalText;
text.map((item) => {
finalText = item.getText() + finalText});
console.log(finalText)
render(){
return(
<div>
<Col smOffset={2} mdOffset={1}>
<PageHeader>
{this.props.rule.title}
</PageHeader>
<Editor
editorState={this.state.editorState}
onChange={this.onChange}
/>
</Col>
<Col smOffset={2} mdOffset={1}>
<Button onClick = {this.handleOnClick()}>Update rule</Button>
</Col>
</div>
);
}
但是我有一个问题,draftJs returns 没有 \n 的文本所以我会保存格式错误的文本,有什么方法可以让文本带有分隔线吗?
您可以使用 DraftJS 的 convertToRaw 函数,如下所示获取带换行的文本:
import {
convertToRaw,
} from 'draft-js';
const blocks = convertToRaw(editorState.getCurrentContent()).blocks;
const value = blocks.map(block => (!block.text.trim() && '\n') || block.text).join('\n');
检索文本的最佳方法是使用
editorState.getCurrentContent().getPlainText('\u0001')
请注意,函数 getPlainText
将始终在块之间创建单个 space,因此您需要将 \u0001
作为参数发送
Piyush Zalani 的回答几乎是正确的,但如果块中没有任何内容,最后的连接会导致额外的新行被追加。
这里是一个稍微修改过的版本,它正确地解释了只有换行符的块:
const blocks = convertToRaw(editorState.getCurrentContent()).blocks;
const mappedBlocks = blocks.map(
block => (!block.text.trim() && "\n") || block.text
);
let newText = "";
for (let i = 0; i < mappedBlocks.length; i++) {
const block = mappedBlocks[i];
// handle last block
if (i === mappedBlocks.length - 1) {
newText += block;
} else {
// otherwise we join with \n, except if the block is already a \n
if (block === "\n") newText += block;
else newText += block + "\n";
}
}
const { blocks } = convertToRaw(editorState.getCurrentContent());
const mappedBlocks = blocks.map(
block => (!block.text.trim() && "\n") || block.text,
);
return mappedBlocks.reduce((acc, block) => {
let returned = acc;
if (block === "\n") returned += block;
else returned += `${block}\n`;
return returned;
}, "");
};```