reactjs 组件内部的条件逻辑

fdx2calv  于 2023-02-12  发布在  React
关注(0)|答案(2)|浏览(163)

这里我有这个复选框出现在“率”字段内,当投标处于草案或待定状态时,这个复选框应该出现,当它不是,它应该消失。由于某种原因,我不能弄清楚如何构造这个条件逻辑,它只采取在第二个参数,所以当项目处于“草案”状态时,复选框不显示。我在这里做错了什么:

<HrCurrencyInput
            name='Rate'
            label='Rate'
            width={width.medium}
            onChange={handleChange}
            value={formik.values.OverrideRate ? formik.values.Rate : selectedBillable?.Cost ?? ''}
            errors={formik.errors.Rate}
            InputProps={{
                endAdornment: 
                (
                  status === "Draft" || status === "Pending" &&
                  (
                    <InputAdornment position="end">
                        <HrCheckBox
                            name="OverrideRate"
                            checked={formik.values.OverrideRate}
                            onChange={handleOverrideChange}
                            sx={{
                                m: "0 -8px 0 0",
                                "& .MuiCheckbox-root": {
                                    p: 0
                                }
                            }}
                        />
                    </InputAdornment>
                    )
                )
            }}
            InputLabelProps={{ shrink: true }}
            disabled={!formik.values.OverrideRate}
        />

待定:

草稿:

dy1byipe

dy1byipe1#

需要注意的是布尔值也是有效的react元素。如果你试图渲染falsetrue,React会忽略它们。在这里,如果你的第一个条件是真的,它评估true,浏览器甚至不会检查其他条件(因为它后面跟着||)。
基本上当你有这样的情况时:

A || B

如果A为truthy,则会对其进行求值,甚至不考虑B。在您的示例中也是如此。如果状态为“draft”,则endAdornment的值为:

true || ... && ...

其为=== true
试着将你的前两个条件分组如下:

(status === "Draft" || status === "Pending") && ...

将修复第一个括号计算为true或false时的问题。
&&的情况下,如果第一个操作数为false,则它的值为false(result中没有呈现任何内容)。如果它的值为true,则它进入下一步并呈现您想要的内容。所呈现的内容是一个对象,并且是真实的。因此,您的条件的最终计算表达式将是准确的呈现对象,您就完成了。
如果我需要进一步澄清,请让我知道。

yuvru6vn

yuvru6vn2#

<HrCurrencyInput
            name='Rate'
            label='Rate'
            width={width.medium}
            onChange={handleChange}
            value={formik.values.OverrideRate ? formik.values.Rate : selectedBillable?.Cost ?? ''}
            errors={formik.errors.Rate}
            InputProps={{
                endAdornment: 
                (
                  (status === "Draft" || status === "Pending") ?
                  (
                    <InputAdornment position="end">
                        <HrCheckBox
                            name="OverrideRate"
                            checked={formik.values.OverrideRate}
                            onChange={handleOverrideChange}
                            sx={{
                                m: "0 -8px 0 0",
                                "& .MuiCheckbox-root": {
                                    p: 0
                                }
                            }}
                        />
                    </InputAdornment>
                    ) : (<></>)
                )
            }}
            InputLabelProps={{ shrink: true }}
            disabled={!formik.values.OverrideRate}
        />

相关问题