国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

標(biāo)題重寫(xiě)為:Dynamic component import in Vite with React and typescript causing failure in fast refresh
P粉546179835
P粉546179835 2023-11-10 20:45:29
0
1
1191

我正在嘗試創(chuàng)建一個(gè)多步驟表單,我將數(shù)據(jù)放在一個(gè)單獨(dú)的文件中,用于這樣的常量

從“react”導(dǎo)入{lazy};

export const steps = [
  {
    id: 0,
    name: 'Personal Info',
    component: lazy(() => import('../components/PersonalInfo')),
  },
];

我將它傳遞給上下文中的自定義掛鉤

const dataSteps = useMultiStep(steps);

const { next, back, currentStep, isFirst } = dataSteps;

這是自定義掛鉤

import { useState } from 'react';
import { MultistepProps } from '../@types/Multiform';

const useMultiStep = (steps: MultistepProps[]) => {
  const [step, setStep] = useState(0);

  const isLast = step === steps?.length - 1;
  const isFirst = step === 0;

  const next = (): void => {
    if (isLast) return;
    setStep((current) => current + 1);
  };

  const back = (): void => {
    if (isFirst) return;
    setStep((current) => current - 1);
  };

  return {
    step,
    next,
    back,
    currentStep: steps[step],
    isFirst,
  };
};

export default useMultiStep;

我在這里使用動(dòng)態(tài)組件

import FormInterface from './interface/FormInterface';
import useApp from './hooks/useApp';
import { Suspense } from 'react';
function App() {
  const data = useApp();

  const { currentStep, next, back, isFirst } = data;

  const handleSubmit = (e: React.FormEvent) => {
    e.preventDefault();

    next();
  };

  return (
    <FormInterface>
      <form
        onSubmit={handleSubmit}
        className="flex flex-col h-full py-5 group"
        noValidate={true}
      >
        {currentStep.component && (
          <>
            <h1 className="text-3xl font-bold text-marineBlue">
              {currentStep?.name}
            </h1>

            <Suspense fallback={<div>Loading...</div>}>
              <currentStep.component /> //here
            </Suspense>

            <div
              className={`mt-4 sm:mt-auto flex ${
                isFirst ? 'justify-end' : 'justify-between'
              }`}
            >
              <button
                type="button"
                className={`hover:text-marineBlue font-bold text-coolGray py-2 px-5 rounded-md text-[13px] ${
                  isFirst ? 'hidden' : 'block'
                }`}
                onClick={back}
              >
                Go Back
              </button>
              <button
                type="submit"
                className="hover:bg-purplishBlue bg-marineBlue text-white py-2 px-5 rounded-md text-[12px] group-invalid:pointer-events-none group-invalid:opacity-30 self-end"
              >
                Next Step
              </button>
            </div>
          </>
        )}
      </form>
    </FormInterface>
  );
}

export default App;

我的vite配置是這樣的

import { defineConfig } from 'vite';
import react from '@vitejs/plugin-react';

// https://vitejs.dev/config/
export default defineConfig({
  plugins: [react()],
});

嘗試了所有方法后,我仍然遇到此錯(cuò)誤,不是第一次渲染,而是組件重新加載時(shí)出現(xiàn)

App.tsx:7 未捕獲類(lèi)型錯(cuò)誤:無(wú)法解構(gòu)“data”的屬性“currentStep”,因?yàn)樗鼮榭铡? 在應(yīng)用程序 (App.tsx:7:11) 在 renderWithHooks (react-dom.development.js:16305:18) 在 mountInminatedComponent (react-dom.development.js:20074:13) 在開(kāi)始工作(react-dom.development.js:21587:16) 在 HTMLUnknownElement.callCallback2 (react-dom.development.js:4164:14) 在 Object.invokeGuardedCallbackDev (react-dom.development.js:4213:16) 在 invokeGuardedCallback (react-dom.development.js:4277:31) 在 beginWork$1 (react-dom.development.js:27451:7) 在 PerformUnitOfWork (react-dom.development.js:26557:12) 在工作LoopSync (react-dom.development.js:26466:5)

我相信這是一個(gè)人力資源管理問(wèn)題,因?yàn)樗拖窦虞d整個(gè)頁(yè)面,僅包含組件,因?yàn)闋顟B(tài)丟失,并且 useMultisteps 上的信息丟失,但我只是找不到一種方法來(lái)實(shí)現(xiàn)它工作,請(qǐng)幫助我,教我更好的方法來(lái)完成我想做的事情

P粉546179835
P粉546179835

全部回復(fù)(1)
P粉548512637

當(dāng)您更新組件時(shí),您的狀態(tài)似乎丟失了(可能是因?yàn)?useApp() 掛鉤在數(shù)據(jù)準(zhǔn)備好之前返回 null)。

  1. 嘗試將有狀態(tài)組件包裝在 React memo() 中。通過(guò)這種方式,您的組件狀態(tài)可以在 HMR 更新期間得以保留。

例如將 useApp 掛鉤包裝在 useMemo 掛鉤中,以確保它只被調(diào)用一次:

const data = useMemo(() => useApp(), []);

總而言之,這將確保 useApp 掛鉤僅被調(diào)用一次,并且它的返回值會(huì)被記憶,即使組件由于 HMR 而重新渲染也是如此。

  1. 第二個(gè)建議:嘗試修改您的代碼,如下所示:

    const { currentStep, next, back, isFirst } = 數(shù)據(jù) ?? {};

這將確保解構(gòu)操作僅在數(shù)據(jù)對(duì)象不為空時(shí)發(fā)生。

最新下載
更多>
網(wǎng)站特效
網(wǎng)站源碼
網(wǎng)站素材
前端模板