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