【问题标题】:Is it possible to render a component inside useEffect hook?是否可以在 useEffect 挂钩中渲染组件?
【发布时间】:2021-08-02 12:14:38
【问题描述】:

我只是想知道,是否可以在 useEffect 挂钩中渲染组件。 我有两个组件,比如说 A 和 B。 在组件 A 中,我的 useEffect 挂钩如下。 在测试钩子内的某些条件时,我想渲染一个组件 B。

export default function A() {
  const [location, setlocation] = usestate(null);
  useEffect(() => {
    if (condition) {
      <B />; // it does not render anything though
    } else {
      //code
    }
  }, [location]);
}

export default function B() {
  const test = () => {
    console.log("testing");
  };
  return (
    <View style={styles.container}>
      <Button title={"Click Me"} onPress={test} />
    </View>
  );
}

【问题讨论】:

  • 我不这么认为,但是您可以更新状态并有条件地渲染组件
  • 你必须在你的 useEffect 钩子之后有条件地返回
  • 功能组件呈现它们的返回值。任何不在返回值中的东西都不会被渲染。

标签: javascript reactjs react-native react-hooks expo


【解决方案1】:

无论如何,这不是你想使用useEffect 的地方。

由于location是一个状态原子,它的改变会导致重新渲染,所以效果钩子是不必要的。 (我认为// code 比你在这里说的更复杂......)

对于等效但有效的示例,

export default function A() {
  const [location, setlocation] = useState(null);
  if (condition) {
    return <B />;
  }
  // code
  return null;
}

基于 cmets 编辑

要强制重新渲染(卸载 + 重新安装)组件,您可以使用任意键:

export default function A() {
  const [location, setlocation] = useState(null);
  React.useEffect(() => {
    // ....
  }, [location]);
  return <B key={location} />;
}

根据效果中的条件强制它重新渲染,

export default function A() {
  const [location, setlocation] = useState(null);
  const [conditionCounter, setConditionCounter] = useState(0);
  React.useEffect(() => {
    if(condition) {
      setConditionCounter(c => c + 1);
    }
  }, [location]);
  return <B key={conditionCounter} />;
}

(或者可能只是 new Date()Math.random(),但可以使用计数器。)

【讨论】:

  • 其实场景是,除了第一次渲染外,每次位置(状态变量)的值发生变化时,都应该执行钩子。因此,当它这样做时,它应该渲染组件 B。
  • 所以你的意思是你不希望&lt;B /&gt; 在第一次渲染时被渲染?还是希望条件发生变化时强制重新渲染?
  • &lt;B /&gt; 应该在条件成立时渲染,不管是第一次渲染还是位置变量发生变化。但是只要每次条件满足,就应该强制重新渲染。
最近更新 更多