react-codemirror实现log日志文件的输出

标签: react-codemirror  输出多行日志

在做react项目时,碰到一个需求,需要将收集到的日志信息输入到页面上,而且高亮显示,这样方便用户/管理员查看。形似这样:

本来的思路是:通过js去读取日志文件中的内容,然后将日志一行一行的输出到文本域中,然后根据指定的字符串切割,显示不同的颜色,但是考虑到左侧需要显示行号以及日志的高亮显示,这样做起来就很麻烦。于是在网上搜罗了一下发现,codemirror专门为react做了一个组件react-codemirror.

研究了一下看看这个是怎么在react中使用的,怎么实现多行显示。

1.安装

npm install @uiw/react-codemirror --save

2.在js中引入

import CodeMirror from '@uiw/react-codemirror';
import 'codemirror/keymap/sublime';
import 'codemirror/theme/eclipse.css';
import 'codemirror/theme/monokai.css';

其中eclipse.css和monokai.css是两种不一样的主题,第一种是在eclipse打开时的高亮形式,第二种是在monokai中的高亮形式,在组件中的options配置项中会用得到

3.使用组件

render() {
        return (
            <div>
                <CodeMirror
                    value={this.state.code}
                    options={{
                        theme: 'eclipse',
                        tabSize: 0,
                        keyMap: 'sublime',
                        mode: 'jsx',
                    }}
                    onBeforeChange={(editor, data, value) => {
                        this.setState({ value });
                    }}
                    onChange={(editor, value) => {
                        console.log('controlled', { value });
                    }}
                />
            </div>
        );
    }

4.定义value和options

value:官方给出的定义是 string|document object类型的。也就是说只能接受字符串和一个document的object对象。

          显示字符串很简单。

constructor(props) {
        super(props);
        this.state = {
            code: 'Oct 23 2019 17:06:35.664| [Radius Auth Proxy Listener] [INFO ] org.tinyradius.util.RadiusServer [APPID:UPAM] thread interrupted...reinterrupt'
        }
    }

效果也是如图显示:

但这样不符合我的需求,因为我需要显示多行,至少得是个数组的形式才能显示多行。但API中给出的只能是个字符串,于是就在想既然类型中可以是document对象,我能不能使用<br/>的形式来实现换行呢。测试了结果不行。

换一种思路,能不能使用多个codemirror来实现呢?结果可以预料,它显示的是多个codemirror,行号都是1.

没办法在网上搜罗一番,没有找到合适的,大都是对API的翻译,没有借鉴意义。

于是只能回归到对原始API的研究。

看了半天,终究还是想到换行的方法。

既然使用html的br没效果,是不是针对编译器有自己的换行方式呢?

想了想,最后定位在\n上。

意识尝试了一下,将原本多行的字符串使用\n的形式来进行拼接,果不其然,能够很好地实现换行,并且显示正确的行数以及高亮。

constructor(props) {
        super(props);
        this.state = {
            code: 'Oct 23 2019 17:06:35.664| [Radius Auth Proxy Listener] [INFO ] org.tinyradius.util.RadiusServer [APPID:UPAM] thread interrupted...reinterrupt\n'+
            'Oct 23 2019 17:06:35.665| [Radius Auth Listener] [INFO ] org.tinyradius.util.RadiusServer [APPID:UPAM] thread interrupted...reinterrupt\n'+
            'Oct 23 2019 17:06:35.664| [Radius Acct Listener] [INFO ] org.tinyradius.util.RadiusServer [APPID:UPAM] thread interrupted...reinterrupt\n'+
            'Oct 23 2019 17:06:35.737| [Radius Auth Proxy Listener] [INFO ] org.tinyradius.util.RadiusServer [APPID:UPAM] thread interrupted...reinterrupt\n'+
            'Oct 23 2019 17:06:35.738| [Radius Auth Listener] [INFO ] org.tinyradius.util.RadiusServer [APPID:UPAM] thread interrupted...reinterrupt\n'+
            'Oct 23 2019 17:06:35.738| [Radius Acct Listener] [INFO ] org.tinyradius.util.RadiusServer [APPID:UPAM] thread interrupted...reinterrupt\n'+
            'Oct 23 2019 17:06:35.738| [Radius Auth Proxy Listener] [INFO ] org.tinyradius.util.RadiusServer [APPID:UPAM] thread interrupted...reinterrupt\n'+
            'Oct 23 2019 17:06:35.738| [Radius Auth Listener] [INFO ] org.tinyradius.util.RadiusServer [APPID:UPAM] thread interrupted...reinterrupt\n'+
            'Oct 23 2019 17:06:35.738| [Radius Acct Listener] [INFO ] org.tinyradius.util.RadiusServer [APPID:UPAM] thread interrupted...reinterrupt\n'+
            'Oct 23 2019 17:06:35.738| [Radius Auth Proxy Listener] [INFO ] org.tinyradius.util.RadiusServer [APPID:UPAM] thread interrupted...reinterrupt'
        }
    }

代码效果如下:

无意中看到了一篇文章,关于react-codemirror的,其中也提到了使用\n的形式。

参考一下文章:

https://uiwjs.github.io/react-codemirror/

https://github.com/JedWatson/react-codemirror/blob/master/example/src/example.js

这样就可以正常的显示我们的日志文件了。

多行显示的问题解决了,下面就是读取日志文件的操作了。

经过深思熟虑,觉得读取日志文件的这种操作应该交给后台去操作。对于读取静态资源文件一般不要在前端操作,这样会暴露文件。后台读取到对应的文件并将文件内容以json/string的形式拼接\n后返回给前端。

options的配置项我就不再说了,上面的链接中都给出了,可以根据自己的需要选择不同的主题。

关于使用codemirror的使用中最值得注意的应该是这点。当然有的需求是用户可以编辑的,然后将代码保存。而我的需求是显示代码,所以是两个操作。

 

 

版权声明:本文为chenqk_123原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/chenqk_123/article/details/102780427

智能推荐

C# log4net的使用。输出的日志内容的文件名和行号。

一、NuGet上安装log4net 二、添加log4net.config文件 在configuration中添加如下配置: 三、配置AssemblyInfo.cs AssemblyInfo.cs中添加:[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", Watch = true)] 四...

Log4j日志不输出的问题

Log4j日志不输出的问题 1.控制台和文件都不输出       这个首先要了解log4j日志输出的五个级别:       首先需要了解logger 事件有五类,级别依次增大,注意,log4j是默认不输出比设置级别低的日志信息的。 注意你是不是调整了输出级别太高,导致日志文件不输出。 2.控制台输出,但是文件不输出   &nbs...

Git的简单使用教程(上)

参考博客:https://blog.csdn.net/Cheny_Yang/article/details/89047680 1. 下载git 下载链接:https://gitforwindows.org/ 大家各取所需,下载自己需要的版本,无脑式安装即可。 2. 设置邮箱和用户 安装好git后,需要设置自己的邮箱和用户名,右键在Git Bash中输入下面的命令。 设置用户名和邮箱地址的作用是: ...

260_整合版

1.JAVA中的几种基本数据类型是什么,各自占用多少字节? 答: 常见问题: 1.byte,short,int 计算自动提升类[41] 型, 2. 自动转换:byte-->short-->int-->long-->float-->double (从小到大) 强制转换:1.容易丢失精度,产生误差(小数点后面的全部舍弃) 2.赋值时容易超出取值范围 数...

猜你喜欢

自动化测试之绕过验证码登录

这几天北京下大雨了,现在的自己已经圆满的成为了“北漂”,最悲催的上班不小心滑倒了,手划到了瓷砖上,去医院缝了好几针,哇~ 那感觉feel倍爽 。最近出了新项目,做了一点自动化,在这里用单手秀了一波“走位”------绕过验证码登录。 在这里总结了常见的几种方法,仅供参考。 话不多说,开整! 方法一 去掉验证码。让开发在测试版上面的验证码注销...

寻找两个三角形重合部分的最大三角形

如图所示,两个三角形重合存在很多种情况,上图举出其中4个例子,本文要讲的是已知两个三角形三个顶点坐标,求重叠部分最大三角形的顶点坐标; 虽然已知顶点坐标,位置关系已经确定,但是编程解决的是一类问题,所以各种情况还是要考虑到。 定义变量保存结果   两个三角形的坐标变量 第一步做的是判断有没有三角形的一个顶角是否在另一个三角形内部,如果有那么这个顶角一定是内部最大三角形的一个顶点 第二步计...

10、java中的原子类AtomicInteger详解(基于jdk1

java并发包里面的类一直是学习和面试的重点,这篇文章主要是对java并发包的其中一个类AtomicInteger的讲解。从为什么要出现AtomicInteger再到其底层原理来一个分析。 一、从a++说起为什么使用AtomicInteger 我们知道java并发机制中主要有三个特性需要我们去考虑,原子性、可见性和有序性。synchronized关键字可以保证可见性和有序性却无法保证原子性。而这个...

适配器模式

在设计模式中,适配器模式(英语:adapter pattern)有时候也称包装样式或者包装(wrapper)。将一个类的接口转接成用户所期待的。一个适配使得因接口不兼容而不能在一起工作的类能在一起工作,做法是将类自己的接口包裹在一个已存在的类中。–维基百科 适配器模式包含如下角色: Target(目标抽象类) Adapter(适配器类) Adaptee(适配者类) Client(客户类...

⭐⭐⭐【LCA】LeetCode 236. Lowest Common Ancestor of a Binary Tree

文章目录 题目描述 知识点 结果 实现 码前思考 代码实现 码后反思 题目描述 知识点 树 结果 实现 码前思考 设置一个函数bool find(TreeNode* root,TreeNode* p,TreeNode *q),代表以root为根结点的树,是否存在p或者q; 设置一个flag变量由于标记是否找到lca,这样可以用于剪枝 对于递归函数里面需要分情况进行讨论: 第一种情况:p,q分别在左...