আমি ড্যান আব্রামভ (প্রতিক্রিয়া মূল রক্ষণাবেক্ষণকারীদের মধ্যে একটি) উত্তরটি এখানে দেখার পরামর্শ দিই :
আমি মনে করি আপনি এটি করা প্রয়োজনের চেয়ে জটিল করে তুলছেন।
function Example() {
const [data, dataSet] = useState<any>(null)
useEffect(() => {
async function fetchMyAPI() {
let response = await fetch('api/data')
response = await response.json()
dataSet(response)
}
fetchMyAPI()
}, [])
return <div>{JSON.stringify(data)}</div>
}
দীর্ঘ মেয়াদে আমরা এই নিদর্শনটিকে নিরুৎসাহিত করব কারণ এটি জাতি অবস্থার জন্য উত্সাহ দেয়। যেমন - আপনার কল শুরু এবং শেষ হওয়ার মধ্যে যে কোনও কিছু ঘটতে পারে এবং আপনি নতুন প্রপস অর্জন করতে পারতেন। পরিবর্তে, আমরা ডেটা আনার জন্য সাসপেন্সের প্রস্তাব করব যা দেখতে আরও ভাল লাগবে
const response = MyAPIResource.read();
এবং কোন প্রভাব। তবে এর মধ্যে আপনি অ্যাসিঙ্ক স্টাফটিকে একটি পৃথক ফাংশনে স্থানান্তর করতে এবং কল করতে পারেন।
আপনি এখানে পরীক্ষামূলক সাসপেন্স সম্পর্কে আরও পড়তে পারেন ।
আপনি যদি এসলিন্ট দিয়ে বাইরে ফাংশন ব্যবহার করতে চান।
function OutsideUsageExample() {
const [data, dataSet] = useState<any>(null)
const fetchMyAPI = useCallback(async () => {
let response = await fetch('api/data')
response = await response.json()
dataSet(response)
}, [])
useEffect(() => {
fetchMyAPI()
}, [fetchMyAPI])
return (
<div>
<div>data: {JSON.stringify(data)}</div>
<div>
<button onClick={fetchMyAPI}>manual fetch</button>
</div>
</div>
)
}
UseCallback useCallback । স্যান্ডবক্স ।
import React, { useState, useEffect, useCallback } from "react";
export default function App() {
const [counter, setCounter] = useState(1);
const fn = useCallback(() => {
setCounter(counter + 1);
}, [counter]);
useEffect(() => {
if (!(counter % 2)) return;
fn();
}, [fn, counter]);
return (
<div>
<div>Counter is {counter}</div>
<button onClick={fn}>add +1 count</button>
</div>
);
}
useEffect(() => { let unmounted = false promise.then(res => { if (!unmounted) { setState(...) } }) return () => { unmounted = true } }, [])