react-quill 富文本编辑器 ---- 图片处理
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 id="ddd"  ref={(el) =>{this.reactQuillRef = el}} value={this.state.text} onChange={this.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 富文本编辑器 ---- 图片处理的更多相关文章
- Quill 富文本编辑器
		
Quill 富文本编辑器 https://quilljs.com/ https://github.com/quilljs/quill https://github.com/quilljs/awesom ...
 - 【重点突破】—— React实现富文本编辑器
		
前言:富文本编辑器Rich Text Editor, 简称 RTE, 是一种可内嵌于浏览器,所见即所得的文本编辑器. 一.安装插件 react-draft-wysiwyg: 文本编辑器插件 dra ...
 - 【React】富文本编辑器   清空文本内容     获取HTML
		
富文本编辑器 React 传入 import React,{Component } from 'react'; import { Card, Button, Table, Form, Select ...
 - Vue整合Quill富文本编辑器
		
Quill介绍 Quill是一款开源的富文本编辑器,基于可扩展的架构设计,提供丰富的 API 进行定制.截止2021年1月,在github上面已有28.8k的star. Quill项目地址:https ...
 - 轻量级quill富文本编辑器
		
因为公司产品需要在移动端编辑文本,所以发现了这个轻量级的好东西,网上也没找到比较好的案例,就自己总结了下,有兴趣的直接复制代码运行看看就知道啦! 下面是quill.js的CDN加速地址: <!- ...
 - quill富文本编辑器 API
		
//1. 从第三个开始删除,删除4个 // console.log(this.quill.deleteText(2, 4)); // 12345678 1278 // 2.(返回对象)返回从第三个开始 ...
 - Kindeditor JS 富文本编辑器图片上传指定路径
		
js //================== KindEditor.ready(function (K) { var hotelid = $("#hotelid").val(); ...
 - Vue2 封装的 Quill 富文本编辑器组件 Vue-Quill-Editor
		
1.安装 npm install vue-quill-editor --save 2.使用 import { quillEditor } from 'vue-quill-editor' 3.组件中 & ...
 - angular4 富文本编辑器
		
使用quill富文本编辑器实现,angular项目中用到了ngx-quill插件. quill的GitHub地址:https://github.com/quilljs/quill ngx-quill的 ...
 
随机推荐
- hostapd、/dev/random、/dev/urandom
			
在使用hostapd做软ap时,出现了random熵不够的问题,导致节点连接不上这个ap. 下面先解释一下/dev/random和/dev/urandom 先让我们从一个工程中遇到的实际问题开始,先上 ...
 - P2255 [USACO14JAN]记录奥林比克
			
P2255 [USACO14JAN]记录奥林比克 题目描述 农民约翰热衷于所有寒冷天气的运动(尤其是涉及到牛的运动), 农民约翰想录下尽可能多的电视节目. 为moolympics电视时间表由N个不同的 ...
 - Python迭代器、生成器
			
迭代器 iterator # 只要是能被for循环的数据类型 就一定拥有__iter__方法 # 迭代器多了的方法 print(set(dir([].__iter__()))-set(dir([])) ...
 - 可持久化线段树——区间更新hdu4348
			
和线段树类似,每个结点也要打lazy标记 但是lazy标记和线段树不一样 具体区别在于可持久化后lazy-tag不用往下传递,而是固定在这个区间并不断累加,变成了这个区间固有的性质(有点像分块的标记了 ...
 - 使用Postman测试https接口时的小问题记录
			
测试本地的WebApi接口时,接口是https,自己写的用httpclient测试是可以的, 用postman一直连接不了.原因正是由于https,不过postman在界面上已经给出了可能的原因和解决 ...
 - SSL 3.0曝出Poodle漏洞的解决方案
			
tomcat 各版本对ssl解决方案的配置:tomcat6: <Connector port="443" protocol="org.apache.coyote.h ...
 - C#嵌入子窗体,判断子窗体是否打开了
			
/// <summary> /// 嵌入子窗体,判断子窗体是否打开了 /// </summary> public static Form1 f; public void For ...
 - ***阿里云ECS实战配置虚拟主机 + Apache 配置虚拟主机三种方式
			
阿里云ECS实战配置虚拟主机 买了一台ECS阿里云服务器,性能感觉有点富余,想着可以陪着虚拟主机多一些WWW目录好放一些其他的程序.比如DEMO什么的. 今天研究了下,主要是就是做基于不同域名的虚拟主 ...
 - Linux 高阶命令进阶(一)
			
Linux 高阶命令进阶 (一)输出重定向 1. > :正确覆盖输出,会覆盖掉原先的文件内容 把文本写入文档中 # vim test ...
 - 3DMath
			
线与面相交的计算 https://zh.wikipedia.org/wiki/%E7%BA%BF%E9%9D%A2%E4%BA%A4%E7%82%B9 什么是参数方程? 参数是参变数的简称.它是研究运 ...