Javascript 在React中,如果状态不';不影响渲染?

Javascript 在React中,如果状态不';不影响渲染?,javascript,reactjs,react-hooks,Javascript,Reactjs,React Hooks,例如,假设我有一个用于发出API请求的钩子: function useApi(...) { const [state, setState] = useState({ fetching: false }); useEffect(() => { setState({ fetching: true }); fetch(...) .then(() => setState({ fetching: false })); }, [...]); ret

例如,假设我有一个用于发出API请求的钩子:

function useApi(...) {
  const [state, setState] = useState({ fetching: false });

  useEffect(() => {
    setState({ fetching: true });
    fetch(...)
      .then(() => setState({ fetching: false }));
  }, [...]);

  return { fetching: state.fetching };
}
有时,
useApi
的状态会影响渲染:

function Foo() {
  const { fetching } = useApi(...);

  if (fetching) {
    return 'Loading';
  }
  return 'Foo';
}
function Bar() {
  useApi(...);

  return 'Bar';
}
其他情况下,它不会影响渲染:

function Foo() {
  const { fetching } = useApi(...);

  if (fetching) {
    return 'Loading';
  }
  return 'Foo';
}
function Bar() {
  useApi(...);

  return 'Bar';
}
useApi
中的
setState
不影响渲染时,是否可以避免重新渲染组件


我知道这不会对性能产生太大影响,但知道这是否可行是件好事。

您可以创建一个
布尔
标志来确定是否要及时更改
useApi
钩子状态

const { fetching } = useApi(..., flag);
然后在
useApi
hook中:

function useApi(..., flag) {
  const [state, setState] = useState({ fetching: false });

  useEffect(() => {
    flag && setState({ fetching: true });

    fetch(...)
      .then(() => {
         flag && setState({ fetching: false }));
         // do other stuff
      });
  }, [...]);

  return { fetching: state.fetching };
}

您可以创建一个
boolean
标志来确定是否要及时更改
useApi
挂钩状态

const { fetching } = useApi(..., flag);
然后在
useApi
hook中:

function useApi(..., flag) {
  const [state, setState] = useState({ fetching: false });

  useEffect(() => {
    flag && setState({ fetching: true });

    fetch(...)
      .then(() => {
         flag && setState({ fetching: false }));
         // do other stuff
      });
  }, [...]);

  return { fetching: state.fetching };
}

您可以将参数传递给
useApi
,并根据其值不使用挂钩中的
setState
。不,当前设置无法阻止重新渲染。您可以使用诸如记忆的挂钩依赖项列表之类的方法来减少重新渲染的影响,但无法阻止它们。或者,正如其他人提到的,更新钩子,使参数控制重新渲染逻辑。但是如果您没有使用钩子的返回值,那么您可能不应该使用它。您只需在组件中直接触发fetch请求即可。您可以将参数传递给
useApi
,并根据其值不使用钩子中的
setState
。不,当前设置无法阻止重新渲染。您可以使用诸如记忆的挂钩依赖项列表之类的方法来减少重新渲染的影响,但无法阻止它们。或者,正如其他人提到的,更新钩子,使参数控制重新渲染逻辑。但是如果您没有使用钩子的返回值,那么您可能不应该使用它。您只需在组件中直接触发fetch请求