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()
  
      // libraryId可用于通过mediaLibrary示例来操作对应的媒体内容
      console.log(param.libraryId)
  
      const successFn = (response) => {
        // 假设服务端直接返回文件上传后的地址
        // 上传成功后调用param.success并传入上传后的文件地址
        param.success({
          // url: xhr.responseText,
          url: JSON.parse(xhr.responseText).obj[0],
          meta: {
            id: 'xxx',
            title: 'xxx',
            alt: 'xxx',
            loop: false, // 指定音视频是否循环播放
            autoPlay: false, // 指定音视频是否自动播放
            controls: true, // 指定音视频是否显示控制栏
            // poster: 'http://xxx/xx.png', // 指定视频播放器的封面
            poster: null, // 指定视频播放器的封面
          },
        });
      };
  
      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);
好的,可以使用 diffjs 来进行文本内容的比较,然后使用 BraftEditor 来展示差异数据。以下是一个简单的示例代码: ```javascript import React, { useState } from 'react'; import Diff from 'diff'; import BraftEditor from 'braft-editor'; import 'braft-editor/dist/index.css'; const originalText = '这是一段原始文本,其中有些字体是加粗和斜体的。'; const modifiedText = '这是一段修改后的文本,其中有些字体是加粗和删除线的。'; const diffText = () => { const diffResult = Diff.diffWords(originalText, modifiedText); return diffResult.map((part, index) => { const content = part.value; if (part.added) { return <span key={index} style={{ backgroundColor: 'lightgreen' }}>{content}</span>; } if (part.removed) { return <span key={index} style={{ backgroundColor: 'pink' }}>{content}</span>; } return content; }); }; const App = () => { const [editorState, setEditorState] = useState(BraftEditor.createEditorStateFromText(originalText)); const handleDiff = () => { const diffResult = Diff.diffWords(originalText, modifiedText); const diffEditorState = BraftEditor.createEditorStateFromText(diffResult.map(part => part.value).join('')); setEditorState(diffEditorState); }; return ( <div> <div> <h2>原始文本</h2> <div>{originalText}</div> </div> <div> <h2>修改后的文本</h2> <div>{modifiedText}</div> </div> <div> <h2>差异数据</h2> <div>{diffText()}</div> </div> <div> <h2>差异数据编辑器</h2> <BraftEditor value={editorState} onChange={setEditorState} /> <button onClick={handleDiff}>展示差异数据</button> </div> </div> ); }; export default App; ``` 在上面的代码中,`diffText` 函数使用 `Diff` 模块来比较原始文本和修改后的文本,并返回一个包含差异数据的数组。然后在页面中展示这个数组,使用不同的背景颜色来标注增删改的差异数据。在 `差异数据编辑器` 部分,我们使用 BraftEditor 来展示差异数据,并且提供一个按钮来触发展示差异数据的操作。当用户点击按钮时,我们再次使用 `Diff` 模块来比较原始文本和修改后的文本,并将结果转换为 BraftEditor 的编辑器状态,最终展示出差异数据。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值