javascript - 为使用相同处理程序动态创建的每个组件创建单独的状态

标签 javascript reactjs material-ui react-hooks

我有一个使用 Material UI 创建的 React 组件,子组件 (Paper) 是根据数组的项目数动态生成的。

我必须更改悬停的 Paper 的 elevation 属性,以将其与其他的区分开来。

在实际应用中,我不知道数组的项数,所以我必须只为 mouseovermouseout 使用一个事件处理程序,但是我无法找到仅将效果应用于悬停的项目的方法,它已应用于所有项目。我该如何解决这个问题?

这是我的代码(我正在使用 React Hooks)

import React, { useState } from 'react'
import Paper from '@material-ui/core/Paper';
import Grid from '@material-ui/core/Grid';
import { makeStyles } from '@material-ui/core/styles';

const useStyles = makeStyles(theme => ({
    container : {
        backgroundColor: '#f5f5f5',
        padding: theme.spacing(2),  
    },
    paper: {
      padding: theme.spacing(2),         
    },
  }));

const List = () => {     
    const classes = useStyles();  
    const [elevation, setElevation] = useState(1);
    const items = ['a','b'];

    const paperHandleMouseOver = (evt) => {
        setElevation(4);
    }

    const paperHandleMouseOut = (evt) => {
        setElevation(1);
    }

    return(   
        <div className={classes.container}>
            <Grid container spacing={3}>
                {
                    items.map(item => 
                        <Grid item xs={12}>
                            <Paper elevation={elevation} onMouseOver={paperHandleMouseOver} onMouseOut={paperHandleMouseOut} className={classes.paper}>Test{item}</Paper>
                        </Grid>
                    )
                }                
            </Grid>  
        </div>           
    )
}

export default List

提前致谢

最佳答案

您可以尝试跟踪悬停纸张的索引而不是高度,并使用它来切换值,如下所示:

const List = () => {     
  const classes = useStyles();  
  // const [elevation, setElevation] = useState(1); // don't need to use this anymore
  const [selected, setSelected] = useState(); // New state to track hovered
  const items = ['a','b'];

  // notice the extra '() =>' needed to pass in the index
  const paperHandleMouseOver = (i) => (evt) => {
    //setElevation(4);
    setSelected(i);
  }

  const paperHandleMouseOut = (evt) => {
    //setElevation(1);
    setSelected(null);
  }

  return(   
    <div className={classes.container}>
      <Grid container spacing={3}>
        {items.map((item, i) => 
          <Grid item xs={12}>
            <Paper 
              elevation={i === selected ? 4 : 1} // if selected elevate 4 else 1
              onMouseOver={paperHandleMouseOver(i)} // pass the index
              onMouseOut={paperHandleMouseOut} // dont need the index, just unset
              className={classes.paper}>
                Test{item}
            </Paper>
          </Grid>
        )}                
      </Grid>  
    </div>           
  )
}

关于javascript - 为使用相同处理程序动态创建的每个组件创建单独的状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59471702/

相关文章:

JavaScript 数组对象排序未按预期工作

reactjs - 从 Material UI 的 TextField 获取选择开始、结束和选择值

reactjs - 在 Material Ui Datagrid 中更新行后不显示数据

javascript - jQuery .click 函数不适用于 < td > 标签?

javascript - 尝试学习如何在新对象中定义方法

Javascript 在另一个函数执行后调用函数

javascript - "loosely"是否可以使用 React.PropTypes.shape 定义一个对象?

reactjs - 来自 Laravel-mix(Reactjs 和 Laravel)中组件的未解析图像路径

javascript - React navigation withNavigation HOC 在轮播中不起作用

javascript - 在使用 makeStyles 的 Material ui 中,是否可以编写仅在元素具有两个类时才适用的 css 规则?