typescript 带有反作用钩形的反作用套管轴&下一个

s1ag04yj  于 2022-11-26  发布在  TypeScript
关注(0)|答案(1)|浏览(144)

我在nextjs中使用react-quill和react-hook形式来实现编辑器。

const QuillNoSSRWrapper = dynamic(import('react-quill'), {
  ssr: false,
  loading: () => <p>Loading ...</p>,
});

const Editor = () => {
  const { register, handleSubmit, watch, setValue } = useForm<Content>();

  useEffect(() => {
    if (document) {
      register('content', { required: true });
    }
  }, [register]);

  const onValid = (data: Content) => {
    console.log(data);
  };
  const editorChange = (editorState: string) => {
    setValue('content', editorState);
  };

  const editorContent = watch('content');
  return (
    <div onSubmit={handleSubmit(onValid)}>
      <QuillNoSSRWrapper
        value={editorContent}
        modules={modules}
        formats={formats}
        onChange={editorChange}
      />
      <input type="submit" />
    </div>
  );
};

我尝试添加if(document)...,但出现相同的错误。
因此,我将form更改为div
就像这样

<form>
      <QuillNoSSRWrapper
        value={editorContent}
        modules={modules}
        formats={formats}
        onChange={editorChange}
      />
      <input type="submit" onClick={handleSubmit(onValid)} />
    </form>

data 我输入的是显示在控制台中,但当我刷新我得到同样的错误再次。
如果不使用div,就没有办法使用form标记吗?我正在尝试使用react钩子形式来实现。

jhdbpxl9

jhdbpxl91#

我使用以下技巧解决了NextJS v13中的水合错误,仅在客户端呈现期间呈现表单,而不在SSR期间呈现:

export function LoginForm() {
  const [initialRenderComplete, setInitialRenderComplete] = useState(false)

  // This useEffect will only run once, during the first client render
  useEffect(() => {
    // Updating a state causes a re-render
    setInitialRenderComplete(true)
  }, [])

  return (
    <div>
      /* more html here if necessary ... */

      {initialRenderComplete && (
        <form>
          <input .... />
          <submit .... />
        </form>
      )}

    </div>
  )
}

请看这篇文章,它很好地解释了这个问题:https://www.joshwcomeau.com/react/the-perils-of-rehydration/

相关问题