一、富文本组件封装
1、安装依赖
yarn add react-quill
富文本依赖yarn add quill-emoji
表情依赖
2、引入依赖
import ReactQuill, { Quill } from 'react-quill';
import 'react-quill/dist/quill.snow.css';
import quillEmoji from 'quill-emoji';
import "quill-emoji/dist/quill-emoji.css";
const { EmojiBlot, ShortNameEmoji, ToolbarEmoji, TextAreaEmoji } = quillEmoji;
Quill.register({
'formats/emoji': EmojiBlot,
'modules/emoji-shortname': ShortNameEmoji,
'modules/emoji-toolbar': ToolbarEmoji,
'modules/emoji-textarea': TextAreaEmoji,
}, true);
3、创建class组件
value
富文本回显的内容onChange
通过函数传给父组件的值
interface Props {
value: string
onChange: (value: string) => void
}
class ReactQuillWrap extends Component<Props, any>{
reactQuillRef: any = null;
modules: any = {
toolbar: {
container: []
}
}
constructor(props: any) {
super(props);
this.state = {}
}
render() {
return (
<ReactQuill
value={this.props.value}
modules={this.modules}
ref={(el) => { this.reactQuillRef = el }}
onChange={this.props.onChange.bind(this)}
/>
)
}
}
export default ReactQuillWrap;
4、配置自定义的工具栏
modules: any = {
toolbar: {
container: [
[{ 'size': ['small', false, 'large', 'huge'] }],
['bold', 'italic', 'underline', 'strike'],
[{ 'list': 'ordered' }, { 'list': 'bullet' }, { 'indent': '-1' }, { 'indent': '+1' }],
['link', 'image'],
[{ 'align': [] }],
[{
'background': ['rgb( 0, 0, 0)', 'rgb(230, 0, 0)', 'rgb(255, 153, 0)',
'rgb(255, 255, 0)', 'rgb( 0, 138, 0)', 'rgb( 0, 102, 204)',
'rgb(153, 51, 255)', 'rgb(255, 255, 255)', 'rgb(250, 204, 204)',
'rgb(255, 235, 204)', 'rgb(255, 255, 204)', 'rgb(204, 232, 204)',
'rgb(204, 224, 245)', 'rgb(235, 214, 255)', 'rgb(187, 187, 187)',
'rgb(240, 102, 102)', 'rgb(255, 194, 102)', 'rgb(255, 255, 102)',
'rgb(102, 185, 102)', 'rgb(102, 163, 224)', 'rgb(194, 133, 255)',
'rgb(136, 136, 136)', 'rgb(161, 0, 0)', 'rgb(178, 107, 0)',
'rgb(178, 178, 0)', 'rgb( 0, 97, 0)', 'rgb( 0, 71, 178)',
'rgb(107, 36, 178)', 'rgb( 68, 68, 68)', 'rgb( 92, 0, 0)',
'rgb(102, 61, 0)', 'rgb(102, 102, 0)', 'rgb( 0, 55, 0)',
'rgb( 0, 41, 102)', 'rgb( 61, 20, 10)']
}],
[{
'color': ['rgb( 0, 0, 0)', 'rgb(230, 0, 0)', 'rgb(255, 153, 0)',
'rgb(255, 255, 0)', 'rgb( 0, 138, 0)', 'rgb( 0, 102, 204)',
'rgb(153, 51, 255)', 'rgb(255, 255, 255)', 'rgb(250, 204, 204)',
'rgb(255, 235, 204)', 'rgb(255, 255, 204)', 'rgb(204, 232, 204)',
'rgb(204, 224, 245)', 'rgb(235, 214, 255)', 'rgb(187, 187, 187)',
'rgb(240, 102, 102)', 'rgb(255, 194, 102)', 'rgb(255, 255, 102)',
'rgb(102, 185, 102)', 'rgb(102, 163, 224)', 'rgb(194, 133, 255)',
'rgb(136, 136, 136)', 'rgb(161, 0, 0)', 'rgb(178, 107, 0)',
'rgb(178, 178, 0)', 'rgb( 0, 97, 0)', 'rgb( 0, 71, 178)',
'rgb(107, 36, 178)', 'rgb( 68, 68, 68)', 'rgb( 92, 0, 0)',
'rgb(102, 61, 0)', 'rgb(102, 102, 0)', 'rgb( 0, 55, 0)',
'rgb( 0, 41, 102)', 'rgb( 61, 20, 10)']
}],
['clean'],
['emoji'],
['video2'],
],
handlers: {
'image': this.imageHandler.bind(this),
},
},
'emoji-toolbar': true,
"emoji-textarea": false,
"emoji-shortname": true,
}
5、上传图片方法
imageHandler() {
const input = document.createElement('input');
input.setAttribute('type', 'file');
input.setAttribute('accept', 'image/*');
input.click();
input.onchange = () => {
const file = input.files ? input.files[0] : '';
const fd = new FormData();
fd.append('file', file);
uploadSubmit(getSellerId(), fd).then((res: any) => {
console.log('res===', res)
if (res?.code === '0') {
let quill = this.reactQuillRef.getEditor();
const cursorPosition = quill.getSelection().index;
quill.insertEmbed(cursorPosition, "image", res.url);
quill.setSelection(cursorPosition + 1);
}
});
};
}
二、父组件使用
1、引入封装的组件
import ReactQillWrap from 'components/reactQuill';
2、render渲染
content
富文本内容回显值setFieldsValue
设置表单值handleChange
接收子组件的富文本内容
componentDidMount() {
const currentItem = this.props.current;
if (currentItem) {
this.form.current?.setFieldsValue({
name: currentItem.name,
content: currentItem.content
})
}
}
handleChange(value: string) {
this.setState({ content: value })
}
<Form.Item label="公司内容" name="content" initialValue="" rules={[{ required: true }]}>
<ReactQillWrap value={this.state.content} onChange={this.handleChange.bind(this)} />
</Form.Item>
3、视图
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/e4e852a9ac3465e1ed4e13f175bf1ca1.png)