如何在 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 的强大功能,您可以轻松创建引人入胜且用户友好的界面。

更新于:2023年11月1日

284 次浏览

启动您的 职业生涯

通过完成课程获得认证

开始学习
广告