ری اکت(ReactJS)

آموزش Redux Toolkit در ReactJS

آموزش Redux Toolkit در ReactJS

آموزش Redux Toolkit

آموزش Redux Toolkit

اول یک تعریف داشته باشیم از ریداکس تولکیت ببینیم چی هست؟!

 

Redux Toolkit چیست؟

Redux Toolkit مجموعه ای از ابزارهایی است که به ساده سازی توسعه Redux کمک می کند.

در تعریف دیگر Redux Toolkit امکانی برای بهتر ایجاد کردن و مدیریت حافظه Redux و همچنین برای نوشتن Action و Reducer ها است.

تیم Redux توصیه می‌کند هر زمان که نیاز به استفاده از Redux داشتید از Redux Toolkit استفاده کنید.

اگر نخواین از این ابزار استفاده کنید و به شکل سنتی با ریداکس کار کنید این مقاله رو مطالعه کنید. هر چند پیشنهاد نمی کنم!

 

نحوه نصب Redux Toolkit

برای نصب کافیه یکی از دستور های زیر رو در ترمنیال وارد کنید، فراموش نکنید که در مسیر پروژه باشید.

				
					npm i react-redux @reduxjs/toolkit

yarn add react-redux @reduxjs/toolkit
				
			

برای اینکه مبحث بهتر جابیفه به قول گفتنی و همچنین کاربردی باشه با انجام یک پروژه کوچیک پیش میریم.

در این مثال یا پروژه می خوایم لیستی از کاربران رو در حافظه ریداکس قرار بدیم و بعد پردازش های اضافه کردن، ویرایش و حذف رو روی این حافظه انجام بدیم.

بر اساس تجربه شخصی آموزش های مباحث دشوار اگر به صورت مرحله ای شکسته و گفته بشن درک و یادگیریشون برای دانشجو راحت تره، حداقلش زمانی که به مشکل برخورد میکنه میدونه توی کدوم گام یا مرحله قرار داره، به همین خاطر این آموزش رو هم به صورت مرحله ای و گام به گام پیش می بریم.

 

آموزش گام به گام و پروژه محور Redux Toolkit

بخش اول: ایجاد Store و دریافت اطلاعات

گام اول) توی مرحله اول و ابتدای کار باید حافظه Redux رو ایجاد کنیم، از اونجا که این store یا حافظه قراره در کل پروژه قابل دسترس باشه اون رو در فایل “index.js” ایجاد می کنیم.

برای این کار بعد از وارد شدن به فایل “index.js” نیاز هست دو متد “configStore” و “Provider” رو به پروژه اضافه کنیم.

				
					import { configureStore } from "@reduxjs/toolkit";
import { Provider } from "react-redux";
				
			

برای ایجاد store به شکل زیر عمل می کنیم:

				
					const store = configureStore({
  reducer: {
    // define your reducer,
  },
});
				
			

اینجا من یک فضای اشتراکی به نام “store” با کمک متد “configStore” ایجاد کردم.

ما در “store” باید “reducer” های خودمون رو تعریف کنیم، وظیفه “reducer” بررسی “Action” ها و تغییر یا “modify” کردن وضعیت “َstore” بر اساس آنها می باشد.

حالا اینکه “Action” چی هست جلوتر و زمانی که بهش رسیدیم میگم خدمتتون.

در نهایت کاری که توی این مرحله باید انجام بدیم این هست که کامپوننت هایی رو که می خوایم از این store استفاده کنند رو مشخص کنیم.

برای این کار از کامپوننت “Provider” استفاده می کنیم، از اونجا که می خوایم از این فضای اشتراکی در کل پروژه استفاده کنیم و بهش دسترسی داشته باشیم کامپوننت والد “App” رو به شکل زیر در بین تگ های کامپونت “provider” قرار می دهیم.

				
					<Provider store={store}>
      <App />
    </Provider>
				
			

گام دوم) همانطور که در مرحله اول مشاهده کردید نیاز هست که در store یک reducer ایجد کنیم که وظیفش مدیریت کارهایی هست که می خوایم انجام بدیم، به عنوان مثال، اضافه کردن، ویرایش یا حذف یک کاربر.

البته ما برای ایجاد reducer محدودیت نداریم و می تونیم برای پردازش های مختلف نمونه های دیگری رو ایجاد کنیم.

در این پروژه همانطور که بالاتر گفتیم می خوایم یک فضای مشترک(store) برای مدیریت کاربران داشته باشیم و پردازش های ایجاد، ویرایش و حدف رو انجام بدیم.

برای ایجاد reducer در مسیر src یک پوشه به نام features می سازم و داخلش یک فایل به نام “Users.js” ایجاد می کنم.

ایجاد reducer

برای اینکه لیستی از کاربران داشته باشیم تا بتونیم پردازش های مورد نیاز رو روشون پیاده سازی کنیم یک فایل با نام “FakeData.js” در مسیر src ایجاد کردم و کاربرانی با مشخصات دلخواه رو داخلش نوشتم.

				
					export const UsersData = [
  {
    id: 1,
    name: "Leanne Graham",
    username: "Bret",
  },
  {
    id: 2,
    name: "Ervin Howell",
    username: "Antonette",
  },
  {
    id: 3,
    name: "Clementine Bauch",
    username: "clementine",
  },
  {
    id: 4,
    name: "Patricia Lebsack",
    username: "Karianne",
  },
  {
    id: 5,
    name: "Chelsey Dietrich",
    username: "Kamren",
  },
  {
    id: 6,
    name: "Jake Runolfsdottir V",
    username: "Leopoldo_Corkery",
  },
  {
    id: 7,
    name: "Mrs. Dennis Schulist",
    username: "Karley_Dach",
  },
  {
    id: 8,
    name: "Kurtis Weissnat",
    username: "Elwyn.Skiles",
  },
];

				
			

حالا وارد فایل “Users.js” که در پوشه features ایجاد کرده بودیم میشم و فایل کاربران رو داخلش import می کنم، همچنین برای ایجاد reducer از متدی با نام “createSlice” باید استفاده کنیم که اون رو هم به شکل زیر import می کنم.

				
					import { createSlice } from "@reduxjs/toolkit";
import { UsersData } from "../FakeData";
				
			

الان نوبت ایجاد reducer هست:

				
					import { createSlice } from "@reduxjs/toolkit";
import { UsersData } from "../FakeData";
export const userSlice = createSlice({
  name: "users",
  initialState: { value: UsersData },
  reducers: {},
});

export default userSlice.reducer;

				
			

در اینجا من یک reducer با نام users ایجاد کردم، reducer من باید مقادیر پیش فرض داشته باشه که اون در قسمت initialState معرفی می کنیم، در اینجا من فایلی رو که اطلاعات کارابران فیک داخلش ایجاد شده رو به عنوان مقادیر پیش فرض و با نام UsersData معرفی کردم.

در نهایت reducer ایجاد شده رو export می کنیم تا در فایل index.js به عنوان reducer به store ای که ایجاد کردیم به شکل زیر import و معرفی کنیم.

کدینگ فایل index.js ما به شکل زیر می شود:

				
					import React from "react";
import ReactDOM from "react-dom/client";
import "./index.css";
import App from "./App";
import reportWebVitals from "./reportWebVitals";
import { configureStore } from "@reduxjs/toolkit";
import { Provider } from "react-redux";
import UsersReducer from "./features/Users";

const store = configureStore({
  reducer: {
    users: UsersReducer,
  },
});

const root = ReactDOM.createRoot(document.getElementById("root"));
root.render(
  <React.StrictMode>
    <Provider store={store}>
      <App />
    </Provider>
  </React.StrictMode>
);

reportWebVitals();

				
			

گام سوم) در این مرحله می خوام کاربران رو نمایش بدم، نکته مهمی که باید برای نمایش محتوا در ریداکس در نظر بگیریم این هست که ما نباید به صورت مستقیم و سنتی اطلاعات رو به نمایش بزاریم، چون بعد از مثلا پردازشی مثل اضافه کردن کاربر با مشکل روبرو میشیم.

برای نمایش مشخصات کاربران وارد فایل “App.js” می شیم،و هوک “useSelector” که برای نمایش محتوای store در ریداکس ایجاد شده است رو import و در نهایت به شکل زیر استفاده می کنیم:

				
					import { useSelector, useDispatch } from "react-redux";
 const userList = useSelector((state) => state.users.value);
				
			

من با استفاده از متد useSelector وضعیت یا stated یک reducer رو میگیرم و میگم از اون state چه چیزهایی رو برای من برگردونه که در اینجا مقادیر یا اطلاعات کاربران هست.

اگر یادتون باشه initialState ما برابر بود با UserData.

الان کافیه با استفاده از متد map مقادیر رو که در متغیر userList رو به نمایش بزارم.

اما قبلش با دستور console.log از userList از دریافت اطلاعات مطمئن میشم.

				
					import { useSelector } from "react-redux";

function App() {
  const userList = useSelector((state) => state.users.value);
  console.log(userList);
  return (
    <>
      <div className="p-10">
        <h1>Welcome</h1>
      </div>
    </>
  );
}

export default App;

				
			

نتیجه رو ببینیم در کنسول:

دریافت اطلاعات از store در redux

دریافت اطلاعات از store در redux

 

حالا نمایش “نام” و “نام کاربری” کاربران با استفاده از متد map:

				
					// App.js
import { useSelector } from "react-redux";

function App() {
  const userList = useSelector((state) => state.users.value);
  console.log(userList);
  return (
    <>
      <div className="p-10">
        <h1 className="font-semibold text-gray-50">
          Work With Redux Toolkit in ReactJS | Payam Hayati
        </h1>
        <hr className="mt-2" />
        <div>
          {userList.map((usr) => {
            return (
              <div
                key={usr.id}
                className="p-2 mt-2 rounded-md bg-cyan-700 text-gray-50"
              >
                <span className="font-semibold">Name: </span>
                <span> {usr.name} | </span>
                <span className="font-semibold">Username: </span>
                <span>{usr.username}</span>
              </div>
            );
          })}
        </div>
      </div>
    </>
  );
}

export default App;

				
			

ما در این سه گام یاد گرفتیم، به چه شکل یک Store ایجاد کنیم و دیتاهای ایجاد شده در اون رو واکشی کنیم.

گام بعدی ایجاد یک user جدید و اضافه کردن آن به store هست ولی قبلش لینک دانلود پروژه ای که تا به الآن در این مطلب ایجاد کردیم رو قرار میدم تا اگر دوستانی که نیاز به تمرین همین قسمت ها رو دارند و نمی خواهند یکباره با کل پروژه تمرین رو انجام بدن کارشون ساده تر باشه.

دانلود پروژه Redux – ایجاد و دریافت داده ها از store

بخش دوم: ایجاد user جدید و اضافه کردن اطلاعات به store

در این بخش هم برای سادگی کار آموزش رو به صورت مرحله ای و گام به گام پیش می بریم.

گام اول) در این گام نیاز هست یک فرم برای دریافت اطلاعات کاربر داشته باشیم به همین خاطر من یک فرم ساده در فایل App.js برای دریافت “نام” و “نام کاربری” طراحی کردم.

				
					//App.js 

import { useSelector } from "react-redux";

function App() {
  const userList = useSelector((state) => state.users.value);
  console.log(userList);
  return (
    <>
      <div className="p-10">
        <h1 className="font-semibold text-gray-50">
          Work With Redux Toolkit in ReactJS | Payam Hayati
        </h1>
        <hr className="mt-2" />

        {/* Make user */}
        <div className="py-2">
          <input type="text" placeholder="Name..." />
          <input type="text" placeholder="Username..." className="ml-2" />
          <button className="ml-2">Add User</button>
        </div>

        {/* Read information from store */}
        <div>
          {userList.map((usr) => {
            return (
              <div className="p-2 mt-2 rounded-md bg-cyan-700 text-gray-50">
                <span className="font-semibold">Name: </span>
                <span> {usr.name} | </span>
                <span className="font-semibold">Username: </span>
                <span>{usr.username}</span>
              </div>
            );
          })}
        </div>
      </div>
    </>
  );
}

export default App;

				
			
فرم دریافت اطلاعات

گام دوم) حالا باید ببینیم به چه شکل می تونیم مقادیر input های فرم رو بگیریم و برای متد addUser در فایل Users.js که در پوشه features ساختیم ارسال کنیم.

برای اینکار من فایل Users.js رو باز می کنم و کدینگ زیر رو می نویسم.

				
					import { createSlice } from "@reduxjs/toolkit";
import { UsersData } from "../FakeData";

export const userSlice = createSlice({
  name: "users",
  initialState: { value: UsersData },
  reducers: {
    addUser: (state, action) => {
      state.value.push(action.payload);
    },
  },
});

export const { addUser } = userSlice.actions;
export default userSlice.reducer;

				
			

دو خط کد جدید به این فایل اضافه شد خط کد 9 و 14، ما برای اضافه کردن اطلاعات از متد push استفاده می کنیم.

در Action ما تعریف می کنیم با باید بگیم چه کاری می خوایم انجام بدیم در store.

payload محتوایی هست که از فیلدهای فرم گرفته میشه.

در خط 14 من متدد addUser و action اون رو export کردم تا بتونم در فایل های دیگه ازش استفاده کنم.

 

گام سوم)

در این مرحله وارد فایل App.js میشم، جایی که فرم رو طراحی کردیم، در ابتدا نیاز هست متد addUser و action ای رو که در مرحله قبل ایجاد و export کردیم در این مرحله import کنیم.

همچنین برای اجرای action ما نیاز به هوکی به نام useDispatch داریم که آن رو هم import می کنیم.

				
					import { useState } from "react";
import { useSelector, useDispatch } from "react-redux";
import { addUser } from "./features/Users";

function App() {
  const dispatch = useDispatch();
  const userList = useSelector((state) => state.users.value);

  const [name, setName] = useState("");
  const [username, setUsername] = useState("");

  //console.log(userList);
  return (
    <>
      <div className="p-10">
        <h1 className="font-semibold text-gray-50">
          Work With Redux Toolkit in ReactJS | Payam Hayati
        </h1>
        <hr className="mt-2" />

        {/* Make user */}
        <div className="py-2">
          <input
            type="text"
            placeholder="Name..."
            onChange={(e) => {
              setName(e.target.value);
            }}
          />
          <input
            type="text"
            placeholder="Username..."
            className="ml-2"
            onChange={(e) => {
              setUsername(e.target.value);
            }}
          />
          <button
            className="ml-2"
            onClick={() => {
              dispatch(
                addUser({
                  id: userList[userList.length - 1].id + 1,
                  name,
                  username,
                })
              );
              //dispatch(addUser({ id: 0, name: name, username: username }));
            }}
          >
            Add User
          </button>
        </div>

        {/* Read information from store */}
        <div>
          {userList.map((usr) => {
            return (
              <div className="p-2 mt-2 rounded-md bg-cyan-700 text-gray-50">
                <span className="font-semibold">Name: </span>
                <span> {usr.name} | </span>
                <span className="font-semibold">Username: </span>
                <span>{usr.username}</span>
              </div>
            );
          })}
        </div>
      </div>
    </>
  );
}

export default App;

				
			

در خط کد 6 متغیری با نام dispatch از نوع هوک و متد useDispatch ایجاد کردم که گفتیم برای جرای action ها ازش استفاده می کنیم.

برای دریافت و ذخیره داده های وارد شده در input نیاز به هوک useState داریم که البته این روند رو به حتم در سایر پروژه ها انجام دادید و باهاش آشنا هستید. خط کد 9 و 10 دو متغیر name و username با استفاده از هوک usestate تعریف کردم و خاصیت onChange مربوط به input ها رو بهشون نسبت دادم.

بریم سراغ مرحله آخر که خاصیت onClick دکمه هست، در خط کد 41 مقادیری که در متغیرهای useState ذخیره کردم به متد addUser ارسال و با استفاده از dispatch خاصیت action رو اجرا کردم.

مقدار id یا شناسه به خاطر اینکه تکراری نباشه ابتدا id رکورد قبلی(آخر) رو می گیریم و یکی بهش اضافه می کنیم.(خط کد 43)

بدین ترتیب اطلاعات و دریافت و در لیست داده های فایل FakeUser اضافه می شوند.

در فیلم روبرو می تونید نتیجه رو ببینید.

نکته: من برای استایل دهی از فریم ورک TailwindCSS استفاده کردم اگر نمی دونید به چه شکل باید در ReactJS نصب و ازش استفاده کنید این مقاله رو مطالعه کنید.

 

این بخش هم به اتمام رسید و ما یاد گرفتیم به چه شکل داده هایی رو از فرم دریافت و در store ریداکس ذخیره کنیم.

دانلود پروژه Redux – بخش دوم – دریافت اطلاعات از فرم و ذخیره آنها در store

بخش سوم: حذف اطلاعات از store ریداکس

برای حذف اطلاعات نیاز هست یه button یا آیکن برای اینکار در فرم داشته باشیم که البته اون رو هم باید در قسمت map تعریف کنیم تا به ازای هر رکورد یک دکمه حذف هم ایجاد بشه.

گام اول) وارد فایل App.js میشم و دکمه Delete رو به فرمم اضافه می کنم.

آموزش حذف اطلاعات از store در redux
				
					 {/* Read information from store */}
        <div>
          {userList.map((usr) => {
            return (
              <div className="p-2 mt-2 rounded-md bg-cyan-700 text-gray-50">
                <span className="font-semibold">Name: </span>
                <span> {usr.name} | </span>
                <span className="font-semibold">Username: </span>
                <span>{usr.username}</span>
                <button className="ml-4">Delete</button>
              </div>
            );
          })}
        </div>
				
			

گام دوم)

فایل Users.js که در پوشه features ایجاد کرده بودیم رو باز می کنم.

در مراحل قبل ما یک متد با نام addUser برای اضافه کردن یک کاربر در reducer نوشتیم، حالا باید یک متد برای حذف کاربر بنویسیم که اسمش رو میزاریم deleteUser.

				
					import { createSlice } from "@reduxjs/toolkit";
import { UsersData } from "../FakeData";

export const userSlice = createSlice({
  name: "users",
  initialState: { value: UsersData },
  reducers: {
    addUser: (state, action) => {
      state.value.push(action.payload);
    },

    deleteUser: (state, action) => {
      state.value = state.value.filter((user) => user.id !== action.payload.id);
    },
  },
});

export const { addUser, deleteUser } = userSlice.actions;
export default userSlice.reducer;

				
			

متد deleteUser در خط کد 12.

در این متد من یک آرایه جدید ایجاد کردم. گفتم همه مقادیر و اطلاعات user داخلش قرار بگیره به جز رکوردی که شناسه یا id اون از طریق دکمه Delete ارسال شده.

بدین شکل من یک آرایه جدید دارم از همه اطلاعات کاربرانی که درخواست حذف برای آنها ارسال نشده.

حالا این مورد رو می تونید شما به حالت های دیگه پیاده سازی کنید، چیزی که به ذهن من رسید و فکر می کنم پیاده سازیش ساده تر هست  این حالت بود.

در نهایت در خط کد 18 متد رو export کردم تا بتونم در فایل App.js و یا سایر کامپوننت ها ازش استفاده کنم.

 

گام سوم)

در این مرحله ابتدا بعد از ورود به فایل App.js باید متد نوشته شده در مرحله قبل رو که برای حذف کاربر نوشتیم(deleteUser) در این فایل import کنیم.

و بعد از طریق خاصیت onClick در دکمه delete، شناسه یا id رکوردی رو که می خوایم حذف شود رو برای متد deleteUser ارسال کنیم.

				
					import { addUser, deleteUser } from "./features/Users";

<button onClick={() => {
dispatch(deleteUser({ id: usr.id }));
}} className="ml-4"> Delete 
</button>
				
			

کدهای فایل App.js ما در نهایت به شکل زیر خواهد شد.

				
					import { useState } from "react";
import { useSelector, useDispatch } from "react-redux";
import { addUser, deleteUser } from "./features/Users";

function App() {
  const dispatch = useDispatch();
  const userList = useSelector((state) => state.users.value);

  const [name, setName] = useState("");
  const [username, setUsername] = useState("");

  //console.log(userList);
  return (
    <>
      <div className="p-10">
        <h1 className="font-semibold text-gray-50">
          Work With Redux Toolkit in ReactJS | Payam Hayati
        </h1>
        <hr className="mt-2" />

        {/* Make user */}
        <div className="py-2">
          <input
            type="text"
            placeholder="Name..."
            onChange={(e) => {
              setName(e.target.value);
            }}
          />
          <input
            type="text"
            placeholder="Username..."
            className="ml-2"
            onChange={(e) => {
              setUsername(e.target.value);
            }}
          />
          <button
            className="ml-2"
            onClick={() => {
              dispatch(
                addUser({
                  id: userList[userList.length - 1].id + 1,
                  name,
                  username,
                })
              );
              //dispatch(addUser({ id: 0, name: name, username: username }));
            }}
          >
            Add User
          </button>
        </div>

        {/* Read information from store */}
        <div>
          {userList.map((usr) => {
            return (
              <div className="p-2 mt-2 rounded-md bg-cyan-700 text-gray-50">
                <span className="font-semibold">Name: </span>
                <span> {usr.name} | </span>
                <span className="font-semibold">Username: </span>
                <span>{usr.username}</span>
                <button
                  onClick={() => {
                    dispatch(deleteUser({ id: usr.id }));
                  }}
                  className="ml-4"
                >
                  Delete
                </button>
              </div>
            );
          })}
        </div>
      </div>
    </>
  );
}

export default App;

				
			

بدین شکل ما تونستیم پردازش حذف اطلاعات از store در ریداکس رو پیاده سازی کنیم.

نتیجه کار رو در ویدیو روبرو مشاده می کنید.

میدونم بر خلاف سایر ویژگی های ReactJS این مبحث Redux سخت و مبهمه ولی باید بدونید این نوع موارد رو تنها از طریق تمرین می تونید بهشون مسلط بشید و نه تنها با نگاه کردن یا کپی کرد کدها!

دانلود پروژه Redux – بخش سوم – حذف اطلاعات از store در ریداکس (Redux)

بخش چهارم: ویرایش اطلاعات store در ریداکس

فکر می کنم تا اینجای کار دستتون اومده باشه که به چه شکل باید پردازش هامون رو در store انجام بدیم.

در این قسمت می خوام یک input دیگه در فرم قرار بدم و از کاربر یک username یا نام کاربری جدید بگیرم و اون رو جایگزین قبلی کنم.

یک button هم برای اجرای این پردازش به نام update username در نظر می گیرم.

گام اول)

وارد فایل App.js میشم تا فیلدهای مورد نظرم رو بهش اضافه کنم. یک Textbox برای گرفتن اطلاعات جدید و یک button برای اجرای پردازش ویرایش. خط کد 74.

برای دریافت و change کردن اطلاعات جدید با داده های قدیمی نیاز هست که useState دیگه برای input جدید در نظر بگیریم که در اینجا نامش رو میزارم newUsername خط کد 11.

				
					import { useState } from "react";
import { useSelector, useDispatch } from "react-redux";
import { addUser, deleteUser } from "./features/Users";

function App() {
  const dispatch = useDispatch();
  const userList = useSelector((state) => state.users.value);

  const [name, setName] = useState("");
  const [username, setUsername] = useState("");
  const [newUsername, setNewUsername] = useState("");

  //console.log(userList);
  return (
    <>
      <div className="p-10">
        <h1 className="font-semibold text-gray-50">
          Work With Redux Toolkit in ReactJS | Payam Hayati
        </h1>
        <hr className="mt-2" />

        {/* Make user */}
        <div className="py-2">
          <input
            type="text"
            placeholder="Name..."
            onChange={(e) => {
              setName(e.target.value);
            }}
          />
          <input
            type="text"
            placeholder="Username..."
            className="ml-2"
            onChange={(e) => {
              setUsername(e.target.value);
            }}
          />
          <button
            className="ml-2"
            onClick={() => {
              dispatch(
                addUser({
                  id: userList[userList.length - 1].id + 1,
                  name,
                  username,
                })
              );
              //dispatch(addUser({ id: 0, name: name, username: username }));
            }}
          >
            Add User
          </button>
        </div>

        {/* Read information from store */}
        <div>
          {userList.map((usr) => {
            return (
              <div className="p-2 mt-2 rounded-md bg-cyan-700 text-gray-50">
                <span className="font-semibold">Name: </span>
                <span> {usr.name} | </span>
                <span className="font-semibold">Username: </span>
                <span>{usr.username}</span>

                <button
                  onClick={() => {
                    dispatch(deleteUser({ id: usr.id }));
                  }}
                  className="ml-4"
                >
                  Delete
                </button>
                {/* Update Process */}
                <div className="mt-2">
                  <input
                    type="text"
                    placeholder="New Username..."
                    onChange={(e) => {
                      setNewUsername(e.target.value);
                    }}
                  />
                  <button className="ml-4">Update</button>
                </div>
              </div>
            );
          })}
        </div>
      </div>
    </>
  );
}

export default App;

				
			

فرم ما بدین شکل خواهد شد.

فرم ویرایش اطلاعات store در ریداکس

فرم ویرایش اطلاعات store در ریداکس

 

گام دوم) حالا باید بریم در فایل Users.js در پوشه features و متد ویرایش اطلاعات رو بنویسیم، من نام این متد رو میزام updateUsername و به شکل زیر کدش رو می نویسم.

				
					import { createSlice } from "@reduxjs/toolkit";
import { UsersData } from "../FakeData";

export const userSlice = createSlice({
  name: "users",
  initialState: { value: UsersData },
  reducers: {
    addUser: (state, action) => {
      state.value.push(action.payload);
    },

    deleteUser: (state, action) => {
      state.value = state.value.filter((user) => user.id !== action.payload.id);
    },

    updateUsername: (state, action) => {
      state.value.map((user) => {
        if (user.id === action.payload.id) {
          user.username = action.payload.username;
        }
      });
    },
  },
});

export const { addUser, deleteUser, updateUsername } = userSlice.actions;
export default userSlice.reducer;

				
			

متد updateUsername خط کد 16 اومدیم با استفاده از متد map همه داده های موجود رو همانند یک حلقه بررسی کردیم، شرط گذاشتیم که اگر شناسه ارسال شده از دکمه ویرایش با شناسه ای از اطلاعات موجود  برابر بود پردازش ویرایش انجام بشه.

یادمون نره که باید متد نوشته شده رو export کنیم تا بتونیم در کامپوننت App.js ازش استفاده کنیم.خط کد26.

گام سوم)

در مرحله آخر وارد فایل App.js میشم و متد updateUsername رو import می کنم، خط کد 84.

خاصیت onClick دکمه ویرایش رو هم به شکل زیر می نویسیم.

				
					import { useState } from "react";
import { useSelector, useDispatch } from "react-redux";
import { addUser, deleteUser, updateUsername } from "./features/Users";

function App() {
  const dispatch = useDispatch();
  const userList = useSelector((state) => state.users.value);

  const [name, setName] = useState("");
  const [username, setUsername] = useState("");
  const [newUsername, setNewUsername] = useState("");

  //console.log(userList);
  return (
    <>
      <div className="p-10">
        <h1 className="font-semibold text-gray-50">
          Work With Redux Toolkit in ReactJS | Payam Hayati
        </h1>
        <hr className="mt-2" />

        {/* Make user */}
        <div className="py-2">
          <input
            type="text"
            placeholder="Name..."
            onChange={(e) => {
              setName(e.target.value);
            }}
          />
          <input
            type="text"
            placeholder="Username..."
            className="ml-2"
            onChange={(e) => {
              setUsername(e.target.value);
            }}
          />
          <button
            className="ml-2"
            onClick={() => {
              dispatch(
                addUser({
                  id: userList[userList.length - 1].id + 1,
                  name,
                  username,
                })
              );
              //dispatch(addUser({ id: 0, name: name, username: username }));
            }}
          >
            Add User
          </button>
        </div>

        {/* Read information from store */}
        <div>
          {userList.map((usr) => {
            return (
              <div className="p-2 mt-2 rounded-md bg-cyan-700 text-gray-50">
                <span className="font-semibold">Name: </span>
                <span> {usr.name} | </span>
                <span className="font-semibold">Username: </span>
                <span>{usr.username}</span>

                <button
                  onClick={() => {
                    dispatch(deleteUser({ id: usr.id }));
                  }}
                  className="ml-4"
                >
                  Delete
                </button>
                {/* Update Process */}
                <div className="mt-2">
                  <input
                    type="text"
                    placeholder="New Username..."
                    onChange={(e) => {
                      setNewUsername(e.target.value);
                    }}
                  />
                  <button
                    onClick={() =>
                      dispatch(
                        updateUsername({ id: usr.id, username: newUsername })
                      )
                    }
                    className="ml-4"
                  >
                    Update
                  </button>
                </div>
              </div>
            );
          })}
        </div>
      </div>
    </>
  );
}

export default App;

				
			

در ویدیو روبرو نتیجه پردازش ویرایش رو می تونیم ببینیم.

ما پردازش های اصلی خواندن داده ها، اضافه کردن اطلاعات، ویرایش و حذف آنها از store ریداکس رو کار کردیم و نتایج رو با هم دیدیم از این جا به بعد تمرین و تمرین هست که می تونه این مطالب رو برای شما بیشتر جا بندازه تا زمانی که بتونید به راحتی در پروژه های از Redux استفاده کنید.

دانلود کامل پروژه ریداکس (Redux) – خواندن اطلاعات از store، اضافه کردن اطلاعات،ویرایش و حذف آنها

 

در این مقاله سعی کردم به صورت ساده و کاربردی نحوه کار با Redux Toolkit را در ReactJS آموزش بدم، امیدوارم این مطلب براتون مفید واقع شده باشه.

اگر هنوز سوال و ابهامی در خصوص استفاده از ریداکس در ری اکت دارید در قسمت دیدگاه های همین مطلب مطرح کنید تا با هم برطرفش کنیم.

8 دیدگاه در “آموزش Redux Toolkit در ReactJS

  1. مریم گفت:

    سلام
    ممنون از آموزش، آیا یادگیری ریداکس خیلی مهمه؟ چون من هر چی تلاش می کنم متوجهش نمیشم

    1. در اکثر پروژه ها استفاده نمی شود تنها در پروژه های بزرگ و برخی پروژه های متوسط کاربرد دارد اما اکثر شرکت ها برای استخدام کردن افرادی که React کار می کنند دانش ریداکس رو در لیست موارد مورد نیاز درج می کنند.

  2. رضا گفت:

    عالی بود، خیلی خوب کاری کردید که مجزا سازیش کردید

    1. خوشحالم که مفید واقع شده

  3. محمد رمضانی گفت:

    فکر می کنم کاربردی ترین مقاله ریداکس همین هست

    1. خوشحالم که مفید واقع شده، آرزوی موفقیت

  4. سعید گفت:

    تشکر می کنم واقعا کامل هست

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *