next.js博客搭建_react-markdown渲染内容(第三步)

news2024/12/29 10:32:49

文章目录

    • ⭐前言
    • ⭐引入react-markdown
      • 💖 使用markdown渲染
      • 💖 文章内容布局
      • 💖 react-syntax-highlighter代码高亮
    • ⭐结束

⭐前言

大家好,我是yma16,本期给大家分享next项目中使用react-markdown渲染内容。
该系列的往期文章
博客搭建_初始化next项目
博客搭建_登录注册

⭐引入react-markdown

npm 安装

$ npm install react-markdown

yarn 安装

$ yarn add react-markdown

这里我选择npm
npm-install

💖 使用markdown渲染

示例渲染 hellow csdn

import React from 'react'
import ReactMarkdown from 'react-markdown'
import ReactDom from 'react-dom'

ReactDom.render(<ReactMarkdown># Hello, *CSDN* ,I am yma16!</ReactMarkdown>, document.body)

react-markdown-render

💖 文章内容布局

结构
采用左右结构

  • 左侧 标题
  • 右侧 内容

最外层组件

import React, { useState, useEffect } from 'react';
import {getArticleList} from "../../service/article/article"
import MdContent from './markdown/MdContent'
import MdTitle from './title/MdTitle'

export default  function Article(){
    const [state, setState]:any = useState({
        content:'',
        titleArray:[]
    });
    const [loading,setLoading]=useState(true)

    const getArticleData=async ()=>{
        try{
            const res=await getArticleList({})
            console.log('res article',res)
            const {data}=res
            if(data.code){
                const content=data.article&&data.article[0]
                const titleArray=data['title']||[]
                setState({
                     ...state,
                    titleArray:titleArray,
                    content:content,
                })
                setLoading(false)
                console.log('state 远程数据',state)
            }
        }catch (e) {
            setLoading(true)
            console.error(e)
        }
    }
    useEffect(()=>{getArticleData()},[])
    // 左右结构
    return ( <>
        {
            loading? '加载中':
                <div className={'article-container'}>
                <div className={'article-container-left'}>
                    <MdTitle titleArray={state.titleArray} loading={loading}></MdTitle>
                </div>
                <div className={'article-container-right'}>
                    <MdContent content={state.content} loading={loading}></MdContent>
                </div>
            </div>
        }
    </>)
}

左侧标题

import React ,{useState,useEffect}from 'react';

function renderTitle(state) {
    if(!state.titleArray||state.titleArray.length===0){
        return <></>
    }
    else if(state.titleArray.length){

        return  state.titleArray.map((name,index)=> {
            return <li key={index}>{name}</li>
        })
    }

}
export default function MdTitle(props){
    const [state,setState]=useState({
        titleArray:[]
    })
    useEffect(()=>{
        setState({
            ...state,
            titleArray:[...props.titleArray]
        })
    },[])

    return (<>
        <div>
            {
                renderTitle(state)
            }
        </div>
    </>)
}

右侧markdown

import ReactMarkdown from 'react-markdown'
import React, { useEffect, useState } from "react";

export default function MdContent(props){
    const [state,setState]=useState({
        content:''
    })
    useEffect(()=>{
        console.log('articleContent',props.content)
        setState({
            ...state,
            content:props.content
        })
    },[])
    return (
        <>
            <ReactMarkdown>{state.content}</ReactMarkdown>
        </>
    )
}

样式

.article-container{
    display: flex;
    overflow: hidden;
}


.article-container-left{
    margin: 20px;
    width:300px;
    max-height: 900px;
}


.article-container-right{
    margin: 20px;
    max-width:1200px;
    max-height: 900px;
    overflow-y: auto;
}

效果:

在这里插入图片描述

💖 react-syntax-highlighter代码高亮

引入hljs

$ npm install react-syntax-highlighter

高亮代码配置:

import React, { useEffect, useState } from "react";
import ReactMarkdown from 'react-markdown'
// @ts-ignore
import {Prism as SyntaxHighlighter} from 'react-syntax-highlighter'
// @ts-ignore
import {dark} from 'react-syntax-highlighter/dist/esm/styles/prism'
export default function MdContent(props){
    const [state,setState]=useState({
        content:''
    })
    useEffect(()=>{
        setState({
            ...state,
            content:props.content
        })
    },[props.content])

    return (
        <>
            <ReactMarkdown
                children={state.content}
                components={{
                    code({node, inline, className, children, ...props}) {
                        const match = /language-(\w+)/.exec(className || '')
                        return !inline && match ? (
                            <SyntaxHighlighter
                                {...props}
                                children={String(children).replace(/\n$/, '')}
                                style={dark}
                                language={match[1]}
                                PreTag="div"
                            >
                            </SyntaxHighlighter>
                        ) : (
                            <code {...props} className={className}>
                                {children}
                            </code>
                        )
                    }
                }}
            >
            </ReactMarkdown>
        </>
    )
}

⭐结束

本文分享react渲染markdown内容结束
💖 感谢你的阅读💖
scene-city

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

考研C语言第八章

结构体定义&#xff0c;初始化&#xff0c;结构体数组 结构体对齐 这个东西看着像数据库里面属性的定义&#xff0c;也像java里面的类的定义 #include <stdio.h> #include <string.h> #include <stdlib.h>struct student{int num;char name[20];char sex;i…

chatgpt赋能python:Python桌面编程:探索图形用户界面

Python桌面编程&#xff1a;探索图形用户界面 Python是一种广受欢迎的高级编程语言&#xff0c;被广泛应用于数据科学、人工智能、Web开发和自动化。但是&#xff0c;随着越来越多的应用程序向图形用户界面&#xff08;GUI&#xff09;转移&#xff0c;Python的桌面编程能力也…

datagrip 连接 phoenix

jar替换完后尽量重启datagrip. 然后重新连接即可. 不重启貌似报错... 效果:

chatgpt赋能python:Python更新界面:让你的应用更美观、更易用

Python更新界面&#xff1a;让你的应用更美观、更易用 Python是一门强大的编程语言&#xff0c;广泛应用于软件开发、数据分析、机器学习等领域。其中&#xff0c;Python的GUI开发能力也非常出色。Python支持多种GUI库&#xff0c;如Tkinter、PyQt、wxPython等&#xff0c;可以…

【C++篇】C++新增的一些基础特性

友情链接&#xff1a;C/C系列系统学习目录 知识总结顺序参考C Primer Plus&#xff08;第六版&#xff09;和谭浩强老师的C程序设计&#xff08;第五版&#xff09;等&#xff0c;内容以书中为标准&#xff0c;同时参考其它各类书籍以及优质文章&#xff0c;以至减少知识点上的…

Python--字典

Python--字典 <font colorblue>一、创建字典<font colorblue>二、访问字典元素<font colorblue>三、字典的增、删、查、改<font colorblue>1、添加元素<font colorblue>2、删除元素<font colorblue>3、查找元素<font colorblue>4、修…

Git——分布式版本控制系统

简介 Git是一个开源的分布式版本控制系统&#xff0c;可以高效的处理从小到很大的项目版本管理。 分类 集中式 SVN&#xff0c;CVS 使用单一的服务器用来管理和存储所有文件的修订版本&#xff1b;协同开发的成员拉取或提交都需连接到这台服务器&#xff1b;如果服务器宕机…

电控开关详细介绍 MOSFET

目录 NMOS MOSFET的开关模型 现实生活中MOSFET的截面图 输出特性曲线 总结 MOSFET的SCS模型 MOSFET的SR模型 进一步分析 例子 PMOS CMOS(Complementary Metal-Oxide-Semiconductor) NMOS 金属氧化物半导体场效应晶体管 这是一个什么样的结构呢&#xff1f; 对于…

2023 年6月开发者调查统计结果——最流行的技术(2)

2023 年6月开发者调查统计结果——最流行的技术&#xff08;2&#xff09; 本文目录&#xff1a; 二十三、编程、脚本和标记语言 二十四、数据库 二十五、云平台 二十六、网络框架和技术 二十七、其他框架和库 二十八、其他工具 二十九、集成开发环境 三十、异步工具 …

chatgpt赋能python:Python查错完全指南:如何快速诊断和解决常见的错误

Python查错完全指南&#xff1a;如何快速诊断和解决常见的错误 Python是一种高级编程语言&#xff0c;它被广泛用于数据科学、机器学习、Web开发和自动化等领域。虽然Python具有易于学习和易于使用的特点&#xff0c;但是在编写复杂的应用程序时&#xff0c;错误和异常情况经常…

chatgpt赋能python:Python构造图入门指南

Python构造图入门指南 Python是一种非常强大的编程语言&#xff0c;它可以用于各种任务&#xff0c;包括数据分析、机器学习和深度学习等领域。其中&#xff0c;构造图是Python在数据分析领域的一项非常重要的技术&#xff0c;本文将为大家介绍Python构造图的入门指南。 什么…

chatgpt赋能python:Python查找手机号码

Python查找手机号码 在今天的数字时代&#xff0c;手机号码已成为每个人生活中必不可少的一部分。虽然我们可以轻松地拥有一部手机&#xff0c;但是对于那些需要通过电话来联系客户、朋友或家庭成员的人&#xff0c;获取正确的手机号码就显得尤为重要。 这就是为什么Python查…

【科普知识】如何解决CANopen通信一体化伺服电机PDO无法正常使用

随着现代的自动化程度不断提高&#xff0c;一体化电机的应用正逐渐成为行业的新趋势。 一体化伺服电机是现代工业自动化系统中常用的设备&#xff0c;它集成了伺服电机、驱动器和控制器等功能&#xff0c;提供了高效、精确的运动控制。在其系统中&#xff0c;我们通常使用PDO&a…

vue封装ketcher 化学式、分子式编辑器

ketcher是一个化学结构式编辑器&#xff08;github地址&#xff09;&#xff0c;ketcher插件提供了传统的html standalone版、npm包react版&#xff0c;并没有npm包vue版&#xff0c;集成到vue的原理是将standalone版嵌到iframe中&#xff0c;通过拿到iframe中的ketcher对象&am…

解决Armbian安装UFW防火墙后无法访问1Panel面板的问题:有效解决方案揭秘

文章目录 前言armbian安装防火墙原因分析解决方案第一步&#xff1a;查看1panel的面板入口端口第二步&#xff1a;打开指定端口的访问权限第三步&#xff1a;重启防火墙第四步骤&#xff1a;查看防火墙状态【可略】 前言 官方的教程很不错&#xff0c;但是还是有一些缺陷&…

第四章 ResNet网络详解

系列文章目录 第一章 AlexNet网络详解 第二章 VGG网络详解 第三章 GoogLeNet网络详解 第四章 ResNet网络详解 第五章 ResNeXt网络详解 第六章 MobileNetv1网络详解 第七章 MobileNetv2网络详解 第八章 MobileNetv3网络详解 第九章 ShuffleNetv1网络详解 第十章…

.net 软件开发模式——三层架构

三层架构是一种常用的软件开发架构模式&#xff0c;它将应用程序分为三个层次&#xff1a;表示层、业务逻辑层和数据访问层。每一层都有明确的职责和功能&#xff0c;分别负责用户交互、业务处理和数据存储等任务。这种架构模式的优点包括易于维护和扩展、更好的组织结构和代码…

Vue的详细安装教程,使用NVM安装是我所推荐的方式

第一步&#xff1a;卸载之前安装的node&#xff0c;安装NVM 进入网站&#xff1a;Releases coreybutler/nvm-windows GitHub 选择一个版本进行安装即可 安装的路径我就不用多说了&#xff0c;全英文路径&#xff0c;尽量不要安装在c盘上&#xff0c;计算机人都懂为什么&…

vmware17+ubuntu18.04通过qemu8.0.2启动arm64虚拟机-测试vsock

文章目录 一、环境搭建1.qemu-8.0.22.buildroot配置 3.编译工具链gcc-linaro-7.2.1下载交叉编译工具链 4.linux kernel 5.16config_kernel.sh配置内核build_kernel.sh 5.启动虚拟机&#xff08;1&#xff09;创建磁盘镜像文件&#xff08;2&#xff09;拷贝内核镜像和根文件系统…

ESP32(MicroPython)端午节项目

本程序致敬了屏幕驱动例程&#xff0c;依次以4种字体显示Happy Dragon Boat Festival!&#xff0c;并重复一次。 代码如下 from ili934xnew import ILI9341, color565 from machine import Pin, SPI import m5stack import tt14 import glcdfont import tt14 import tt24 imp…