日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

react-draft-wysiwyg富文本的使用

發(fā)布時(shí)間:2025/3/15 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 react-draft-wysiwyg富文本的使用 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

1.分析需求

實(shí)現(xiàn)富文本編輯功能,通過與后臺(tái)傳輸html字符串,實(shí)現(xiàn)保存、編輯、回顯功能。

2.下載依賴

npm install

3.引入

import { Editor } from 'react-draft-wysiwyg';
import 'react-draft-wysiwyg/dist/react-draft-wysiwyg.css';
import { EditorState, convertToRaw, ContentState } from 'draft-js';
import draftToHtml from 'draftjs-to-html';
import htmlToDraft from 'html-to-draftjs';

4.存儲(chǔ)狀態(tài)

this.state = {editorState: EditorState.createEmpty(), };

5.jsx部分

<EditoreditorState={editorState}toolbarClassName="toolbarClassName"wrapperClassName="wrapperClassName"editorClassName={styles.editor}onEditorStateChange={this.onEditorStateChange} ////className={styles.demo-editor}style={{minHeight: '500px',}}/>

6.向后臺(tái)傳輸數(shù)據(jù)

6.1.保存數(shù)據(jù)

onEditorStateChange = editorState => {
this.setState({
editorState,
});
};

6.2.轉(zhuǎn)換格式 調(diào)取接口

dispatch({
type: 'Carstylescenter/addBrandIntroduce',
payload: {
brandId,
desc: draftToHtml(convertToRaw(editorState.getCurrentContent())),
},
});

7.富文本回顯

const descInit = response.data.brandDesc
if (descInit && descInit !== 'null') {
const contentBlock = htmlToDraft(descInit);
const contentState = ContentState.createFromBlockArray(contentBlock.contentBlocks);
const editorState = EditorState.createWithContent(contentState);
this.setState({ editorState });
}

8.全部代碼

import React, { Component, Fragment } from 'react';
import { connect } from 'dva';
import router from 'umi/router';
import { Row, Col, Card, Form, Button } from 'antd';
import { Editor } from 'react-draft-wysiwyg';
import 'react-draft-wysiwyg/dist/react-draft-wysiwyg.css';
import { EditorState, convertToRaw, ContentState } from 'draft-js';
import draftToHtml from 'draftjs-to-html';
import htmlToDraft from 'html-to-draftjs';
import PageHeaderWrapper from '@/components/PageHeaderWrapper';
import styles from './index.less';
@connect(({ Carstylescenter, loading }) => ({
Carstylescenter,
loading: loading.models.Carstylescenter,
}))
@Form.create()
class RichText extends Component {
constructor(props) {
super(props);
this.state = {
editorState: EditorState.createEmpty(),
};
this.formLayout = {
labelCol: { span: 7 },
wrapperCol: { span: 13 },
};
}
componentDidMount() {
const { dispatch } = this.props;
const brandId = this.props.location.query.vehicleBrandId;
dispatch({
type: 'Carstylescenter/brandIntroduceInit',
payload: { brandId },
callback: response => {
if (response.status == 0) {
console.log(11, response.data.brandDesc )
const descInit = response.data.brandDesc
if (descInit && descInit !== 'null') {
const contentBlock = htmlToDraft(descInit);
const contentState = ContentState.createFromBlockArray(contentBlock.contentBlocks);
const editorState = EditorState.createWithContent(contentState);
this.setState({ editorState });
}
} else {
message.error(response.message, 1, function() {});
}
},
});
}

onEditorStateChange = editorState => {
this.setState({
editorState,
});
};
handleAddIntroduceSubmit = () => {
const { dispatch } = this.props;
const editorState = this.state.editorState;
const brandId = this.props.location.query.vehicleBrandId;
dispatch({
type: 'Carstylescenter/addBrandIntroduce',
payload: {
brandId,
desc: draftToHtml(convertToRaw(editorState.getCurrentContent())),
},
});
};
handleAddIntroduceCancel = () => {
router.push(/carstylescenter/brands);
};
handleEditInit = () => {
const {
Carstylescenter: {
checkIntroduceData: { addIntroduceSuccess },
introduceInit,
},
loading,
} = this.props;
const editorState = this.state.editorState;
return (

<Card
bordered={false}
// style={{
// minHeight: '500px',
// }}
>
<Row gutter={{ md: 8, lg: 24, xl: 48 }}>
<Editor
editorState={editorState}
toolbarClassName="toolbarClassName"
wrapperClassName="wrapperClassName"
editorClassName={styles.editor}
onEditorStateChange={this.onEditorStateChange}
//className={styles.demo-editor}
style={{
minHeight: '500px',
}}
/>

<Row gutter={{ md: 8, lg: 24, xl: 48 }} >



<Button
type="primary"
style={{ marginRight: 50 }}
onClick={this.handleAddIntroduceSubmit}
>
提交

取消






);
};
render() {
return this.handleEditInit();
}
}

export default RichText;

轉(zhuǎn)載于:https://www.cnblogs.com/lanhuona/p/10524752.html

總結(jié)

以上是生活随笔為你收集整理的react-draft-wysiwyg富文本的使用的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 国产精品熟妇一区二区三区四区 | 国产吞精囗交免费视频 | 丁香四月婷婷 | 免费成人美女女 | 一本—道久久a久久精品蜜桃 | 国产女人毛片 | 国产午夜一级一片免费播放 | 欧美乱仑| 欧美成年人| 久久精品一区二区三区不卡牛牛 | 久久久夜| 美足av| 亚洲av无码一区东京热久久 | 国产在线一级片 | 亚洲天堂一区二区三区四区 | 亚洲香蕉av | 喷潮在线观看 | 成人77777 | 午夜久久久久久久 | 欧美熟妇乱码在线一区 | 手机在线观看日韩av | 国产一区二区三区观看 | 成人影视网址 | 狠狠干影视 | 国产学生美女无遮拦高潮视频 | 国产精品中文字幕在线 | 蜜臀av性久久久久av蜜臀妖精 | 91国产在线看| av第一福利| 久久久久这里只有精品 | 性xxxx视频 | 91av国产在线 | 久草观看视频 | 精品久久免费视频 | 亚洲精品女人久久久 | 色a在线| 性视频一区 | 影音先锋在线看片资源 | 嫩草视频 | 国产日韩精品在线观看 | 91传媒入口 | 日本做受 | 三上悠亚中文字幕在线播放 | 天堂√在线 | 久久毛片基地 | 久久综合一区二区 | 深夜成人福利视频 | 琪琪午夜伦理影院7777 | 黄色网页免费观看 | 国产视频分类 | av男人网| 91国产免费视频 | 亚洲欧美一区二区三区四区 | 在线免费日韩av | 中文字幕一区二区三区在线不卡 | 99热免费精品 | 婷婷深爱 | 久久久久亚洲av片无码v | 黄色av免费看 | 麻豆国产91在线播放 | 成人精品区 | 日本高清有码 | 雪白的扔子视频大全在线观看 | 久久激情网站 | 国产婷婷久久 | 粉嫩视频在线观看 | 亚洲欧美日韩精品色xxx | 2019av视频| 在线欧美视频 | 国产日本精品 | 成人免费毛片观看 | 亚洲国产毛片 | 欧美大片黄 | 国产调教一区 | 国产欧美在线精品日韩 | 国产盗摄在线观看 | 亚洲小视频| 一卡二卡在线观看 | 美女扒开腿让男人捅 | 一本—道久久a久久精品蜜桃 | 黄色av免费看 | 欧美日本在线观看 | 国产另类在线 | 欧美在线观看视频一区 | 91九色国产视频 | xx69欧美| 成人动漫在线播放 | 每日更新av | 牲欲强的熟妇农村老妇女视频 | 黄色三级大片 | 成人深夜在线观看 | 亚洲日本韩国在线 | 打屁股外国网站 | 男人扒女人添高潮视频 | 国产免费av片在线 | 日韩福利一区二区 | 日韩黄色视屏 | 亚洲精品三级 | 黄色在线免费播放 |