BraftEditor的使用

9 篇文章 0 订阅

因为自己使用的是存函数所以简单记录一下,因为官网上没有对存函数的试用,所以还是要用到onchange或者onBlur都可以来获取文本框中的值,但是又因为文本框返回的是函数,所以要转成标签格式

<BraftEditor value={content} onChange={async (val) => setContent(val.toHTML())} ></BraftEditor>

在利用useState来赋值

const [content, setContent] = useState()
//修改时显示
setContent(BraftEditor.createEditorState(values?.content))

提交的时候直接给值就可以了。
如果阁下使用的是非存函数组件请移步官网官网

具体使用

占时自定义只设计到图片自定义上传
讲下具体流程

  • 首先具体定义参数初始化内容
const [content, setContent] = useState(BraftEditor.createEditorState(null))

这里这样初始化也是考虑到图片上传是会出现getSelect undefined 的问题
后面就是在onChange事假中传的是editorState

<BraftEditor
              controls={controls}
              value={introduce}
              onChange={(editorState) => { setIntroduce(editorState) }}
              extendControls={extendControlsIntroduce}
            >

这里需要注意的就是,官网给的是类函数传值,
在这里插入图片描述
这里用useState不要带大括号,不然会有意想不到的错误,然后就是在处理图片上

const extendControlsContent: any = [
    {
      key: 'antd-uploader',
      type: 'component',
      component: (
        <Upload
          accept="*"
          showUploadList={false}
          onChange={handleImageContentChange}
          action='http://127.0.0.1:9097/upload/image'
        >
          <button type="button" className="control-item button upload-button" data-title="插入图片">上传图片</button>
        </Upload>
      )
    }
  ]

这里我们依然用的是onChange事件

	const handleImageContentChange = (info: any) => {
    if (info?.file?.response?.message == "success") {
      setContent(ContentUtils.insertMedias(content, [{
        type: 'IMAGE',
        url: info?.file?.response?.url
      }]))
    }
  }

具体实现结果
在这里插入图片描述
下面附上我这个完整的form表单代码,供大家参考

import React, { useState, useEffect } from "react";
import { Card, DatePicker, Form, message, Upload } from "antd"
import BraftEditor from "braft-editor"
import "braft-editor/dist/index.css"
import ProForm, { ProFormSelect, ProFormText } from "@ant-design/pro-form";
import { addArticle, updateArticle } from "@/services/api-type/api";
import { useLocation, history } from "umi";
import moment from "moment";
import { ContentUtils } from "braft-utils"

const UpdateForm: React.FC<any> = (props) => {
  const [form] = Form.useForm()
  const location: any = useLocation()
  const { ...values } = location.query?.values
  const [introduce, setIntroduce] = useState(BraftEditor.createEditorState(null))
  const [content, setContent] = useState(BraftEditor.createEditorState(null))

  //富选框参数
  const controls: any = ['undo', 'redo', 'separator',
    'font-size', 'line-height', 'letter-spacing', 'separator',
    'text-color', 'blod', 'italic', 'underline', 'strike-through', 'separator',
    'superscript', 'subscript', 'remove-styles', 'emoji', 'separator', 'text-indent', 'text-align', 'separator',
    'headings', 'list-ul', 'list-ol', 'blockquote', 'code', 'separator',
    'link', 'separator', 'hr', 'separator',
    'clear', 'separator',
  ]

  useEffect(() => {
    if (values?.id) {
      setContent(BraftEditor.createEditorState(values?.content))
      setIntroduce(BraftEditor.createEditorState(values?.introduce))
    }
  }, [])
  const onFinish = async (val: any) => {
    if (values?.id) {
      val.id = values?.id
    }
    val.introduce = introduce.toHTML()
    val.content = content.toHTML()
    const hide = message.loading('正在更新');
    try {
      let response
      if (values?.id) {
        response = await updateArticle(val as API.ArticleListItem)
      } else if (!values?.id) {
        response = await addArticle(val as API.ArticleListItem)
      }
      if (response?.code === 10000) {
        hide()
        message.success('更新成功');
        history.goBack()
      }
    } catch (error) {
      hide();
      message.error('添加失败请重试!');
    }
  }
  const handleImageContentChange = (info: any) => {
    if (info?.file?.response?.message == "success") {
      setContent(ContentUtils.insertMedias(content, [{
        type: 'IMAGE',
        url: info?.file?.response?.url
      }]))
    }
  }
  const handleImageIntroduceChange = (info: any) => {
    if (info?.file?.response?.message == "success") {
      setIntroduce(ContentUtils.insertMedias(introduce, [{
        type: 'IMAGE',
        url: info?.file?.response?.url
      }]))
    }
  }
  const extendControlsIntroduce: any = [
    {
      key: 'antd-uploader',
      type: 'component',
      component: (
        <Upload
          accept="*"
          showUploadList={false}
          onChange={handleImageIntroduceChange}
          action='http://127.0.0.1:9097/upload/image'
        >
          <button type="button" className="control-item button upload-button" data-title="插入图片">上传图片</button>
        </Upload>
      )
    }
  ]

  const extendControlsContent: any = [
    {
      key: 'antd-uploader',
      type: 'component',
      component: (
        <Upload
          accept="*"
          showUploadList={false}
          onChange={handleImageContentChange}
          action='http://127.0.0.1:9097/upload/image'
        >
          <button type="button" className="control-item button upload-button" data-title="插入图片">上传图片</button>
        </Upload>
      )
    }
  ]

  return (
    <Card>
      <ProForm onFinish={onFinish} initialValues={{ ...values }} form={form}>
        <ProForm.Group>
          <ProFormText width="lg" name="title" label="标题" placeholder="请输入标题"></ProFormText>
          <ProFormSelect name="typeId" label="分类" placeholder="请选择文章分类"></ProFormSelect>
          <Form.Item
            name="create_at"
            label="创建日期"
            getValueFromEvent={(val: any) => { return val.valueOf() }}
            getValueProps={(val: any) => moment(val)}
          >
            <DatePicker
              defaultValue={values?.create_at ? moment(values?.create_at) : undefined}
              format="YYYY/MM/DD"
              placeholder="请输入创建日期">
            </DatePicker>
          </Form.Item>
        </ProForm.Group>
        <Card >
          <ProForm.Item
            label="文章简介"
          >
            <BraftEditor
              controls={controls}
              value={introduce}
              onChange={(editorState) => { setIntroduce(editorState) }}
              extendControls={extendControlsIntroduce}
            >

            </BraftEditor>
          </ProForm.Item>
        </Card>
        <Card >
          <ProForm.Item
            label="文章内容"
          >
            <BraftEditor
              value={content}
              controls={controls}
              onChange={(editorState) => { setContent(editorState) }}
              extendControls={extendControlsContent}
            ></BraftEditor>
          </ProForm.Item>
        </Card>
      </ProForm>
    </Card>
  )
}
export default UpdateForm

多嘴提一句,这里使用的是ProComponents组件,是根据antd封装的,使用antd组件中的form结果相同,不影响效果,还有就会这没有调节样式。就这些
本文连接点击
博主个人小博客:嘿嘿

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
好的,可以使用 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 的编辑器状态,最终展示出差异数据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值