DEV Community

Cover image for Building a Blogging Website with React.js: A Step-by-Step Guide
Rohitash Singh
Rohitash Singh

Posted on • Edited on

1

Building a Blogging Website with React.js: A Step-by-Step Guide

In the vast landscape of web development, React.js has emerged as a powerful library for building user interfaces. In this blog, we'll explore the process of creating a simple yet functional blogging website using React.js. By the end of this guide, you'll have a foundation upon which you can expand and customize based on your specific needs.

Step 1: Project Setup
Start by creating a new React.js project using Create React App or any preferred method.

npx create-react-app rs-blog
cd rs-blog
Enter fullscreen mode Exit fullscreen mode

This sets up the basic structure and dependencies needed for a React project.

Step 2: Install Dependencies
For our blogging website, we'll need additional packages such as react-router-dom for routing and axios for making API requests.

npm install react-router-dom axios
Enter fullscreen mode Exit fullscreen mode

Step 3: Create Components
Divide your application into components. Common components for a blogging website might include Header, PostList, PostDetail, and Footer. Organize them within a components folder.

PostList

import React, { useRef } from "react";
import { Link } from "react-router-dom";
import Blogs from 'data/Blogs';
import {
    Container,
    Row,
    Col,
} from "reactstrap";

import MainNavbar from "components/Navbars/MainNavbar.js";
import MainFooter from "components/Footers/MainFooter.js";

const Blog = () => {
    const mainRef = useRef(null);
    return (
        <>
            <MainNavbar />
            <main ref={mainRef}>
                <section className="section section-shaped section-lg">
                    <Container className="pt-lg">
                        <Row className="text-center justify-content-center">
                            <Col lg="10">
                                <h2 className="display-3 text-white">Blogs</h2>
                            </Col>
                        </Row>
                        <Row className="row-grid mt-5">
                            {Blogs.map((blog, index) => (
                                <div key={index} className="col-md-4">
                                    <div className="card mb-4 border-0">
                                        <div className="card-body p-0">
                                            <Link to={`/blog-details/${blog.id}`}>
                                                // { blog.blogImg } // paste this in src attribute of below image
                                                <img src="" alt="" className="img-fluid w-100" style={{ height: "150px" }} />
                                            </Link>
                                            <div className="p-1">
                                                <Link to={`/blog-details/${blog.id}`}>
                                                    <h6 className="card-title mb-0 pb-0 font-bold">{blog.title}</h6>
                                                </Link>
                                                <p className="card-text">{blog.content}</p>
                                            </div>
                                        </div>
                                    </div>
                                </div>
                            ))}
                        </Row>
                    </Container>
                </section>
            </main>
            <MainFooter />
        </>
    );
}
export default Blog;

Enter fullscreen mode Exit fullscreen mode

Blog Details page

import React, { useState, useEffect, useRef } from "react";
import { Button, Container } from "reactstrap";
import { Link, useParams } from "react-router-dom";
import MainNavbar from "components/Navbars/MainNavbar.js";
import MainFooter from "components/Footers/MainFooter";
import Blogs from 'data/Blogs';
import blog from "../assets/img/blogs/24.png";

const BlogDetails = () => {
    const { blogId } = useParams();
    const [blogDetails, setBlogDetails] = useState(null);
    const mainRef = useRef(null);
    useEffect(() => {
        const selectedBlog = Blogs.find((blog) => blog.id === parseInt(blogId, 10));
        setBlogDetails(selectedBlog);
    }, [blogId]);
    if (!blogDetails) {
        return <div>Loading...</div>;
    }
    return (
        <>
            <MainNavbar />
            <main ref={mainRef}>
                <Container style={{ marginBottom: "20px" }} className="">
                    <div className="row m-2">
                        <div className="col-md-8 mb-4 shadow p-4">
                            // {blogDetails.blogImg} // paste this in src attribute of below image
                            <img src="" alt="" className="img-fluid d-inline mr-2 w-100" style={{ height: "300px" }} />
                            <section className="mb-3 mt-3">{blogDetails.title}</section>
                            <section>
                                <div>{blogDetails.content}</div>
                                <span className="fw-bold">Share this on <li className="fa fa-share pr-1"> </li></span>
                                <Button
                                    outline
                                    color="primary"
                                    style={{ textTransform: "capitalize" }}
                                > <li className="fa fa-linkedin"></li> Linkedin</Button>
                                <Button
                                    outline
                                    color="primary"
                                ><li className="fa fa-instagram"></li> Instagram</Button>
                                <Button
                                    outline
                                    color="primary"
                                ><li className="fa fa-twitter"></li> Twitter</Button>
                            </section>
                        </div>
                        <div className="col-md-4 mb-4 ">
                            <section className="sticky-top shadow p-4" style={{ position: "sticky", top: "80px" }} >
                                <section className=" mb-4">
                                    <div>
                                        <Link to={`/blog-details/${blogDetails.id}`}>
                                            // {blog} // paste this in src attribute of below image
                                            <img src="" alt="" className="img-fluid d-inline mr-2" style={{ width: "50px" }} />
                                        </Link>
                                        <Link to={`/blog-details/${blogDetails.id}`}>
                                            <h6 className="card-title mb-0 pb-0 d-inline">{blogDetails.title}</h6>
                                        </Link>
                                        <hr />
                                    </div>
                                </section>
                            </section>
                        </div>
                    </div>
                </Container>
            </main>
            <MainFooter />
        </>
    );
};

export default BlogDetails;

Enter fullscreen mode Exit fullscreen mode

blogdata

const Blogs = [
    {
        id: 1,
        title: 'What is MERN STACK Dev?',
        content: 'MERN Development.',
        blogImg: require('../assets/img/blogs/23.png'),
    },
    {
        id: 2,
        title: 'What is Frontend Development?',
        content: 'frontend Development.',
        blogImg: require('../assets/img/blogs/24.png'),
    },
];
export default Blogs;

Enter fullscreen mode Exit fullscreen mode

- make sure to style these components and adding necessary media files also header and footer components.

Step 4: Set Up Routing
Utilize react-router-dom to enable navigation within your application. Define routes in the App.js file, mapping URLs to specific components.

import React from "react";
import ReactDOM from "react-dom/client";
import { BrowserRouter, Route, Routes, Navigate } from "react-router-dom";

import "assets/vendor/nucleo/css/nucleo.css";
import "assets/vendor/font-awesome/css/font-awesome.min.css";
import "assets/scss/jobx.scss?v1.1.0";

import Blog from "blog/blog";
import BlogDetails from "blog/blogDetails";

const root = ReactDOM.createRoot(document.getElementById("root"));

root.render(
  <BrowserRouter>
    <Routes>
      <Route path="/blog" exact element={<Blog />} />
      <Route path="/blog-details/:blogId" exact element={<BlogDetails />} />      
      <Route path="*" element={<Navigate to="/" replace />} />
    </Routes>
  </BrowserRouter>
);

Enter fullscreen mode Exit fullscreen mode

Step 5: Run Your App
Start your application to see it in action.

npm start
Enter fullscreen mode Exit fullscreen mode

Visit http://localhost:3000 in your browser to explore your blogging website.

Step 6: Enhancements
To make your blogging website more comprehensive, consider adding features like:

  • Forms for creating and editing posts.
  • User authentication for authoring posts.
  • Commenting system for user engagement.
  • Improved styling and layout for a polished user interface. By the way, Congratulations! You've successfully created a basic blogging website using React.js. Feel free to expand and customize based on your unique requirements.

Happy coding!

SurveyJS custom survey software

Build Your Own Forms without Manual Coding

SurveyJS UI libraries let you build a JSON-based form management system that integrates with any backend, giving you full control over your data with no user limits. Includes support for custom question types, skip logic, an integrated CSS editor, PDF export, real-time analytics, and more.

Learn more

Top comments (0)

Billboard image

The Next Generation Developer Platform

Coherence is the first Platform-as-a-Service you can control. Unlike "black-box" platforms that are opinionated about the infra you can deploy, Coherence is powered by CNC, the open-source IaC framework, which offers limitless customization.

Learn more