如何在 Material UI 的评分组件中鼠标悬停时显示标签?
Material UI 是一个 React UI 框架,它提供了一系列组件,用于创建现代且用户友好的界面。其中一个组件是评分组件,通常用于收集用户反馈并显示产品或服务的评分。
虽然评分组件显示星标(或任何其他图标)来表示评分值,但通过在用户将鼠标悬停在星标上时显示标签来提供信息,可以增强用户体验。
在本文中,我们将学习如何在 Material UI 的评分组件中鼠标悬停时显示标签。
在评分中显示标签的步骤
下面,我们概述了向评分组件添加标签的完整步骤:
步骤 1:创建一个新的 React 应用并安装 MUI
首先,让我们从创建一个 React 应用和安装 Material UI 开始。请按照以下步骤操作:
打开您的终端并运行以下命令:
npx create react app projectname
项目创建后,通过运行以下命令导航到项目目录:
cd projectname
通过运行以下命令安装 Material UI 及其依赖项:
npm install @mui/material @emotion/react @emotion/styled
步骤 2:将所需的组件导入 React
打开 App 组件并将所需的组件导入其中。
import { Rating } from '@mui/material
步骤 3:添加鼠标悬停标签
要添加鼠标悬停标签,请使用 `onChangeActive` 和 `getLabelText` 属性。使用方法语法如下:
//define labels const labels = { 1: Poor, 2: Good, … } //get ratings to display along with the rating stars function getRatings(val) { return `${val} Star${val !== 1 ? "s" : ""}, ${labels[val]}`; } // define the states const [val, setVal] = useState(2); const [hover, setHover] = useState(-1); //use in App() component <div> <Rating precision={0.5} value={val} getLabelText={getRatings} onChange={(event, newValue) => { setVal(newValue); }} onChangeActive={(event, newHover) => { setHover(newHover); }} emptyIcon={<StarIcon style={{ opacity: 0.40 }} fontSize="inherit" />} /> {val !== null && ( <Typography>{ratingLabels[hover !== -1 ? hover : val]}</Typography> )} </div>
评分 API
<Rating> − 此 API 用于允许用户在 Material UI 中提交自己的评分。
属性
classes − 此属性用于覆盖或向元素添加样式。
disabled − 此属性用于禁用评分。
emptyIcon − 此属性在为空时显示图标。
emptyLabelText − 此属性用于在为空时读取标签。
getLabelText − 此属性用于获取当前评分值。
highlightSelectedOnly − 此属性用于突出显示选定的图标。
icon − 此属性用于显示图标。
IconContainerComponent − 此属性包含图标。
max − 此属性用于给出最大评分。
name − 此属性用于添加评分名称。
onChange − 此属性用于在输入更改时触发回调函数。
onChangeActive − 此属性定义鼠标悬停时评分状态的变化。
precision − 此属性用于添加评分精度。
size − 此属性用于更改大小。
sx − 此属性用于向 Material UI 组件添加自定义样式。
value − 此属性用于为组件赋予值。
示例
在此示例中,我们创建了一个带有标签的基本评分组件。评分组件的精度为 1,鼠标悬停时会根据所选评分级别显示标签。为了演示和显示标签,我们使用了评分 API 组件的 `onChangeActive` 属性。
import { Box, Rating, Typography } from "@mui/material"; import React from "react"; import StarIcon from "@mui/icons-material/Star"; import { useState } from "react"; const ratingLabels = { 1: "Useless", 2: "Poor", 3: "Ok", 4: "Good", 5: "Excellent", }; function getRatings(val) { return `${val} Star${val !== 1 ? "s" : ""}, ${ratingLabels[val]}`; } const App = () => { const [val, setVal] = useState(2); const [hover, setHover] = useState(-1); return ( <div> <Box sx={{p: 10}}> <Rating precision={1} value={val} name="hover-ratings" getLabelText={getRatings} onChange={(event, newValue) => { setVal(newValue); }} onChangeActive={(event, newHover) => { setHover(newHover); }} sx={{fontSize: 40}} emptyIcon={<StarIcon style={{ opacity: 0.40 }} fontSize="inherit" />} /> {val !== null && ( <Typography sx={{ fontSize: 20, color: 'green' }}>{ratingLabels[hover !== -1 ? hover : val]}</Typography> )} </Box> </div> ); }; export default App;
输出
示例
在此示例中,我们创建了另一个带有标签的评分组件。评分组件的精度为 0.5,鼠标悬停时会根据所选评分级别显示标签。此示例与上一个示例的区别在于,它允许用户选择以半星为单位的评分,如下例所示。这里,我们也使用了评分 API 组件的 `onChangeActive` 属性来演示和显示标签。
import { Box, Rating, Typography } from "@mui/material"; import React from "react"; import StarIcon from "@mui/icons-material/Star"; import { useState } from "react"; const ratingLabels = { 0.5: 'Useless', 1: 'Very Useless', 1.5: 'Poor', 2: 'Very Poor', 2.5: 'Ok', 3: 'Very Ok', 3.5: 'Good', 4: 'Very Good', 4.5: 'Excellent', 5: 'Very Excellent', }; function getRatings(val) { return `${val} Star${val !== 1 ? "s" : ""}, ${ratingLabels[val]}`; } const App = () => { const [val, setVal] = useState(2); const [hover, setHover] = useState(-1); return ( <div> <Box sx={{p: 10}}> <Rating precision={0.5} value={val} name="hover-ratings" getLabelText={getRatings} onChange={(event, newValue) => { setVal(newValue); }} onChangeActive={(event, newHover) => { setHover(newHover); }} sx={{fontSize: 40}} emptyIcon={<StarIcon style={{ opacity: 0.40 }} fontSize="inherit" />} /> {val !== null && ( <Typography sx={{ fontSize: 20, color: 'green' }}>{ratingLabels[hover !== -1 ? hover : val]}</Typography> )} </Box> </div> ); }; export default App;
输出
示例
在此示例中,我们自定义了评分组件和标签。评分组件的精度为 0.5,鼠标悬停时会根据所选评分级别显示标签。在此代码中,我们更改了评分组件和标签的颜色和字体大小,使它们更具吸引力或更具个性化。我们使用了评分 API 组件的 `onChangeActive` 属性。
import { Box, Rating, Typography } from "@mui/material"; import React from "react"; import StarIcon from "@mui/icons-material/Star"; import { useState } from "react"; import {styled} from '@mui/material/styles' const ratingLabels = { 0.5: "Useless", 1: "Very Useless", 1.5: "Poor", 2: "Very Poor", 2.5: "Ok", 3: "Very Ok", 3.5: "Good", 4: "Very Good", 4.5: "Excellent", 5: "Very Excellent", }; function getRatings(val) { return `${val} Star${val !== 1 ? "s" : ""}, ${ratingLabels[val]}`; } const CustomRating = styled(Rating)({ '& .MuiRating-iconFilled': { color: 'green' }, '& .MuiRating': { fontSize: 40 }, }); const App = () => { const [val, setVal] = useState(2); const [hover, setHover] = useState(-1); return ( <div> <Box sx={{ p: 10 }}> <CustomRating precision={0.5} value={val} name="hover-ratings" getLabelText={getRatings} onChange={(event, newValue) => { setVal(newValue); }} onChangeActive={(event, newHover) => { setHover(newHover); }} /> {val !== null && ( <Typography sx={{ fontSize: 20, color: "green" }}> {ratingLabels[hover !== -1 ? hover : val]} </Typography> )} </Box> </div> ); }; export default App;
输出
结论
在此示例中,我们学习了如何在将鼠标悬停在评分组件上时显示标签。文章中列出了步骤及其正确的语法和完整的示例,并采用了不同的方法。除此之外,为了自定义组件的外观和行为,Material UI 允许根据应用程序的需要自定义评分组件。借助 Material UI 和 React 的强大功能,您可以轻松创建引人入胜且用户友好的界面。