import React,{Component} from 'react' ;
import ReactQuill,{ Quill } from 'react-quill' ;
import 'react-quill/dist/quill.snow.css' ;
import { Button ,Modal,message} from 'antd' ;
import MYURL from 'api/config' ;
import { ImageDrop } from 'quill-image-drop-module' ;
Quill.register( 'modules/imageDrop' , ImageDrop);
class Editer extends Component {
constructor(props) {
super(props)
this .state = { text: '' } // You can also pass a Quill Delta here
this .handleChange = this .handleChange.bind( this )
this .selectImage = this .selectImage.bind( this );
this .changeImageBeforeUpload = this .changeImageBeforeUpload.bind( this );
this .uploadForImage = this .uploadForImage.bind( this );
this .imageHandler = this .imageHandler.bind( this );
this .showUploadBox = this .showUploadBox.bind( this );
this .hideUploadBox = this .hideUploadBox.bind( this );
this .handleUpload = this .handleUpload.bind( this );
}
handleChange(value) {
// if (value) ReactQuill.getSelection().dangerouslyPasteHTML(value);
this .setState({ text: value })
};
modules ={ // 富文本配置
toolbar:{
container:[
[{ 'header': [1, 2, 3, 4, 5, 6, false ] }],
[ 'bold', 'italic', 'underline', 'strike','blockquote'], // toggled buttons
['blockquote', 'code-block' ],
// [{ 'header': 1 }, { 'header': 2 }], // custom button values
[{ 'script': 'sub'}, { 'script': 'super' }], // superscript/subscript
[{ 'indent': '-1'}, { 'indent': '+1' }], // outdent/indent
[{ 'direction': 'rtl' }], // text direction
[{ 'size': ['small', false , 'large', 'huge'] }], // custom dropdown
[{'list': 'ordered'}, {'list': 'bullet'}, {'indent': '-1'}, {'indent': '+1'},{ 'align' : [] }],
[{ 'color': [] }, { 'background': [] }], // dropdown with defaults from theme
[{ 'font' : [] }],
[{ 'align' : [] }],
[ 'link', 'image', 'video' ],
[ 'clean' ],
],
handlers: {
'image': this .showUploadBox.bind( this )
}
},
imageDrop: true ,
};
showUploadBox(){
this .setState({
uploadBoxVisible: true
});
};
hideUploadBox(){
this .setState({
uploadBoxVisible: false
});
};
selectImage(){
this .refs.uploadInput.click(); // 点击modal的html结构中的input标签
};
changeImageBeforeUpload(e){
const file = e.target.files[0 ];
if (! file) {
return ;
}
let src;
// 匹配类型为image/开头的字符串
if (file.type==="image/png"||file.type==="image/jpeg" ) {
src = URL.createObjectURL(file);
} else {
message.error( "图片上传只支持JPG/PNG格式,请重新上传!" );
return ;
}
if (file.size/1024/1024>5 ) {
message.error( "图片上传大小不要超过5MB,请重新上传!" );
return ;
}
this .setState({
src:src,
file:file
})
console.log( 'eeeeeee' ,window)
}
/* 3.开始上传图片 */
handleUpload(){
let this_ = this ;
/* 调用上传图片的封装方法 */
if (! this .state.file){
alert( '请选择图片!!' )
} else {
let fileServerAddr = MYURL.fileServer // 服务器地址
let file = this .state.file.name
let size = this .state.file.size
this .uploadForImage(fileServerAddr,file,size, function (response) { // 回调函数处理进度和后端返回值
console.log('res----?>' ,response)
if ((response && response.status === 200) ||(response && response.status === "200" )) {
message.success( "上传成功!" );
this_.hideUploadBox(); // 隐藏弹框
console.log("response.data.url???=>" ,response.data.url)
this_.imageHandler(response.data.url); // 处理插入图片到编辑器
} else if (response && response.status !== 200 ) {
message.error(response.msg)
}
},
localStorage.getItem( "access_token" ));
}
};
uploadForImage(url,data,size,callback,token) { // data是数据列表
if (! data) {
alert( '请选择图片!!' )
console.log( '未选择文件' );
return ;
} else {
let xhr = new XMLHttpRequest();
let formdata = new FormData();
formdata.append( 'file' , data);
formdata.append( 'fileSize' , size);
xhr.onload =() => {
if (xhr.status === 200 ||xhr.statusn ==='200' ){
let response = JSON.parse(xhr.response)
console.log( 'res====' ,response)
callback(response);
}
};
// xhr.open('POST', url, true); // 第三个参数为async?,异步/同步
xhr.open('GET', url, true ); // 第三个参数为async?,异步/同步
xhr.setRequestHeader("accessToken" ,token);
xhr.send(formdata);
}
}
/* 4.处理图片插入 */
imageHandler(url){
if ( typeof this .reactQuillRef.getEditor !== 'function') return ;
const quill = this .reactQuillRef.getEditor()
var range = quill.getSelection();
let index = range ? range.index : 0 ;
quill.insertEmbed(index, "image",url, Quill.sources.USER); // 插入图片
quill.setSelection(index + 1); // 光标位置加1
console.log("quill.getSelection.======" ,quill.getSelection().index)
};
render() {
return (
<div style={{maxHeight:"500px"}}>
<ReactQuill >.handleChange}
theme={"snow"} modules={ this .modules} style={{height:"300px"}} />
< Modal
title ="上传图片"
visible ={ this .state.uploadBoxVisible}
onCancel ={ this .hideUploadBox}
onOk ={ this .handleUpload }
maskClosable ={ false }
width ={500 }
>
<div className="ImagaBox" >
<div>
<Button onClick={ this .selectImage.bind( this )} style={{background:"#18ade4",border:"none",color:"#fff"}}>
选择图片
</Button>
<input ref="uploadInput" type='file' accept='image/*'
style ={{width:"100px",border:"none",visibility:"hidden" }}
onChange ={ this .changeImageBeforeUpload.bind( this )}
/>
</div>
<div style={{textAlign:"center",margin:"10px 0"}}>
{ this .state.src?
<img src={ this .state.src} alt="" style={{maxWidth:"100%",height:"300px"}}/>
:
<div style={{background:"#f2f2f2",width:"100%",height:"300px"}}></div>
}
</div>
</div>
</Modal>
</div>
)
}
};
export default Editer;
查看更多关于react-quill 富文本编辑器 ---- 图片处理的详细内容...
声明:本文来自网络,不代表【好得很程序员自学网】立场,转载请注明出处:http://www.haodehen.cn/did222564