как выполнить родительское действие от ребенка в react

#javascript #reactjs #ecmascript-6

Вопрос:

У меня есть родитель и его 2 дочерних компонента

Родительский код:

 import React from 'react'; import { Grid, CircularProgress } from '@mui/material'; import { useSelector } from 'react-redux';  import Angle from './Angle/Angle'; import CustomSnackbar from '../Snackbar/CustomSnackbar'; import useStyles from './styles';  const Angles = ({ setCurrentId }) =gt; { const angles = useSelector((state) =gt; state.angles); const [snackbarOpenProp, setSnackbarOpenProp] = React.useState(false); const classes = useStyles();  const handleSnackBarCloseAction = () =gt; {  setSnackbarOpenProp(false) }  const handleAddToCartAction = () =gt; {  console.log('click');  setSnackbarOpenProp(true) }    return (  !angles.length ? lt;CircularProgress /gt; : (  lt;Grid className={classes.container} container alignItems="stretch" spacing={3}gt;  {angles.map((angle) =gt; (  lt;Grid key={angle._id} item xs={12} sm={6} md={6}gt;  lt;Angle angle={angle} setCurrentId={setCurrentId} handleAddToCart={handleAddToCartAction}/gt;  lt;/Gridgt;  ))}  lt;CustomSnackbar openState={snackbarOpenProp} handleSnackBarCloseProp={handleSnackBarCloseAction}/gt;  lt;/Gridgt;  )  ); };  export default Angles;  

Код ребенка 1:

 import React from 'react'; import { Card, CardActions, CardContent, CardMedia, Button, Typography } from '@mui/material'; import Add from '@mui/icons-material/Add';  import { useDispatch } from 'react-redux';   import useStyles from './styles';  const Angle = ({ angle, setCurrentId,handleAddToCart }) =gt; {  const dispatch = useDispatch();  const classes = useStyles();   return (  lt;Card className={classes.card}gt;  lt;CardMedia className={classes.media} image={angle.image} /gt;  lt;div className={classes.overlay}gt;  lt;Typography variant="h6"gt;{angle.qualityName}lt;/Typographygt;  lt;Typography variant="body2"gt;{angle.colors}lt;/Typographygt;  lt;/divgt;  lt;div className={classes.overlay2}gt;  lt;Button onClick={handleAddToCart} style={{ color: 'white' }} size="small" onClick={() =gt; setCurrentId(angle._id)}gt;lt;Add fontSize="large" /gt;lt;/Buttongt;  lt;/divgt;  lt;/Cardgt;   ); };  export default Angle;  

Код ребенка 2:

 import * as React from 'react'; import Button from '@mui/material/Button'; import Snackbar from '@mui/material/Snackbar'; import IconButton from '@mui/material/IconButton'; import CloseIcon from '@mui/icons-material/Close';  export default function CustomSnackbar(props) {    const action = (  lt;React.Fragmentgt;  lt;Button color="secondary" size="small" onClick={props.handleSnackBarCloseProp}gt;  UNDO  lt;/Buttongt;  lt;IconButton  size="small"  aria-label="close"  color="inherit"  onClick={props.handleSnackBarCloseProp}  gt;  lt;CloseIcon fontSize="small" /gt;  lt;/IconButtongt;  lt;/React.Fragmentgt;  );   return (  lt;divgt;  lt;Snackbar  open={props.openState}  autoHideDuration={6000}  onClose={props.handleSnackBarCloseProp}  message="Note archived"  action={action}  /gt;  lt;/divgt;  ); }  

Как вы можете видеть, я пытаюсь прикрепить событием onclick, который находится в child1, так угол код, основанный на кнопку Я пытаюсь изменить значение состояния другого ребенка2 CustomSnackbar и отправить его в качестве опоры, но при нажатии, но я не получаю ответ, Как я могу сделать это, и есть ли более простой способ достичь этого ?

Ответ №1:

В компоненте кнопки есть два onClick метода. Пожалуйста, измените в соответствии с приведенным ниже примером и попробуйте.

До:

 lt;Button onClick={handleAddToCart} style={{ color: 'white' }} size="small" onClick={() =gt; setCurrentId(angle._id)}gt;lt;Add fontSize="large" /gt;lt;/Buttongt;  

После:

 lt;Button   style={{ color: 'white' }}   size="small"   onClick={() =gt; {   handleAddToCart();  setCurrentId(angle._id)  }  }gt;  lt;Add fontSize="large" /gt;  lt;/Buttongt;  

Комментарии:

1. О да,я пропустил другой онклик, спасибо, что указали

2. добро пожаловать, человек, счастливого кодирования