zoukankan      html  css  js  c++  java
  • react-draft-wysiwyg富文本

     
    import { EditorState, convertToRaw } from 'draft-js';
    import { Editor } from 'react-draft-wysiwyg';
    import draftToHtml from 'draftjs-to-html';
    import draftToMarkdown from 'draftjs-to-markdown';
    import htmlToDraft from 'html-to-draftjs';
    import '../../../node_modules/react-draft-wysiwyg/dist/react-draft-wysiwyg.css';
     
    const content = { "entityMap": {}, "blocks": [{ "key": "637gr", "text": "", "type": "unstyled",
    "depth": 0, "inlineStyleRanges": [], "entityRanges": [], "data": {} }] };
     
    class EditForm extends React.Component {
    constructor(props) {
    super(props)
    this.state = {
    editorState: EditorState.createEmpty(),
    contentState: content
    }
    }
    onEditorStateChange = (editorState) => {
    this.setState({
    editorState,
    });
    };
    onContentStateChange = (contentState) => {
    this.setState({
    contentState,
    });
    };

    uploadImageCallBack = (info) => {
    return new Promise(function (resolve, reject) {
    let formData = new window.FormData()
    formData.append('file', info, info.name)
    Axios({
    headers: {
    'Content-Type': 'multipart/form-data'
    },
    method: 'post',
    data: formData,
    url: 'http://192.168.5.14:8081/node/file_upload'
    }).then(res => {
    if (res.data.code === 200) {
    let imgurl = res.data.result[0].photoBig
    let imgObj = {
    data: {
    link: 'http://192.168.5.14:8081/' + imgurl
    }
    }
    resolve(imgObj)
    } else {
    }
    }, err => {
    console.log('err', err)
    })
    })
    }
    handleSubmit = (e) => {
    e.preventDefault();
    const { editorState } = this.state;
    this.props.form.validateFields((err, values) => {
    if (!err) {
    console.log(999,values)
    const submitData = {
    title: values.title,
    zhaiyao:values.zhaiyao,
    image:values.image,
    biaoqian:values.biaoqian,
    content: values.content.toHTML()// or values.content.toHTML()
    }
    console.log(submitData)
    }
    // values.content = draftToHtml(convertToRaw(editorState.getCurrentContent()))
    // console.log(values)
    })
    }
     
    render() {
     
    const { getFieldDecorator } = this.props.form;
    const { editorState, contentState } = this.state;
    const formItemLayout = {
    labelCol: {
    xs: { span: 24 },
    sm: { span: 6 },
    },
    wrapperCol: {
    xs: { span: 24 },
    sm: { span: 16 },

    },
    };
    return (
    <div>
    <Form onSubmit={this.handleSubmit} className='container333'>
    <FormItem
    label="请输入主标题:"
    {...formItemLayout}
    >
    {getFieldDecorator('title', {
    rules: [{
    required: true, message: '请输入主标题名称',
    }],
    })(
    <Input placeholder="请输入主题" />
    )}
    </FormItem>
    <FormItem
    label="摘要:"
    {...formItemLayout}
    >
    {getFieldDecorator('zhaiyao', {
    rules: [{
    required: true, message: '限制200个字',
    }],
    })(
    <TextArea placeholder="限制200个字" autosize={{ minRows: 5, maxRows: 5 }} />
    )}
    </FormItem>
    <FormItem
    label="封面图片:"
    {...formItemLayout}
    >
    {getFieldDecorator('image', {
    rules: [{
    required: true, message: '请上传封面图片',
    }],
    })(
    <div>
    <Uploading />
    </div>
    )}
    </FormItem>
    <FormItem
    label="文章标签:"
    {...formItemLayout}
    >
    {getFieldDecorator('biaoqian')(
    <RadioGroup name="radiogroup" >
    <Radio name='feel' value='new' style={{ 20, height: 20 }} /><label style={{ marginRight: 40 }}>new</label>
    <Radio name='feel' value='hot' style={{ 20, height: 20 }} /><label>hot</label>
    </RadioGroup>
    )}
    </FormItem>
    <FormItem
    label="内容编辑器:"
    {...formItemLayout}
    >
    {getFieldDecorator('content', {
    validateTrigger:'onBlur',
    rules: [
    { required: true},
    {validator:(rule,value,callback)=>{
    if (value.isEmpty()) {
    callback('请输入正文内容')
    } else {
    callback()
    }
    }
    }
    ]
    })(
    <Editor
    editorState={editorState}
    onEditorStateChange={this.onEditorStateChange}
    onContentStateChange={this.onContentStateChange}
    wrapperClassName="wrapper-class"
    editorClassName="editor-class"
    toolbarClassName="toolbar-class"
    localization={{ locale: 'zh' }}
    toolbar={{
    image: {
    previewImage: true,
    uploadEnabled: true,
    urlEnabled: true,
    uploadCallback: this.uploadImageCallBack,
    alt: { present: true, mandatory: true }
    }
    }}
    />
     
    )}
    </FormItem>
    <div className='footer11'>
    <div className='footer-right'>
    每5分钟保存一次
    </div>
    </div>
    <div className='footerbox'>
    <Button type='primary' size='large' htmlType="submit" style={{ marginRight: 10, marginLeft: 10 }} className='save'>保存</Button>
    <Button type='primary' size='large'>预览</Button>
    </div>
    </Form>
    {/* <div className='footerbox'>
    <Button type='primary' key='submit' size='large' style={{marginRight:10,marginLeft:10}} className='save'>保存</Button>
    <Button type='primary' size='large' onClick={()=>setPreviewType('publishCode2')}>预览</Button>
    </div> */}
    </div>
    )
    }
    }
    const WrappedEditForm = Form.create()(EditForm);
    export default WrappedEditForm
  • 相关阅读:
    关于this关键字
    Java元注解
    缩点+spfa最长路【bzoj】 1179: [Apio2009]Atm
    使用Windows API进行串口编程
    串口编程基础知识
    设计模式--代理模式
    用Java实现断点续传的基本思路和代码
    断点续传的原理
    JAVA的StringBuffer类
    StringBuilder用法
  • 原文地址:https://www.cnblogs.com/xufeimei/p/9804659.html
Copyright © 2011-2022 走看看