我正在使用上下文 api 和钩子,有 20 个状态变量,在每次更改(设置状态(中,函数都会再次调用或重新渲染,所以我关心的是调用钩子函数。
例如,如果我使用useState, useReducer, useMemo, useCallback
每次重新渲染都会再次调用它们?
function GroupProvider(props) {
const socket = useMemo(()=> io(url), [socket]);
const [grouplist, setGrouplist] = useState([]);
const [refreshid, setRefreshid] = useState('');
const [messages, setMessages] = useState({});
const [ppl, setPpl] = useState(people);
const [groupname, setGroupname] = useState(name);
const [groupimg, setGroupimg] = useState(img);
const [groupnamesaving, setGroupnamesaving] = useState(false);
const [groupimgsaving, setGroupimgsaving] = useState(false);
const [editgroupname, setEditgroupname] = useState(false);
const [addingmember, setAddingmember] = useState(false);
const [modalVisible, setModalVisible] = useState(false);
const [leavinggroup, setLeavinggroup] = useState(false);
const [changeAdminModal, setChangeAdminModal] = useState(false);
const [changingAdmin, setChangingAdmin] = useState(false);
const [loadingModal, setLoadingModal] = useState(false);
}
这里如果在每次重新渲染时,钩子函数调用,所以可能会影响性能。
是的,它们在每次渲染时都会被调用,在第一次渲染中,它会初始化一个存储单元,在重新渲染时读取当前单元的值:
当你调用像 useState(( 这样的 Hook 时,它会读取当前单元格(或 在第一次渲染期间初始化它(,然后将指针移动到 下一个。这就是多个 useState(( 调用每个调用的方式 独立的地方国家。
https://reactjs.org/docs/hooks-faq.html#how-does-react-associate-hook-calls-with-components
始终在 React 函数的顶层使用 Hooks。通过遵循此规则,您可以确保每次渲染组件时都以相同的顺序调用 Hook。
参考链接:- https://reactjs.org/docs/hooks-rules.html
更新: 当我控制台记录 useState 中的开发反应库,并加载一个使用 1 次 useState 的页面时,在第一次渲染时,我收到了 23 次对 useState 的调用。
在重新渲染时,由状态更改触发,我收到 3 次调用 useState。
在同一组件中,我使用第二个参数 []。在第一次渲染时,它从反应库中调用了 12 次。在由状态更改引起的重新渲染时,它被调用一次。
它确实每次都打电话给他们。
我已经编辑了这个答案,以便不会发布错误的信息。