这里实现的是,参数管理功能,新建或者编辑的时候会弹出一个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 || '')
}
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 || '')
}
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 == '')) {
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);