• BraftEditor富文本编辑器使用


    BraftEditor使用总结

    这里实现的是,参数管理功能,新建或者编辑的时候会弹出一个Modal。这里使用antdesign实现,然后在里面编辑富文本信息,点击保存提交给后台,或者是取消编辑。如图所示
    在这里插入图片描述
    一.安装
    npm install --save @types/braft-editor
    二.使用方法
    因为是较老的版本,因此很多api在网上已经查找不到了,看了组件的源码,进行简单总结。
    ①首先初始化是用的initialContent

     <div>
         <BraftEditor {...editorProps} initialContent={settingValue || ''} />
     </div>
    

    ②配置基本的参数,editorProps,onChange函数用于获取editor里面的内容,并传递给后台。

        const editorProps = {
          height: 350,
          contentFormat: 'html',
          // initialContent: line ? line.introduction : '',
          onChange: this.handleChangeEditor,
          onRawChange: this.handleRawChange,
          media: {
            allowPasteImage: true, // 是否允许直接粘贴剪贴板图片(例如QQ截图等)到编辑器
            image: true, // 开启图片插入功能
            video: true, // 开启视频插入功能
            audio: true, // 开启音频插入功能
            validateFn: null, // 指定本地校验函数,说明见下文
            uploadFn: uploadFn, // 指定上传函数,说明见下文
            removeConfirmFn: null, // 指定删除前的确认函数,说明见下文
            onRemove: null, // 指定媒体库文件被删除时的回调,参数为被删除的媒体文件列表(数组)
            onChange: null, // 指定媒体库文件列表发生变化时的回调,参数为媒体库文件列表(数组)
            onInsert: null, // 指定从媒体库插入文件到编辑器时的回调,参数为被插入的媒体文件列表(数组)
          },
        }
    

    ③此功能实现的是弹出一个Modal框里面展示富文本,因此需要在每次打开Modal框的时候做重置内容的操作,在这里因为使用的initialValue只能设置一次,因此改变富文本内容的时候,使用的this.refs.braft,并调用setContent()方法。

      showModelHandler = (e) => {
        if(this.refs.braft){
          this.refs.braft.setContent(this.props.record.settingValue || '<p></p>')
        }
        this.setState({
          visible: true,
        });
      };
    

    三.完整代码

    /*此部分代码是由上一个父页面引入的子组件,作用是弹出Modal框,来编辑参数名称和参数值*/
    import React, { Component } from 'react';
    import { Modal, Form, Input, message } from 'antd';
    import { connect } from 'dva';
    import style from '../Part/generalstyle.less';
    import BraftEditor from 'braft-editor'
    import 'braft-editor/dist/braft.css'
    
    
    const FormItem = Form.Item;
    
    const formItemLayout = {
      labelCol: {
        xs: { span: 24 },
        sm: { span: 7 },
      },
      wrapperCol: {
        xs: { span: 24 },
        sm: { span: 12 },
        md: { span: 5 },
      },
    };
    @connect(state => ({
      history: state.getData,
    }))
    class AddFusSystemParam extends Component {
      constructor(props) {
        super(props);
        this.state = {
          visible: false,
          contentEditor: '',
        };
      }
    
      showModelHandler = (e) => {
        if(this.refs.braft){
          this.refs.braft.setContent(this.props.record.settingValue || '<p></p>')
        }
        this.setState({
          visible: true,
        });
      };
    
      hideModelHandler = () => {
        this.props.form.resetFields();
        this.setState({
          visible: false,
        });
      };
    
      okHandler = () => {
        const { onOk } = this.props;
        this.props.form.validateFields((err, values) => {
          if (!err) {
            if (typeof (values.settingName) == "undefined" || values.settingName == null) {
              values.settingName = '';
            }
            if (values.id == '') {
              delete values.id;
            }
            if ((!this.state.contentEditor) || (this.state.contentEditor == '<p></p>')) {
              message.error("请添加参数值");
              return;
            }
            else {
              values.settingValue = this.state.contentEditor;
            }
            var data = Object.keys(values)
              .map(k => encodeURIComponent(k) + '=' + encodeURIComponent(values[k]))
              .join('&');
            onOk(data);
            this.hideModelHandler();
          }
        });
      };
      handleChangeEditor = (content) => {
        this.setState({
          contentEditor: content,
        });
      }
      handleRawChange = (rawContent) => {
        console.log(rawContent);
      }
      render() {
        const { children } = this.props;
        const { getFieldDecorator } = this.props.form;
        const { id, settingName, settingValue } = this.props.record;
        const formItemLayout = {
          labelCol: { span: 6 },
          wrapperCol: { span: 14 },
        };
        const uploadFn = (param) => {
    
          const serverURL = '/hyapi/resource/video/upload'
     const xhr = new XMLHttpRequest();
        const fd = new FormData();

        const successFn = response => {
          const { code, data, message: msg } = JSON.parse(xhr.responseText);
          if (code !== 0) {
            message.error(msg);
            return;
          }
          const { localUrl = '', id = 0, title = '' } = data;
          

          // 假设服务端直接返回文件上传后的地址
          // 上传成功后调用param.success并传入上传后的文件地址
          param.success({
            url: '/'+localUrl,
            meta: {
              id,
              title,
              alt: title,
              loop: true, // 指定音视频是否循环播放
              autoPlay: true, // 指定音视频是否自动播放
              controls: true, // 指定音视频是否显示控制栏
              poster: '', // 指定视频播放器的封面
            },
          });
        };

        const progressFn = event => {
          // 上传进度发生变化时调用param.progress
          param.progress((event.loaded / event.total) * 100);
        };

        const errorFn = response => {
          // 上传发生错误时调用param.error
          param.error({
            msg: 'unable to upload.',
          });
        };

        xhr.upload.addEventListener('progress', progressFn, false);
        xhr.addEventListener('load', successFn, false);
        xhr.addEventListener('error', errorFn, false);
        xhr.addEventListener('abort', errorFn, false);

        fd.append('uploadFile', param.file);
        fd.append('uploadFile', 'richText');
        xhr.open('POST', serverURL, true);
        xhr.send(fd);
    
          };
      
          const progressFn = (event) => {
            // 上传进度发生变化时调用param.progress
            param.progress(event.loaded / event.total * 100)
          };
      
          const errorFn = (response) => {
            // 上传发生错误时调用param.error
            param.error({
              msg: 'unable to upload.',
            });
          };
      
          xhr.upload.addEventListener("progress", progressFn, false);
          xhr.addEventListener("load", successFn, false);
          xhr.addEventListener("error", errorFn, false);
          xhr.addEventListener("abort", errorFn, false);
      
          fd.append('files', param.file);
          xhr.open('POST', serverURL, true);
          xhr.send(fd);
      
        };
      
        const editorProps = {
          height: 350,
          contentFormat: 'html',
          // initialContent: line ? line.introduction : '',
          onChange: this.handleChangeEditor,
          onRawChange: this.handleRawChange,
          media: {
            allowPasteImage: true, // 是否允许直接粘贴剪贴板图片(例如QQ截图等)到编辑器
            image: true, // 开启图片插入功能
            video: true, // 开启视频插入功能
            audio: true, // 开启音频插入功能
            validateFn: null, // 指定本地校验函数,说明见下文
            uploadFn: uploadFn, // 指定上传函数,说明见下文
            removeConfirmFn: null, // 指定删除前的确认函数,说明见下文
            onRemove: null, // 指定媒体库文件被删除时的回调,参数为被删除的媒体文件列表(数组)
            onChange: null, // 指定媒体库文件列表发生变化时的回调,参数为媒体库文件列表(数组)
            onInsert: null, // 指定从媒体库插入文件到编辑器时的回调,参数为被插入的媒体文件列表(数组)
          },
        }
    
        return (
          <span>
            <span onClick={this.showModelHandler}>
              {children}
            </span>
            <Modal
              title="编辑区域"
              visible={this.state.visible}
              onOk={this.okHandler}
              onCancel={this.hideModelHandler}
              width="60%"
            >
              <Form layout='horizontal' onSubmit={this.okHandler} className={style.ctmodal}>
                <FormItem
                >
                  {
                    getFieldDecorator('id', {
                      initialValue: id || '',
                    })(<Input type='hidden'  style={{ width: 200}}/>)
                  }
                </FormItem>
                <FormItem
                  {...formItemLayout}
                  label="参数名称"
                >
                  {
                    getFieldDecorator('settingName', {
                      initialValue: settingName || '',
                      rules: [{ required: true, message: '请输入参数名称' }],
                    })(<Input disabled={this.props.disabled} />)
                  }
                </FormItem>
    
                <FormItem
                  {...formItemLayout}
                  label="参数值"
                >
                  <div>
                    <BraftEditor {...editorProps} initialContent={settingValue || ''} />
                  </div>
                </FormItem>
                </Form>
    
            </Modal>
          </span>
        );
      }
    }
    export default Form.create()(AddFusSystemParam);
  • 相关阅读:
    DHCP Option 60 的理解
    几种开源分词工具的比較
    推荐交互设计师阅读的一本书
    iOS IAP教程
    艰苦的RAW格式数据恢复之旅
    BestCoder Round #11 (Div. 2) 前三题题解
    罗马数字
    mysql 加入列,改动列,删除列。
    杂项:ASP.NET Web API
    杂项:Web API
  • 原文地址:https://www.cnblogs.com/lan-cheng/p/14236703.html
Copyright © 2020-2023  润新知