当前位置: 首页 > 知识库问答 >
问题:

使用react usestate挂钩防止每个setstate的重新启动

岑熙云
2023-03-14

我有一些多个状态和函数来设置使用useState钩子的状态。

在每个setstate组件上重新渲染。我只想重新渲染完全完成的setstate函数。

例如:

应用程序内。js

const [a, setA] = useState(() => false);
const [b, setB] = useState(() => {});
const [c, setC] = useState(() => props.c);
const [d, setD] = useState(null);
const [e, setE] = useState(null);
const [f, setF] = useState(null);
const [g, setG] = useState('');

const func1 = useCallback(data => {
  setA(true);
  setB(true);
  setC(data && data.c);
  setD();
  setE(isChecked ? 'a' : 'b');
}, []);

const func2 = useCallback(data => {
  setA(false);
  setB(false);
}, []);

const func3 = useCallback(data => {
  setC(false);
  setD(false);
}, []);

const events = {
  func1,
  func2,
  func3
};

const handleMessage = e => {
  const { eventName, data } = e.data;
  const handleEvents = eventName ? events[toCamel(eventName)] : null;
  if (handleEvents && typeof handleEvents === 'function') {
    handleEvents(data);
  }
};

useLayoutEffect(() => {
  iframe.addEventListener('message', handleMessage, true);
  return () => {
    iframe.removeEventListener('message', handleMessage, true);
  };
}, []);

return (
 <Fragment>
  {a && (
    Component1
  )}
  {b && c && (
    Component2
  )}
</Fragment>

);

在每个函数1和函数2上setA和setB返回语句重新呈现元素。我不想在每个setA,setB,setC等重新渲染。一旦函数1或函数2完全完成,只需要重新渲染组件。我对钩子不熟悉,有人能帮忙吗?

共有2个答案

牟恺
2023-03-14

您可以将所有变量存储在一个状态中,如下所示:

const [state,setState] = useState({ a:false, b:{}, c:props.c,d:null})

const func1 = useCallback(data => {
setstate({a:true,b:true,c:data && data.c,d:null})
}, []);
楚修为
2023-03-14

如果您的状态值连接非常紧密,并且希望确保所有内容都立即更新:

const [state, setState] = useState({
  a: () => false,
  b: () => {},
  c: () => props.c,
  d: null,
  e: null,
  f: null,
  g: ''
});

const updateState = newState => setState(Object.assign({}, state, newState));

现在,当您想更新您的状态时,只需像这样使用updateState

const func1 = useCallback(
  (data) =>
    updateState({
      a: true,
      b: true,
      c: data && data.c,
      d: undefined,
      e: isChecked ? 'a' : 'b',
    }),
  [],
);
 类似资料:
  • 例如,当呈现表中的长元素列表时,对的任何调用,无论是否更改表用于枚举的数据,都会导致重新呈现每个子对象。 但是如果是这样的话,当那个链接里的元素数增加到说4000的时候,为什么点击的时候会有这么多的减速呢?当使用稍微复杂一些的自定义React组件时,只使用200个项目时,会注意到显着的减速。

  • 我有一个页面,有一个子组件用于浏览按钮,在父组件上,通过回调我用浏览文件设置状态。

  • 问题内容: 我怎么知道我的Vaadin 7 Web应用程序何时首次启动/启动,这样我才能进行一些初始设置? 同样,我怎么知道我的Web应用程序何时结束,关闭/退出? 问题答案: Vaadin建立在Java Servlet 技术之上。“上下文”是Servlet术语中Web应用程序的技术术语。因此,这里的答案不是特定于Vaadin的,它适用于任何Servlet- 归根结底,Vaadin只是一个大型Se

  • 我有一个Spring启动应用程序。 我已经在我的bean中实现了接口,它在它的方法中启动异步snmp服务器,并在它的方法中停止它。 除了主应用程序上下文在启动后立即停止,所以我的服务器bean也在启动后立即停止之外,所有这些都可以正常工作。 我只需要让spring上下文仅在启动shutdown hook时停止。 这不是一个web应用程序,所以我不需要,它通过启动webserver来解决这个问题,w

  • 我有这个MySQL表 我在这里的目标是防止数据库为给定项目创建重复的。例如,具有的项目具有,但如果我再次输入,它将阻止它输入。但是,如果并且给定的,那么它应该不会有任何问题地插入它。我的问题是,如何防止每个项目重复?