প্রতিলিপি নির্মাণের জন্য this.setStateবর্গ উপাদানগুলো থেকে একত্রীকরণ আচরণ, প্রতিক্রিয়া ডক্স সুপারিশ কার্যকরী ফর্ম ব্যবহার করার জন্য useStateবস্তু বিস্তার সাথে - কোন প্রয়োজন জন্য useReducer:
setState(prevState => {
return {...prevState, loading, data};
});
দুটি রাজ্য এখন এক হিসাবে একীভূত হয়েছে, যা আপনাকে রেন্ডার চক্র সংরক্ষণ করবে।
সেখানে এক রাজ্যের বস্তুর সঙ্গে অন্য সুবিধা হল: loadingএবং dataহয় নির্ভরশীল যুক্তরাষ্ট্র। রাষ্ট্রকে একত্র করা হলে অবৈধ রাষ্ট্র পরিবর্তনগুলি আরও স্পষ্ট হয়:
setState({ loading: true, data });
আপনি আরও ভাল করতে পারবেন তা নিশ্চিত সামঞ্জস্যপূর্ণ রাজ্যের 1. দ্বারা) উপার্জন অবস্থা - loading, success, error, ইত্যাদি - স্পষ্ট আপনার রাষ্ট্র এবং 2.) ব্যবহার করে useReducerএকটি হ্রাসকারক মধ্যে encapsulate রাষ্ট্র যুক্তিবিজ্ঞান করুন:
const useData = () => {
const [state, dispatch] = useReducer(reducer, );
useEffect(() => {
api.get('/people').then(test => {
if (test.ok) dispatch(["success", test.data.results]);
});
}, []);
};
const reducer = (state, [status, payload]) => {
if (status === "success") return { ...state, data: payload, status };
else if (status === "loading") return { ...state, data: undefined, status };
return state;
};
const App = () => {
const { data, status } = useData();
return status === "loading" ? <div> Loading... </div> : (
)
}
const useData = () => {
const [state, dispatch] = useReducer(reducer, {
data: undefined,
status: "loading"
});
useEffect(() => {
fetchData_fakeApi().then(test => {
if (test.ok) dispatch(["success", test.data.results]);
});
}, []);
return state;
};
const reducer = (state, [status, payload]) => {
if (status === "success") return { ...state, data: payload, status };
else if (status === "loading") return { ...state, data: undefined, status };
else return state;
};
const App = () => {
const { data, status } = useData();
const count = useRenderCount();
const countStr = `Re-rendered ${count.current} times`;
return status === "loading" ? (
<div> Loading (3 sec)... {countStr} </div>
) : (
<div>
Finished. Data: {JSON.stringify(data)}, {countStr}
</div>
);
}
const useRenderCount = () => {
const renderCount = useRef(0);
useEffect(() => {
renderCount.current += 1;
});
return renderCount;
};
const fetchData_fakeApi = () =>
new Promise(resolve =>
setTimeout(() => resolve({ ok: true, data: { results: [1, 2, 3] } }), 3000)
);
ReactDOM.render(<App />, document.getElementById("root"));
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.13.0/umd/react.production.min.js" integrity="sha256-32Gmw5rBDXyMjg/73FgpukoTZdMrxuYW7tj8adbN8z4=" crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.13.0/umd/react-dom.production.min.js" integrity="sha256-bjQ42ac3EN0GqK40pC9gGi/YixvKyZ24qMP/9HiGW7w=" crossorigin="anonymous"></script>
<div id="root"></div>
<script>var { useReducer, useEffect, useState, useRef } = React</script>
দ্রষ্টব্য: নিশ্চিত করুন উপসর্গ সাথে কাস্টম হুক্স use( useDataপরিবর্তে getData)। এছাড়াও পাস করা কলব্যাক হতে useEffectপারে না async।
useReducer