javascript - 在 useState 中更新 Map 时避免重新渲染组件

标签 javascript reactjs react-hooks

如何在 useState 中填充 Map 而不触发 React 组件的重新渲染?

const [myMap, setMyMap] = useState(new Map());

我将键值放在那里,但每次使用时都会重新渲染组件

const insertToMap = (myMap, setMyMap, k, v) => {
myMap[k] = v;
  setMyMap(myMap);
}

const insertToMap = (myMap, setMyMap, k, v) => {
myMap[k] = v;
  setMyMap(myMap.set(k, v));
}

如何填充 map 而不导致重新渲染?

最佳答案

如果渲染时根本不考虑 map ,那么您可以改变它 - 在这种情况下,使用 ref 比使用 state 更有意义:

const myMapRef = useRef(new Map());
// reference myMapRef.current to get to the map

但还要注意,如果要将 Map 作为 Map 使用,则应使用 Map 方法 .set.get.has :

const insertToMap = (myMap, k, v) => {
  myMap.set(k, v);
};

如果你想使用括号表示法来存储值,你几乎肯定应该使用普通对象,例如

const myObjRef = useRef({});
myObjRef[k] = v;

如果您确实希望更改值而不导致重新渲染。但考虑到

I want the checked-prop of each checkbox to be rendered correctly according to the Map on a re-render

听起来这确实应该是有状态的 - 您几乎肯定希望值的更改会导致复选框立即被选中或取消选中(通过状态)更改并导致重新渲染)。

有状态值能够轻松克隆是件好事,这样设置它们的状态(无需改变当前处于状态的对象)就不会太乏味。考虑使用对象而不是 Map,并且:

const [checkboxes, setCheckboxes] = useState({});
const insert = (k, v) => {
  setCheckboxes({ ...checkboxes, [k]: v });
};

如果在状态更新之前多次调用此函数,请改用回调形式:

setCheckboxes(checkboxes => ({ ...checkboxes, [k]: v }));

My first thought was to fill the Map without triggering re-renders

如果所有初始 setter 同步发生,则不必担心。您还可以在调用此组件之前填充它,并将填充的对象作为 prop 向下传递。

关于javascript - 在 useState 中更新 Map 时避免重新渲染组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65624156/

相关文章:

Javascript 关闭您刚刚打开的选项卡

reactjs - React TS - 如何将 props 从父组件传递给深度嵌套的子组件

reactjs - 如何使用react-testing-library使用ref测试逻辑并更新useEffect/useLayoutEffect内的状态

javascript - Angular 重新加载 url 但不是状态 View

javascript - 在 EaselJS 中按名称定位多个阶段的子级

javascript - 如何从单个文件导出多个类?

javascript - 无法触发电影 API 项目的搜索功能,因为 useState 位于不同的组件中

javascript - React.js 中的混合和复制方法

javascript - react Hook : useState() makes all children component re-rendered although the change doesn't affect some of them

javascript - useEffect Hook 在状态更改后不触发