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

在做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的使用中最值得注意的应该是这点。当然有的需求是用户可以编辑的,然后将代码保存。而我的需求是显示代码,所以是两个操作。

 

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
实现 Markdown 编辑器,可以使用 Reactreact-codemirror2 库,这个库提供了一个 React 组件来集成 CodeMirror 编辑器。 首先,安装依赖: ``` npm install --save react-codemirror2 codemirror markdown-it ``` 然后,在组件中引入需要的模块: ```js import React, { useState } from 'react'; import { Controlled as CodeMirror } from 'react-codemirror2'; import 'codemirror/lib/codemirror.css'; import 'codemirror/mode/markdown/markdown'; import 'codemirror/theme/material.css'; import MarkdownIt from 'markdown-it'; ``` 在组件中,使用 useState 来管理 Markdown 源代码和渲染结果: ```js const [value, setValue] = useState(''); const [result, setResult] = useState(''); ``` 然后,在 CodeMirror 组件中设置相关属性: ```js <CodeMirror value={value} onBeforeChange={(editor, data, value) => { setValue(value); }} options={{ mode: 'markdown', theme: 'material', lineNumbers: true, }} /> ``` 在文本变化时,使用 MarkdownIt 库将源代码转换为 HTML: ```js const md = new MarkdownIt(); const handleRender = () => { setResult(md.render(value)); }; ``` 最后,将渲染结果显示在页面上: ```js <div dangerouslySetInnerHTML={{ __html: result }} /> ``` 完整代码如下: ```js import React, { useState } from 'react'; import { Controlled as CodeMirror } from 'react-codemirror2'; import 'codemirror/lib/codemirror.css'; import 'codemirror/mode/markdown/markdown'; import 'codemirror/theme/material.css'; import MarkdownIt from 'markdown-it'; const MarkdownEditor = () => { const [value, setValue] = useState(''); const [result, setResult] = useState(''); const md = new MarkdownIt(); const handleRender = () => { setResult(md.render(value)); }; return ( <div> <CodeMirror value={value} onBeforeChange={(editor, data, value) => { setValue(value); }} options={{ mode: 'markdown', theme: 'material', lineNumbers: true, }} /> <button onClick={handleRender}>Render</button> <div dangerouslySetInnerHTML={{ __html: result }} /> </div> ); }; export default MarkdownEditor; ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值