只有当它们从容器中通过时,如何显示反应数字道具?

How to display react numerical props only if they pass from the container?

我有两个不同的容器调用 ControlSection 组件。第一遍 bestScore prop 和第二遍 level prop.

ControlSection 组件中,我只想在 <h2> 中显示道具,前提是它们从容器中传出。我该怎么做?

const ControlSection = ({ score, bestScore, level }) => {
    return (
        <div className='controlSection'>
        <div className='gameStatistics'>
            <h2>Score: {score}</h2>
            {bestScore ? <h2>Best: {bestScore}</h2>}
            {level ? <h2>Level: {level}</h2>}
        </div>
        </div>
    )
}

{typeof bestScore !== 'undefined' && <h2>Best: {bestScore}</h2>}

{typeof level === 'number' && <h2>Level: {level}</h2>}

针对您的情况,我会执行以下操作来满足您的要求:

const ControlSection = ({ score, bestScore, level }) => {
    return (
        <div className='controlSection'>
           <div className='gameStatistics'>
              <h2>Score: {score}</h2>
                 {bestScore != null ? <h2>Best: {bestScore}</h2> : null}
                 {level != null ? <h2>Level: {level}</h2> : null}
            </div>
        </div>
    )
}

通过执行 bestScore != null,代码将 2 个不同的东西识别为 false,即 nullundefined。请参考以下代码示例:

let bestScore = null;
console.log('testing for null value:', bestScore != null);

bestScore = undefined;
console.log('testing for undefined value:', bestScore != null);

bestScore = '';
console.log('testing for \'\' value:', bestScore != null);

bestScore = 0;
console.log('testing for 0 value:', bestScore != null);

false 值的情况下,h2 标签将不会在您的组件中呈现,因此您已经涵盖了 2 个具有 undefinednull 值的情况来自属性。

要处理 0 和 '' 值,您可能需要执行以下操作:

function hasToRender(value) {
    if (value === '') {
        return false;
    } else if (value == 0) {
        return true;
    } else if (value != null) {
        return true;
    }

    return false;
}

console.log('null', hasToRender(null));
console.log('undefined', hasToRender(undefined));
console.log('\'\'', hasToRender(''));
console.log(0, hasToRender(0));
console.log(17, hasToRender(17));

所以我认为适用于您的情况的解决方案将涵盖所有情况:

const ControlSection = ({ score, bestScore, level }) => {
    function hasToRender(value) {
        if (value === '') {
            return false;
        } else if (value == 0) {
            return true;
        } else if (value != null) {
            return true;
        }

        return false;
    }

    return (
        <div className='controlSection'>
        <div className='gameStatistics'>
            <h2>Score: {score}</h2>
                {hasToRender(bestScore) ? <h2>Best: {bestScore}</h2> : null}
                {hasToRender(level) ? <h2>Level: {level}</h2> : null}
            </div>
        </div>
    )
}

当然可以进一步简化 hasToRender 函数,但这为您提供了思路,希望对您有所帮助!

您要查找的术语是条件渲染,定义 prop 时渲染组件的标准方法是使用 && 运算符。

{bestScore && <h2>Best: {bestScore}</h2>}

第二部分 <h2>Best: {bestScore}</h2> 仅在 bestScore 为真时才会呈现。 (你可以在这里使用任何其他条件)

这是因为在JS中,undefinednull0''NaN被计算为假(falsy)。

false && <h1>something</h1> 将被评估为 false,因此不会被渲染。

回到 bestScore 道具,它也可以为 0 并评估为 falsy。你需要照顾好它。像这样的东西可以工作:

{(bestScore || bestScore === 0) && <h2>Best: {bestScore}</h2>}