reactjs pouchDb的useContext中的重新呈现过多

eqoofvh9  于 2023-04-11  发布在  React
关注(0)|答案(1)|浏览(107)
import React, { useState, useMemo } from 'react';
import PouchDB from 'pouchdb-browser';
import findPlugin from 'pouchdb-find';

const PouchdbContext = React.createContext({
    availableScanners: [''],
    changeDb: () => {},
});

export function PouchdbContextProvider({ children }) {
  // const [localDb, setLocalDb] = useState();
  // const [remoteDb, setRemoteDb] = useState();
  const [id, setId] = useState();

  const baseUrl = 'http://*:*';
  const username = '********';
  const password = '****';

  PouchDB.plugin(findPlugin);

  setId(localStorage.getItem('cb-remoteDb'));
  // const localDb = new PouchDB(`localdb${id}`);
  const contextValue = useMemo(async () => {
    const changeDbHandler = (index) => {
      setId(index);
    };
    const localDb = await new PouchDB(`localdb${id}`);
    localDb.info();
    const remoteDb = new PouchDB(`${baseUrl}/remote${id}`, {
      auth: { username, password },
    });
    remoteDb.info();

    PouchDB.sync(localDb, remoteDb, { live: true, retry: true });

    return { localDb, changeDb: changeDbHandler };
  }, [id]);
  return (
    <PouchdbContext.Provider value={contextValue}>
      {children}
    </PouchdbContext.Provider>
  );
}
export default PouchdbContext;

我试图为pouchdb创建一个上下文提供程序。我得到一个错误,说要多次重新呈现。错误:太多的重新渲染。React限制了渲染的数量,以防止无限循环。

ovfsdjhp

ovfsdjhp1#

你应该把所有这些逻辑都放在useEffect里面,因为这种方式会阻止React正确管理效果,并在渲染过程中破坏组件,React在两个地方澄清了它,第一个是在GitHub的一个名为The Rules的文档中,我强烈建议你阅读它,它会向你澄清很多事情,并纠正错误的想法,第二个是在the new React docs中...如果你提到它,你会看到React只允许你在渲染过程中调整状态,但这是一个异常状态,任何其他副作用都应该在事件处理程序中(如useEffect),以尽可能保持组件的纯净。
你犯了一个严重的错误,向一些外部系统发出HTTP请求,或者在效果处理程序之外与一些外部系统同步,实际上,这些情况应该只存在于效果处理程序内部,事实上,React正是为它们制作了useEffect
所以把它们都放进useEffect然后告诉我发生了什么!

相关问题