React හි ප්රධානතම ශක්තියක් වන Components භාවිතයෙන්, අපගේ app එකේ කේතය වඩාත් පිළිවෙලට සහ නැවත භාවිතා කළ හැකි ලෙස සකස් කරමු.
සරලවම කිවහොත්, Components යනු ඔබගේ UI (User Interface) එකේ ස්වාධීන, නැවත භාවිතා කළ හැකි කොටස් වේ. LEGO කෑලි වලින් විවිධ දේ සෑදීම මෙන්, React වලදී අප Components එකලස් කර සම්පූර්ණ UI එකක් නිර්මාණය කරයි. මෙහි ප්රධාන වාසි කිහිපයකි:
අපගේ Counter Card එක, තවත් කුඩා components තුනකට (Header, Display, Actions) වෙන් කරමු. ඒ සඳහා, `components` ෆෝල්ඩරය තුල තවත් අලුත් ගොනු 3ක් සාදමු.
counter-app/
└── src/
├── components/
│ ├── Counter.jsx <-- Parent Component
│ ├── CounterDisplay.jsx <-- අලුත් Component
│ ├── CounterActions.jsx <-- අලුත් Component
│ └── CounterHeader.jsx <-- අලුත් Component
├── App.jsx
└── main.jsx
Props (properties என்பதன் சுருக்கம்) යනු parent component එකක සිට child component එකකට දත්ත ගෙන යාමට භාවිතා කරන ක්රමයයි. HTML attributes මෙන්, අපට component tags වලට props ලබා දිය හැක. Child component එක තුල, මෙම props, function එකේ argument එකක් ලෙස ලබාගෙන භාවිතා කළ හැක.
මෙය සරලවම Card Header එක පෙන්වන component එකයි. `src/components/` තුල `CounterHeader.jsx` නමින් ගොනුවක් සාදා මෙම කේතය ඇතුළත් කරන්න.
// src/components/CounterHeader.jsx
function CounterHeader() {
return (
<div className="card-header">
React Counter App
</div>
);
}
export default CounterHeader;
මෙම component එකට `count` අගය පෙන්වීමට අවශ්යයි. එම අගය parent component එකෙන් `prop` එකක් ලෙස ලබා ගනිමු. `src/components/` තුල `CounterDisplay.jsx` නමින් ගොනුවක් සාදන්න.
// src/components/CounterDisplay.jsx
function CounterDisplay({ count }) { // count අගය prop එකක් ලෙස ලබා ගැනීම
return (
<div className="card-body">
<h1 className="display-1">{count}</h1>
</div>
);
}
export default CounterDisplay;
මෙම component එකට බොත්තම් click කළ විට ක්රියාත්මක විය යුතු functions අවශ්යයි. ඒවාද props ලෙස ලබා ගනිමු. `src/components/` තුල `CounterActions.jsx` නමින් ගොනුවක් සාදන්න.
// src/components/CounterActions.jsx
// Functions, props ලෙස ලබා ගැනීම
function CounterActions({ onIncrement, onDecrement, onReset }) {
return (
<div className="card-footer">
<button className="btn btn-success me-2" onClick={onIncrement}>Plus (+)</button>
<button className="btn btn-warning me-2" onClick={onReset}>Reset</button>
<button className="btn btn-danger" onClick={onDecrement}>Minus (-)</button>
</div>
);
}
export default CounterActions;
දැන්, අපගේ `Counter.jsx` ගොනුව, state සහ logic තබාගෙන, ඉහත සෑදූ child components තුන එකලස් කරන parent component එක ලෙස ක්රියා කරයි. අවශ්ය දත්ත සහ functions, props හරහා child components වලට ලබා දෙනු ඇත.
// src/components/Counter.jsx
import { useState } from 'react';
// 1. Child components import කර ගැනීම
import CounterHeader from './CounterHeader';
import CounterDisplay from './CounterDisplay';
import CounterActions from './CounterActions';
function Counter() {
const [count, setCount] = useState(0);
const handleIncrement = () => setCount(count + 1);
const handleDecrement = () => { if (count > 0) setCount(count - 1); };
const handleReset = () => setCount(0);
return (
<div className="card text-center">
{/* 2. Child components භාවිතා කර props ලබා දීම */}
<CounterHeader />
<CounterDisplay count={count} />
<CounterActions
onIncrement={handleIncrement}
onDecrement={handleDecrement}
onReset={handleReset}
/>
</div>
);
}
export default Counter;
මෙම සියලු වෙනස්කම් `components` ෆෝල්ඩරය තුල සිදු කළ නිසා, අපගේ ප්රධාන `App.jsx` ගොනුවේ කිසිදු වෙනසක් සිදු කිරීමට අවශ්ය නැත! එය තවමත් පෙර පරිදිම `Counter` component එක render කරයි.
// src/App.jsx
import Counter from './components/Counter';
function App() {
return (
<div className="container mt-5">
<div className="row justify-content-center">
<div className="col-md-6">
<Counter />
</div>
</div>
</div>
);
}
export default App;
මෙම සියලු වෙනස්කම් save කළ විට, ඔබගේ browser එකේ පෙනුමේ කිසිදු වෙනසක් සිදු නොවේ. නමුත් දැන්, අපගේ කේතය ඉතාමත් පිළිවෙලට, එක් එක් කොටසට අදාළ වගකීම් සහිතව, කුඩා components වලට වෙන් කර ඇත.
සාරාංශය: අපි අපගේ UI එක කුඩා, නැවත භාවිතා කළ හැකි components (`CounterHeader`, `CounterDisplay`, `CounterActions`) වලට කැඩුවා. State සහ Logic, parent component එක වන `Counter.jsx` හි තබාගෙන, අවශ්ය දත්ත සහ functions, props හරහා child components වලට ලබා දුන්නා.
⬅️ මුල් පිටුවට