React富文本编辑器开发(三)

现在我们的编辑器显示的内容很单一,这自然不是我们的目标,让呈现的内容多元化是我们的追求。这就需要让编辑器能够接收多元素的定义。从初始数据的定义我们可以推断数据的格式远不止一种,那么其它类型的数据如何定义及呈现的呢,我们新建一个文件elements.jsx,创建一个元素组件:

_elements.jsx

export const CodeElement = props => {
    return (
        <pre {...props.attributes}>
            <code>{props.children}</code>
        </pre>
    )
}

这个组件平常的不能再平常了。就是一个 <pre/>元素。当然我们还要添加一个默认的渲染元素,如下所示:

export const DefaultElement = props => {
  return <p {...props.attributes}>{props.children}</p>
}

我们要让这个元素和数据对应起来,修改configure.jsx中的初始化值,添加如下内容:

_configure.jsx

export const initialValue = [
    {
        type: 'paragraph',
        children: [{ text: '这是一行段落文字,内容很少,但很重要!!' }],
    },

    {
        type: 'code',
        children: [{ text: '这是一代码行段落文字,内容很少,但很重要!!' }],
    },
];

我们增加一个code数据段。接下来要做的就是我们要设置一个渲染器, 根据数据类型的不同渲染不同的元素:

const renderElement = useCallback(props => {
    switch (props.element.type) {
      case 'code':
        return <CodeElement {...props} />
      default:
        return <DefaultElement {...props} />
    }
  }, [])

当然还要把这个渲染器指定给 EditablerenderElement属性:

<Editable
  renderElement={renderElement}
  onKeyDown={event => {
    if (event.key === '&') {
      event.preventDefault()
      editor.insertText('and')
    }
  }}
/>

完整的代码如下:

SDocer.jsx

import { useState } from 'react';
import { createEditor } from 'slate';
import { Slate, withReact, Editable } from 'slate-react';

import { initialValue } from './_configure';
import { CodeElement, DefaultElement } from './_elements';

function SDocer() {
  const [editor] = useState(() => withReact(createEditor()));

  const renderElement = useCallback(props => {
    switch (props.element.type) {
      case 'code':
        return <CodeElement {...props} />
      default:
        return <DefaultElement {...props} />
    }
  }, []);

  return (
    <Slate editor={editor} initialValue={initialValue}>
      <Editable
        renderElement={renderElement}
        onKeyDown={event => {
          if (event.key === '&') {
            event.preventDefault()
            editor.insertText('and')
          }
        }}
      />
    </Slate>
  )
}

export default SDocer;

效果如下:
在这里插入图片描述

现在新的要求来了,我们希望能动态的把选中的段落转换化<pre>元素,相反也能转化回默认元素。为了让两者的元素有较大的变化,我们对CodeElement元素组件加个样式,看下面的代码:

export const CodeElement = props => {
    return (
        <pre
            {...props.attributes}
            style={{
                fontSize: "20px",
                lineHeight: 2,
            }}
        >
    <code>{props.children}</code>
        </pre >
    )
}

然后对 SDocer修改如下:

import { useState, useCallback} from 'react';
import { createEditor, Editor, Transforms, Element } from 'slate';
import { Slate, withReact, Editable } from 'slate-react';

import { initialValue } from './_configure';
import { CodeElement, DefaultElement } from './_elements';

function SDocer() {
  const [editor] = useState(() => withReact(createEditor()));

  const renderElement = useCallback(props => {
    switch (props.element.type) {
      case 'code':
        return <CodeElement {...props} />
      default:
        return <DefaultElement {...props} />
    }
  }, []);

  return (
    <Slate editor={editor} initialValue={initialValue}>
      <Editable
        renderElement={renderElement}
        onKeyDown={event => {
          if (!event.ctrlKey) return;
          
          if (event.key === '`') {
            event.preventDefault()

            const [match] = Editor.nodes(editor, {
              match: n => n.type === 'code',
            })

            Transforms.setNodes(
              editor,
              { type: match ? 'paragraph' : 'code' },
              { match: n => Element.isElement(n) && Editor.isBlock(editor, n) }
            )
          }
        }}
      />
    </Slate>
  )
}

export default SDocer;

这样,如果您按 Ctrl + ' 时光标所在的块应该会变成一个代码块。再次按一次时就变成普通的文本段落。如下所示:

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/419685.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

装修效果图云渲染服务的时间效率分析

高质量的室内设计效果图对于展示设计方案和吸引客户至关重要&#xff0c;但其渲染过程往往耗时且可能导致项目进度延误。对设计师而言&#xff0c;提升渲染速度是至关重要的&#xff0c;因为这直接关系到他们的工作效率以及客户满意度。室内效果图的渲染时间通常受到图像复杂度…

Nginx 常用的基础配置(前端相关方面)

Nginx是一款高性能的Web服务器和反向代理服务器&#xff0c;广泛应用于互联网领域。作为一名前端同学&#xff0c;了解并掌握Nginx的配置是非常有必要的。 安装Nginx sudo apt-get update sudo apt-get install nginx查看Nginx版本 nginx -v启动、停止、重启Nginx服务 sudo …

C#学习(十四)——垃圾回收、析构与IDisposable

一、何为GC 数据是存储在内存中的&#xff0c;而内存又分为Stack栈内存和Heap堆内存 Stack栈内存Heap堆内存速度快、效率高结构复杂类型、大小有限制对象只能保存简单的数据引用数据类型基础数据类型、值类型- 举个例子 var c new Customer{id: 123,name: "Jack"…

Typora快捷键设置详细教程(内附每个步骤详细截图)

&#x1f60e; 作者介绍&#xff1a;我是程序员洲洲&#xff0c;一个热爱写作的非著名程序员。CSDN全栈优质领域创作者、华为云博客社区云享专家、阿里云博客社区专家博主、前后端开发、人工智能研究生。公粽号&#xff1a;程序员洲洲。 &#x1f388; 本文专栏&#xff1a;本文…

Win11系统安装安卓子系统教程

随着Win11系统的不断普及&#xff0c;以及硬件设备的更新换代&#xff0c;我相信很多同学都已经更新并使用到了最新的Win11系统。那么&#xff0c;Win11系统最受期待的功能“Windows Subsystem for Android”&#xff08;简称WSA&#xff09;&#xff0c;即《安卓子系统》。他可…

NodeJs 版本升级时Vue工程报错

最近把nodejs 的版本更新了&#xff0c;原来用的 16.15.1 现在用的 18.16.1&#xff0c;结果所有的vue工程都启不动了&#xff0c;一直报错。 1.报错截图 2.原因分析 error:03000086:digital envelope routines::initialization error &#xff0c;这个是nodejs版本的问题&am…

帆软图片设置之一张图片铺满整个屏幕

1、设置PC端自适应属性&#xff0c;字体自适应&#xff0c;双向自适应&#xff1b; 2、单元格属性–>对齐–>高级–>图片布局–>拉伸。

民爆5G智能制造工厂数字孪生可视化平台,推进民爆工业数字化转型

民爆5G工厂智能制造数字孪生可视化平台&#xff0c;推进行业数字化转型。民爆行业作为国家经济发展的重要支柱产业&#xff0c;其数字化转型对于提高生产效率、降低成本、保障安全等方面具有重要意义。而民爆5G工厂智能制造数字孪生可视化平台正是推进行业数字化转型的关键技术…

微信小程序iOS禁止上下拉显示白边

先上图暴露出问题 iOS端这个页面明明正好显示的&#xff0c;非要能下拉上拉给显示出来点白边。这样不就不好看了嘛。。 想了想是不是支持页面下拉导致的&#xff0c;加入以下代码到json文件中。 {"enablePullDownRefresh": false,"usingComponents": {} }…

JVM(4)

垃圾回收问题 垃圾回收算法 通过之前的学习我们可以将死亡对象标记出来了,标记出来后我们就可以进行垃圾回收操作了,在正式学习垃圾处理器之前,我们先来看一下垃圾回收器使用的几种算法. 标记-清除算法 "标记-清除"算法是基础的收集算法.算法分为"标记"…

【LeetCode】876_链表的中间结点_C

题目描述 给你单链表的头结点 head &#xff0c;请你找出并返回链表的中间结点。 如果有两个中间结点&#xff0c;则返回第二个中间结点。 https://leetcode.cn/problems/middle-of-the-linked-list/description/ 示例 提示&#xff1a; 链表的结点数范围是 [1, 100]1 <…

113.龙芯2k1000-pmon(12)- pmon源码对env的解析

本文回答前文思考的问题 112.龙芯2k1000-pmon&#xff08;11&#xff09;- gzrom-dtb.bin 文件的组成-CSDN博客 env写的位置是ff000 后面的500字节&#xff0c;这个位置能否改动呢&#xff1f; 答案是&#xff1a;不可以&#xff01;&#xff01;&#xff01; 否则需要改源码…

flink下载安装部署说明

下载 下载地址 flink-1.16.2下载安装包&#xff0c;flink-1.16.2-bin-scala-2.12.zip资源-CSDN文库 安装 解压目录 启动集群 ./start-cluster.sh 提交作业 ./bin/flink run examples/streaming/WordCount.jar 查看日志 停止集群 ./bin/stop-cluster.sh 开启webui vim c…

adb下载安装及使用教程

adb下载安装及使用教程 一、ADB的介绍1.ADB是什么&#xff1f;2.内容简介3.ADB常用命令1. ADB查看设备2. ADB安装软件3. ADB卸载软件4. ADB登录设备shell5. ADB从电脑上发送文件到设备6. ADB从设备上下载文件到电脑7. ADB显示帮助信息 4.为什么要用ADB 二、ADB的下载1.Windows版…

Components 概览

Components 概览 Compose 中的组件被声明为 Composable &#xff0c;中文意思是可组成的/可合成&#xff0c;也为了与原来 xml 和 View&#xff08;ViewGroup&#xff09;做出区分。在使用过程中会体会到&#xff0c;使用 Compose 声明 UI 更像是在拼图。 Compose 提供了 Mat…

2024年sCrypt编程马拉松即将开幕

BSV区块链的建设者们&#xff0c;你们在哪&#xff1f;2024年sCrypt编程马拉松即将拉开帷幕&#xff01; 2024年3月16日至17日&#xff0c;我们将在旧金山市举办一场以比特币智能合约&#xff08;即 sCrypt&#xff09;和比特币通证&#xff08;如Ordinals&#xff09;相结合为…

jstat命令查看jvm的GC信息

文章目录 前言jstat命令查看jvm的GC信息1. 概述2. 应用堆内存水位阀值大小怎么确定3. 使用 jps 命令查看 Java 进程的进程号&#xff08;PID&#xff09;![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/5097401443314e9d808a83b694dbc6e5.png)4. jstat用法5. 类加载…

农产品质量追溯系统—简介

概要 农产品质量安全事关广大人民群众的食用安全和身体健康。解决农产品质量安全问题,需要从源头开始抓好、抓实农产品安全监管工作。通过建立从产地到市场的全程质量控制系统和追溯制度,对农产品产地环境、生产过程、产品检测、包装盒标识等关键环节进行监督管理,提高广大…

php 把数字转化为大写中文

1. 120002129.25 转化后壹億贰仟萬贰仟壹佰贰拾玖圆贰角伍分2. 12000.2145 转化后壹萬贰仟圆贰角壹分肆厘伍毫3. 1020001211 转化后壹拾億贰仟萬壹仟贰佰壹拾壹圆整大致思路这样的: 从小数点分割成两部分,整数部分和小数部分分别处理。 整数四个一组进行处理,用substr函数分…

SpringBoot 事务失效及其对应解决办法

简介 本文主要讲述Spring事务会去什么情况下失效及其解决办法 Spring 通过AOP 进行事务控制&#xff0c;如果操作数据库报异常&#xff0c;则会进行回滚&#xff1b;如果没有报异常则会提交事务&#xff1b;但是&#xff0c;如果Spring 事务失效&#xff0c;会导致数据缺失/重…