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

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

⭐前言

大家好,我是yma16,本期给大家分享next项目中使用react-markdown渲染内容。

该系列的往期文章

博客搭建_初始化next项目

博客搭建_登录注册

⭐引入react-markdown

React-markdown 是一个开源的 React 库,用于将 Markdown 语法转换为 React 元素。它支持常见的 Markdown 语法,如标题、段落、列表、代码块、粗体、斜体等,并提供了很多自定义选项和插件,可以定制化渲染 Markdown 标记。使用 react-markdown 可以方便地在 React 应用中展示 Markdown 内容,并支持使用 React 组件渲染 Markdown 标记,从而实现更丰富的展示效果。

npm 安装

$ npm install react-markdown

yarn 安装

$ yarn add react-markdown

这里我选择使用npm指令安装:

安装成功!

💖 使用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)

💖 文章内容布局

CSS布局是指使用CSS来实现网页元素的定位和排列。有多种CSS布局方式,以下是其中几种:

盒子模型布局

盒子模型布局是指使用CSS的display属性,将元素转化为块级元素或内联元素,然后通过设置宽度、高度、边距、填充等属性来调整元素在页面中的位置和大小。

浮动布局

浮动布局是指使用CSS的float属性,将元素浮动到页面的左侧或右侧,并与其它元素进行外部或内部包裹,实现布局和定位的效果。

表格布局

表格布局是指使用CSS的display属性,将元素转化为表格、表格行、表格单元格等元素,并通过设置表格宽度、单元格宽度、行高等属性来实现页面的布局和定位。

弹性盒子布局

弹性盒子布局是一种比较新的布局方式,它使用CSS的flex属性,将元素转化为弹性盒子,并通过设置弹性盒子的方向、对齐方式、伸缩性等属性来实现页面的布局和定位。

这里选择弹性盒子布局,左右分开。

结构

采用左右结构

  • 左侧 标题
  • 右侧 内容

state变量存储markdown和titleArray的内容,getArticleData是读取接口的文章列表数据,配置一个变量loading来标记是否加载数据,避免数据加载不渲染。

最外层文章函数式组件的实现如下:

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>
        }
    </>)
}

左侧标题的函数式组件,接受state参数

  • titleArray 标题的内容数组
  • content 文章的内容
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>
    </>)
}

state变量存储markdown内容

右侧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 为flex布局

article-container-left为标题的占位布局

article-container-right为文章的渲染内容

css 代码如下:

.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代码高亮

react-syntax-highlighter是一个基于React的代码高亮组件库,支持多种主题和语言,可以帮助开发者在项目中实现代码的高亮显示。

它支持的语言包括但不限于JavaScript、CSS、HTML、JSON、Markdown等,支持的主题也非常丰富,用户可以自定义主题风格。

使用react-syntax-highlighter组件很简单,只需要导入相应的组件和样式,然后在需要高亮显示代码的位置使用即可。

除了基本的代码高亮功能,react-syntax-highlighter还支持配置标记行、显示行号和行号样式等高级功能,可以满足不同场景下的需求。

npm方式安装react-syntax-highlighter

$ npm install react-syntax-highlighter

react-syntax-highlighter引入react的组件

代码配置如下:

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内容结束,如有不足或者错误欢迎指出!

💖 感谢你的阅读💖


目录
相关文章
|
22天前
|
JavaScript 前端开发 Go
CSS 与 JS 对 DOM 解析和渲染的影响
【10月更文挑战第16天】CSS 和 JS 会在一定程度上影响 DOM 解析和渲染,了解它们之间的相互作用以及采取适当的优化措施是非常重要的。通过合理的布局和加载策略,可以提高网页的性能和用户体验,确保页面能够快速、流畅地呈现给用户。在实际开发中,要根据具体情况进行权衡和调整,以达到最佳的效果。
|
22天前
|
前端开发 JavaScript
React学习之——条件渲染
【10月更文挑战第16天】React 中没有像Vue中v-if这种指令。React 中的条件渲染和 JavaScript 中的一样,使用 JavaScript 运算符 if 或者条件运算符去创建元素来表现当前的状态,然后让 React 根据它们来更新 UI。
|
1月前
|
前端开发 JavaScript 容器
React 元素渲染
10月更文挑战第7天
23 1
|
27天前
|
监控 前端开发 UED
在 React 18 中利用并发渲染提高应用性能
【10月更文挑战第12天】利用并发渲染需要综合考虑应用的特点和需求,合理运用相关特性和策略,不断进行优化和调整,以达到最佳的性能提升效果。同时,要密切关注 React 的发展和更新,以便及时利用新的技术和方法来进一步优化应用性能。你还可以结合具体的项目实践来深入理解和掌握这些方法,让应用在 React 18 的并发渲染机制下发挥出更好的性能优势。
104 59
|
6天前
|
数据采集 JavaScript 搜索推荐
服务器端渲染(SSR)(Nuxt+Next.js)
服务器端渲染(SSR)技术在服务器上生成页面HTML,提升首屏加载速度和SEO效果。Nuxt.js和Next.js分别是基于Vue.js和React.js的流行SSR框架。Nuxt.js提供自动化路由管理、页面级数据获取和布局系统,支持SSR和静态站点生成。Next.js支持SSR、静态生成和文件系统路由,通过`getServerSideProps`和`getStaticProps`实现数据获取。SSR的优点包括首屏加载快、SEO友好和适合复杂页面,但也会增加服务器压力、开发限制和调试难度。选择框架时,可根据项目需求和技术栈决定使用Nuxt.js或Next.js。
|
16天前
|
监控 前端开发 JavaScript
React 静态网站生成工具 Next.js 入门指南
【10月更文挑战第20天】Next.js 是一个基于 React 的服务器端渲染框架,由 Vercel 开发。本文从基础概念出发,逐步探讨 Next.js 的常见问题、易错点及解决方法,并通过具体代码示例进行说明,帮助开发者快速构建高性能的 Web 应用。
44 10
|
15天前
|
资源调度 前端开发 数据可视化
构建高效的数据可视化仪表板:D3.js与React的融合之道
【10月更文挑战第25天】在数据驱动的时代,将复杂的数据集转换为直观、互动式的可视化表示已成为一项至关重要的技能。本文深入探讨了如何结合D3.js的强大可视化功能和React框架的响应式特性来构建高效、动态的数据可视化仪表板。文章首先介绍了D3.js和React的基础知识,然后通过一个实际的项目案例,详细阐述了如何将两者结合使用,并提供了实用的代码示例。无论你是数据科学家、前端开发者还是可视化爱好者,这篇文章都将为你提供宝贵的洞见和实用技能。
33 5
|
20天前
|
JavaScript 前端开发 算法
前端优化之超大数组更新:深入分析Vue/React/Svelte的更新渲染策略
本文对比了 Vue、React 和 Svelte 在数组渲染方面的实现方式和优缺点,探讨了它们与直接操作 DOM 的差异及 Web Components 的实现方式。Vue 通过响应式系统自动管理数据变化,React 利用虚拟 DOM 和 `diffing` 算法优化更新,Svelte 通过编译时优化提升性能。文章还介绍了数组更新的优化策略,如使用 `key`、分片渲染、虚拟滚动等,帮助开发者在处理大型数组时提升性能。总结指出,选择合适的框架应根据项目复杂度和性能需求来决定。
|
1月前
|
前端开发 JavaScript 算法
React 渲染优化策略
【10月更文挑战第6天】React 是一个高效的 JavaScript 库,用于构建用户界面。本文从基础概念出发,深入探讨了 React 渲染优化的常见问题及解决方法,包括不必要的渲染、大量子组件的渲染、高频事件处理和大量列表渲染等问题,并提供了代码示例,帮助开发者提升应用性能。
49 6
|
1月前
|
Web App开发 前端开发 JavaScript
JavaScript动态渲染页面爬取——Selenium的使用(一)
JavaScript动态渲染页面爬取——Selenium的使用(一)