reactjs - 在 React 中,第一次出现在页面上时以不同方式呈现组件的最佳方式是什么?

标签 reactjs react-hooks use-effect

我有一些 React 组件将在我的应用程序中大量使用。

我只希望它们在 DOM 中第一次打印时返回为

<symbol id="SVGComponent"><SVGComponent></symbol><use href="#SVGComponent" />

而接下来的每一次打印都应该是唯一的 <use href="#SVGComponent" />因为符号已经在页面中声明了

const [firstTime, setFirstTime] = useState(true);

useEffect(() => { setFirstTime(false) }, []);
if (firstTime) {
    return (<symbol id="Component"><Path /></symbol>);
}
else {
    return(<use href="#Component"/>);
}

到目前为止,这是我的代码,但条件总是返回 false .

在 React 中如何实现 useEffect ? 预先感谢您的帮助

最佳答案

并不是说你的条件总是返回false。问题是您在第一次渲染后立即更改状态(在 useEffect 中,您将状态变量值设置为 false),这会导致另一个立即重新渲染,因此您跳过true 变量的条件(从技术上讲,您不会跳过它,您只需呈现 true 状态,然后立即使用 false 重新呈现)。

如果您不更改安装 useEffect 中的状态,您会注意到代码可以正常工作。但是,为了做到这一点,您必须使用 useRef,它基本上使您能够创建一个在重新渲染之间持续存在的变量,但其值的变化不会导致重新渲染(与状态变量不同来自 useState)。

我添加了一个按钮来模拟状态变化,换句话说 - 模拟第二次渲染:

import React, { useState, useRef, useEffect } from 'react';

function App() {
    const [buttonClicked, setButtonClicked] = useState(false);

    const isFirstRender = useRef(true);

    useEffect(() => {
        isFirstRender.current = false;
    }, []);

    const renderRepresentation = () => {
        if (isFirstRender.current) {
            return (
                <symbol id="Component">
                    <Path />
                </symbol>
            );
        }
        else {
            return (
                <use href="#Component" />
            );
        }
    }

    return (
        <>
            {renderRepresentation()}
            <button onClick={() => setButtonClicked(true)}>SIMULATE STATE CHANGE</button>
        </>
    );
}

这是一个 codesandbox demo你可以试试。

关于reactjs - 在 React 中,第一次出现在页面上时以不同方式呈现组件的最佳方式是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66573270/

相关文章:

javascript - React中如何获取某个状态下数组的长度?

javascript - React 组件有时会在状态不变的情况下渲染两次

reactjs - 如何从 UseEffect Hook 返回值

php - 在 react 中使用Fetch,需要用户名密码才能访问数据库

javascript - 在 react 中添加对象数组时使用 concat 而不是 es6 spread

javascript - 用 enzyme 测试支柱钻井

javascript - 通过使用按钮 React 设置状态来循环遍历数组中的对象

javascript - Redux 状态更新,但组件状态与第一次相比没有改变

reactjs - 使用 useState 和 useContext React Hooks 持久化 localStorage

reactjs - 在 useEffect 中使用 useState 值而不使状态更新 useEffect