"bg-danger" 的类名始终应用于卡片,即使条件未得到满足也是如此
className of "bg-danger" is always applied to the Card even if the condition is not getting satisfied
我正在开发这个预算应用程序。
这里 className = "bg-danger","bg-opacity-10" 应该只在 "amount" 大于 "max" 时应用。 (数量 > 最大)
但是这里 class 总是应用于 div.
App.js
import React from 'react'
import './App.css'
import { Container, Stack, Button } from 'react-bootstrap'
import BudgetCard from './components/BudgetCard'
function App() {
return (
<Container className="my-4">
<Stack direction="horizontal" gap={2} className="mb-4">
<h1 className="me-auto">Budgets</h1>
<Button variant="primary">Add Budget</Button>
<Button variant="outline-primary">Add Expenses</Button>
</Stack>
<div
style={{
display: 'grid',
gridTemplateColumns: 'repeat(auto-fill,minmax(300px,1fr))',
gap: '1rem',
alignItems: 'flex-start',
}}
>
<BudgetCard name="Entertainment" gray amount="40" max="1000" />
</div>
</Container>
)
}
export default App
BudgetCard.js
import { Button } from 'react-bootstrap'
import { Card, ProgressBar, Stack } from 'react-bootstrap'
import { currencyFormatter } from '../utils'
export default function BudgetCard({ name, amount, max, gray }) {
const classNames = []
if (amount > max) {
classNames.push('bg-danger', 'bg-opacity-10')
} else if (gray) {
classNames.push('bg-light')
}
return (
<Card className={classNames.join(' ')}>
<Card.Body>
<Card.Title className="d-flex justify-content-between align-items-baseline mb-3">
<div className="me-2">{name}</div>
<div className="d-flex align-items-baseline">
{currencyFormatter.format(amount)}{' '}
<span className="text-muted fs-6 ms-1">
{' '}
/ {currencyFormatter.format(max)}
</span>
</div>
</Card.Title>
<ProgressBar
className="rounded-pill"
variant={getVariant(amount, max)}
min={0}
max={max}
now={amount}
/>
<Stack direction="horizontal" gap="2" className="mt-4">
<Button variant="outline-primary" className="ms-auto">
Add Expenses
</Button>
<Button variant="outline-secondary">View Expenses</Button>
</Stack>
</Card.Body>
</Card>
)
}
function getVariant(amount, max) {
let ratio = amount / max
if (ratio < 0.5) return 'primary'
if (ratio < 0.75) return 'warning'
return 'danger'
}
这是完整的代码。
请找到输出图像以供参考。
pageOutput
请帮我解决这个问题。
尝试使用数字而不是字符串。示例:
<BudgetCard name="Entertainment" gray amount={40} max={1000} />
"40" > "1000" => true
40 > 1000 => false
我正在开发这个预算应用程序。 这里 className = "bg-danger","bg-opacity-10" 应该只在 "amount" 大于 "max" 时应用。 (数量 > 最大) 但是这里 class 总是应用于 div.
App.js
import React from 'react'
import './App.css'
import { Container, Stack, Button } from 'react-bootstrap'
import BudgetCard from './components/BudgetCard'
function App() {
return (
<Container className="my-4">
<Stack direction="horizontal" gap={2} className="mb-4">
<h1 className="me-auto">Budgets</h1>
<Button variant="primary">Add Budget</Button>
<Button variant="outline-primary">Add Expenses</Button>
</Stack>
<div
style={{
display: 'grid',
gridTemplateColumns: 'repeat(auto-fill,minmax(300px,1fr))',
gap: '1rem',
alignItems: 'flex-start',
}}
>
<BudgetCard name="Entertainment" gray amount="40" max="1000" />
</div>
</Container>
)
}
export default App
BudgetCard.js
import { Button } from 'react-bootstrap'
import { Card, ProgressBar, Stack } from 'react-bootstrap'
import { currencyFormatter } from '../utils'
export default function BudgetCard({ name, amount, max, gray }) {
const classNames = []
if (amount > max) {
classNames.push('bg-danger', 'bg-opacity-10')
} else if (gray) {
classNames.push('bg-light')
}
return (
<Card className={classNames.join(' ')}>
<Card.Body>
<Card.Title className="d-flex justify-content-between align-items-baseline mb-3">
<div className="me-2">{name}</div>
<div className="d-flex align-items-baseline">
{currencyFormatter.format(amount)}{' '}
<span className="text-muted fs-6 ms-1">
{' '}
/ {currencyFormatter.format(max)}
</span>
</div>
</Card.Title>
<ProgressBar
className="rounded-pill"
variant={getVariant(amount, max)}
min={0}
max={max}
now={amount}
/>
<Stack direction="horizontal" gap="2" className="mt-4">
<Button variant="outline-primary" className="ms-auto">
Add Expenses
</Button>
<Button variant="outline-secondary">View Expenses</Button>
</Stack>
</Card.Body>
</Card>
)
}
function getVariant(amount, max) {
let ratio = amount / max
if (ratio < 0.5) return 'primary'
if (ratio < 0.75) return 'warning'
return 'danger'
}
这是完整的代码。 请找到输出图像以供参考。 pageOutput
请帮我解决这个问题。
尝试使用数字而不是字符串。示例:
<BudgetCard name="Entertainment" gray amount={40} max={1000} />
"40" > "1000" => true
40 > 1000 => false