JWT یک مکانیزم به اصطلاح self-contained را ارائه میدهد و همانطور که اشاره شده است پیاده‌سازی عملیات Logout منطقی نیست چون توکنی که صادر میشود دارای یک تاریخ انقضاء است بنابراین کلاینت تا زمان در اختیار داشتن توکن و همچنین معتبر بودن توکن میتواند از آن استفاده کند؛ این self-contained بودن در واقع باعث خواهد شد که دیگری نیازی به داشتن database call برای بررسی معتبر بودن توکن نباشد. در نهایت اگر خواستید میتوانید یک لایه دیگر به سیستم اضافه کنید و Logout را پیاده‌سازی کنید (قسمت تهیه یک اعتبارسنج توکن سفارشی  در مطلبی که لینک دادید) این لایه میتواند دیتابیس باشد یا یک چیزی مانند Redis؛ 
‫۳ سال و ۴ ماه قبل، پنجشنبه ۲ اردیبهشت ۱۴۰۰، ساعت ۱۳:۴۲
سلام؛
یکی از مزیت‌های Redux Toolkit امکان سفارشی‌سازی بخش‌های مختلف از جمله action creatorها است؛ در حالت عادی برای تعریف کلیدهای داخل reducer میتوانیم اینگونه عمل کنیم:
reducers: {
    todoAdded: (state: Todo[], action: Action) => {
      state.push(action.payload);
   },
}
در حالت فوق تمامی ورودی آیتم جدید از بیرون (یعنی کسی که اکشن را dispatch میکند) تعیین میشود؛ فرض کنید ساختار Todo اینگونه است:
type Todo = {
  id?: string;
  name: string;
  createdAt?: Date;
};
میخواهیم پراپرتی‌های id و createdAt را به صورت خودکار تولید کنیم که کاربر مجبور نباشد آن را به صورت دستی وارد کند؛ برای اینکار از prepare callback  برای سفارشی‌سازی محتوای اکشن میتوانیم استفاده کنیم:

reducers: {
 todoAdded: {
  reducer: (state: Todo[], action: PayloadAction<Todo>) => {
    state.push(action.payload);
  },
  prepare: (todo: Todo) => {
    const id = nanoid();
    return { payload: { id, name: todo.name, createdAt: new Date() } };
  },
},
},

‫۴ سال قبل، سه‌شنبه ۲۸ مرداد ۱۳۹۹، ساعت ۱۵:۴۴
میتوانیم Cascade Delete را در سطح دیتابیس نیز شبیه‌سازی کنیم؛ با تعریف Trigger برای هر موجودیت، به عنوان مثال در MySQL:
CREATE TRIGGER delete_article_comments
AFTER DELETE ON Articles
    FOR EACH ROW
BEGIN
DELETE FROM Comments WHERE CommentType = 'Article' AND TypeID = OLD.Id;
END;

‫۴ سال و ۸ ماه قبل، سه‌شنبه ۱۰ دی ۱۳۹۸، ساعت ۱۴:۰۵
در نگاه اول این ترکیب ممکن است کمی گیج‌کننده باشد ولی بعد از مدتی کار با React به قدرت آن پی خواهید برد. در واقع درج کدهای JSX درون کامپوننت‌ها یک مزیت محسوب می‌شود زیرا پیمایش بین کدها را راحت‌تر و همچنین نوشتن و دیباگ کامپوننت‌ها را ساده‌تر خواهد کرد. از آنجائیکه تمام قابلیت‌ها درون یک فایل تعریف می‌شوند دیگر نیاز نخواهد بود زمان زیادی را برای سوئیچ کردن بین فایل‌های جدا (تمپلیت و...) هدر دهید. همچنین جداسازی فایل‌های JSX از کامپوننت به معنای پیروی از اصل Separation Of Concern نیست چون مجموع فایل‌ها در نهایت مختص به یک کامپوننت هستند (به عنوان مثال نمی‌توان تمپلیت را برای یک کامپوننت دیگر استفاده کرد و...)
ضمناً برای اینکه حجم کدهایتان بعد از مدتی زیاد نشود بهتر است کامپوننت‌هایی که جزئیات زیادی دارند را به Child Component‌های کوچک‌تری تقسیم کنید (مانند مثال طراحی گرید این سری).
‫۴ سال و ۱۱ ماه قبل، یکشنبه ۳۱ شهریور ۱۳۹۸، ساعت ۲۰:۴۲
ممنون از دقت نظر شما؛
البته هدف از این مطلب آشنایی با فرآیند رندر شدن کامپوننت‌ها میباشد. در مطلب بعدی به Hooks هم اشاره خواهیم کرد.
‫۵ سال و ۱ ماه قبل، یکشنبه ۶ مرداد ۱۳۹۸، ساعت ۰۲:۵۵
از Nuget بهتر است برای مدیریت پکیج‌های NET.ی استفاده شود زیرا فایل‌های سمت کلاینتی که در Nuget قرار گرفته‌اند نسخه‌‌های رسمی نیستند. به عنوان مثال با ارائه نسخه‌ی جدید bootstrap یک نفر می‌بایست نسخه جدید را به مخزن Nuget اضافه کند همچنین تعداد زیادی پکیج بوت‌استرپ بر روی Nuget قرار دارد که معلوم نیست کدامیک شامل آخرین تغییرات می‌باشد. همچنین پکیج‌های سمت کلاینتی که روی Nuget قرار دارند با نسخه‌های جدید ASP.NET سازگار نیستند و عموماً برای نسخه‌های قبل از ASP.NET Core و همان  ASP.NET MVC سابق تهیه شده‌اند. به عنوان مثال اگر درون یک پروژه‌ی APS.NET Core دستور زیر را وارد کنید:

dotnet add package Twitter.Bootstrap --version 3.0.1.1

تغییری در پوشه‌ی wwwroot مشاهده نخواهید کرد (صرفاً محتوای درون UserProfile%\.nuget\packages%  در ویندوز یا nuget/packages~/.    در MacOS را شلوغ خواهد کرد.) دلیل آن نیز همانطور که عنوان شد عدم سازگاری پکیج مربوطه با ASP.NET Core می‌باشد. (+ ). در حالیکه نصب همین پکیج درون یک پروژه ASP.NET MVC 5.x منجر به اضافه شدن پوشه‌های Content و Scripts خواهد شد.
اما با استفاده از LibMan می‌توانیم پکیج موردنظر را از هر کدام از providerهای عنوان شده دانلود و همچنین مسیر دانلود پکیج را نیز می‌توانیم تعیین کنیم.