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: