A Blog Page is a web page that is used to display multiple blog posts on a website. Using blogs people can share their views, ideas, and opinions. A Blog Page generally contains a NavBar and Introduction followed by multiple blogs displayed in the form of a card.
Three basic features in a blog post are:
- Blog Title
- Blog Content
- Author name and Publish Date
How Blog Page is different from a Home page?
A Blog Page contains a dedicated section to display posts in order and provides a platform where users can share their views and thoughts whereas a Home page is just an entry point to the website where users can get brief information about the website
Prerequisites:
Approach to Creating a Blog Page:
- Set up a basic react project and install the required dependencies.
- Create the basic layout consisting of a Navbar and Welcome slide.
- Style the components using Tailwind.
- Pass the data dynamically in the components and render it on the screen.
Step to create the project
Step 1: Set up the project using the command
npx create-react-app <<Project_Name>>
Step 2: Navigate to the folder using the command
cd <<Project_Name>>
Step 3: Install the required dependencies using the command
npm install -D tailwindcss
Step 4: Create the tailwind config file using the command
npx tailwindcss init
Step 5: Rewrite the tailwind.config.js file as folllows
/** @type {import('tailwindcss').Config} */
module.exports = {
content: [
"./src/**/*.{js,jsx,ts,tsx}",
],
theme: {
extend: {},
},
plugins: [],
}
Step 6: Create a folder called components in src directory and add the file Banner.js, Navbar.js and Post.js
Project Structure:
The updated dependencies in package.json will look like:
"dependencies": {
"@testing-library/jest-dom": "^5.17.0",
"@testing-library/react": "^13.4.0",
"@testing-library/user-event": "^13.5.0",
"react": "^18.2.0",
"react-dom": "^18.2.0",
"react-scripts": "5.0.1",
"web-vitals": "^2.1.4"
}
"devDependencies": {
"tailwindcss": "^3.3.3"
}
Example: Add the following code in respective files
- App.js: This file imports alll the components and passes necessary data
- Navbar.js: Topmost component of the page used for navigation
- Banner.js: Creates a welcome component
- Post.js: Displays the Blog post depending on the data passed in the component
- Index.css: Imports the necessary tailwind components
Javascript
// App.js import './App.css' ; import Navbar from './components/Navbar' ; import Banner from './components/Banner' ; import Post from './components/Post' ; export default function App() { // Adding Dummy Data to pass as props const postData = [ { department: "Web Tech" , title: "Top 7 JavaScript One liners" , author: "Amit Singh" , designation: "TCE" , info: `This post tells you about best approaches to write single line codes in JavaScript. Use this post as a quick guide to short but important JS codes`, }, { department: "DSA" , title: "Top Interview DSA Questions" , author: "Jatin Sharma" , designation: "TCE" , info: `No need to worry about technical round interviews as this post will guide you step by step to prepare for DSA round`, }, { department: "Cotent" , title: "Best Antiviruses of 2023" , author: "Shobhit Sharma" , designation: "TCE" , info: `Worried about your PC safety? No Problem, this post tells you about the best antiviruses to choose in 2023`, } ] return ( <div > <Navbar /> <Banner /> <div className= 'grid grid-cols-3 gap-4 p-8' > {postData.map((e) => { return <Post content={e} /> })} </div> </div> ) } |
Javascript
// Navbar.js export default function Navbar() { return ( <div> <nav classNameName= "bg-white fixed w-full z-20 top-0 left-0 border-b border-gray-200" > <div className= "flex flex-wrap items-center justify-between mx-auto p-4" > className= "flex items-center" > <img src= className= "mr-2" alt= "GFG Logo" /> <span className= "self-center text-2xl font-semibold " > neveropen </span> </a> <div className= "items-center justify-between hidden w-full md:flex md:w-auto md:order-1" id= "navbar-sticky" > <ul className= "flex flex-col p-4 md:p-0 mt-4 font-medium border border-gray-100 rounded-lg bg-gray-50 md:flex-row md:space-x-8 md:mt-0 md:border-0 md:bg-white" > <li> <a href= "#" className= "block py-2 pl-3 pr-4 text-white bg-blue-700 rounded md:bg-transparent md:text-blue-700 md:p-0" > Home </a> </li> <li> <a href= "#" className= "block py-2 pl-3 pr-4 text-gray-900 rounded hover:bg-gray-100 md:hover:bg-transparent md:hover:text-blue-700 md:p-0" > Posts </a> </li> <li> <a href= "#" className= "block py-2 pl-3 pr-4 text-gray-900 rounded hover:bg-gray-100 md:hover:bg-transparent md:hover:text-blue-700 md:p-0" > About us </a> </li> </ul> </div> </div> </nav> </div> ) } |
Javascript
// Banner.js export default function Banner() { return ( <div className= "h-32 w-full border-2 h-screen flex items-center justify-center bg-emerald-500 text-white" > <p className= "text-2xl" > Welcome to neveropen Blog Page!!!</p> </div> ) } |
Javascript
// Post.js export default function Post(props) { return ( // Accessing and Displaying the data passed as props <div> <div className= "bg-white shadow-2xl w-96" > <div className= "mx-auto max-w-7xl " > <div className= "mx-5 grid max-w-2xl grid-cols-1 gap-x-8 gap-y-16 p-10 lg:grid-cols-1" > <article className= "flex max-w-xl flex-col items-start justify-between" > <div className= "flex items-center gap-x-4 text-xs" > <time datetime= "2023-03-16" className= "text-gray-500" > Mar 16, 2023 </time> <a href= "#" className= "relative z-10 rounded-full bg-gray-50 px-3 py-1.5 font-medium text-gray-600 hover:bg-gray-100" > {props.content.department} </a> </div> <div className= "group relative" > <h3 className= "mt-3 text-lg font-semibold leading-6 text-gray-900 group-hover:text-gray-600" > <a href= "#" > <span className= "absolute inset-0" > </span> {props.content.title} </a> </h3> <p className= "mt-5 line-clamp-3 text-sm leading-6 text-gray-600" > {props.content.info} </p> </div> <div className= "relative mt-8 flex items-center gap-x-4" > <svg fill= "#000000" viewBox= "0 0 32 32" className= "h-10 w-10 rounded-full" xmlns= <g id= "SVGRepo_tracerCarrier" stroke-linecap= "round" stroke-linejoin= "round" > </g> <g id= "SVGRepo_iconCarrier" > <path d= "M 16 4 C 9.382813 4 4 9.382813 4 16 C 4 22.617188 9.382813 28 16 28 C 22.617188 28 28 22.617188 28 16 C 28 9.382813 22.617188 4 16 4 Z M 16 6 C 21.535156 6 26 10.464844 26 16 C 26 21.535156 21.535156 26 16 26 C 10.464844 26 6 21.535156 6 16 C 6 10.464844 10.464844 6 16 6 Z M 11.5 12 C 10.671875 12 10 12.671875 10 13.5 C 10 14.328125 10.671875 15 11.5 15 C 12.328125 15 13 14.328125 13 13.5 C 13 12.671875 12.328125 12 11.5 12 Z M 18 13 L 18 15 L 23 15 L 23 13 Z M 20.96875 17.03125 C 20.96875 18.714844 20.292969 19.882813 19.3125 20.71875 C 18.332031 21.554688 17.035156 22 16 22 C 13.878906 22 12.4375 21.140625 11.3125 20.03125 L 9.90625 21.46875 C 11.300781 22.839844 13.320313 24 16 24 C 17.554688 24 19.261719 23.414063 20.625 22.25 C 21.988281 21.085938 22.96875 19.289063 22.96875 17.03125 Z" > </path></g></svg> <div className= "text-sm leading-6" > <p className= "font-semibold text-gray-900" > <a href= "#" > <span className= "absolute inset-0" ></span> {props.content.author} </a> </p> <p className= "text-gray-600" >{props.content.designation}</p> </div> </div> </article> </div> </div> </div> </div> ); } |
CSS
@tailwind base; @tailwind components; @tailwind utilities; body { margin : 0 ; font-family : -apple-system, BlinkMacSystemFont, 'Segoe UI' , 'Roboto' , 'Oxygen' , 'Ubuntu' , 'Cantarell' , 'Fira Sans' , 'Droid Sans' , 'Helvetica Neue' , sans-serif ; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; } code { font-family : source-code-pro, Menlo, Monaco, Consolas, 'Courier New' , monospace ; } |
Steps to run the application:
Step 1: Type the following command in terminal
npm run start
Step 2: Open your web browser and type the following URL
http://localhost:3000/
Output: