繁体   English   中英

Material ui:表格滚动到新页面的顶部

[英]Material ui : Table scroll to top of new page

我对此有点迷茫。

我已经尝试了许多使用 scrollTop 的设置。 让我解释一下,我在这里使用材料 Ui 及其分页内容和表格文档,所以当我点击下一组行(或更改页面)时我被卡住了,我从底部开始。 但我想从每一行的顶部开始。

如果有人可以帮助我并解释原因,非常感谢,对不起。 我对 React 很陌生。

这是我的代码:

function DisplayList(props) {
   var rows = [];
   const data = props.data;
   const searchData = props.searchData;
   const setHoverAddress = props.setHoverAddress;

   const classes = useStyles1();

   const [page, setPage] = useState(0);
   const [rowsPerPage, setRowsPerPage] = useState(5);

   const handleChangePage = (event, newPage) => {
       setPage(newPage);   
   };

   const handleChangeRowsPerPage = (event) => {
       setRowsPerPage(parseInt(event.target.value, 10));
       setPage(0);
   };


   data.map((result, index) => { // WARNING : slice here which limits the number of results: .slice(0, 5)
       const volulme = Math.round(result.volulme);
       const volulme2 = Math.round(result.volulme2);


       rows.push(
       <div id={index}>
           <ListItem 
           alignItems="flex-start"
           onMouseEnter={e => {
               console.log(index);
           }}
           >
               <Grid container direction="row" spacing={1}>
                   <Grid item xs={5}>

                   {/* <Stage width={150} height={150}>
                       <Layer>
                       <Shape
                           sceneFunc={(context, shape) => {
                           context.beginPath();
                           context.moveTo(20, 10);
                           context.lineTo(120, 80);
                           context.lineTo(120, 140);
                           context.lineTo(22, 140);
                           context.closePath();
                           // (!) Konva specific method, it is very important
                           context.fillStrokeShape(shape);
                           }}
                           fill="#00D2FF"
                           stroke="black"
                           strokeWidth={2}
                       />
                       </Layer>
                   </Stage> */}

                   </Grid>
                   <Grid item xs={7}>
                   <ListItemText
                   primary={
                   }
                   secondary={
                       <React.Fragment>
                       <Typography
                           component="span"
                           variant="body2"
                           display="inline"
                           color="textPrimary"
                       >
                           Solid2 : {volulme2}
                       </Typography>
                       </React.Fragment>
                   }
                   />
                   <ListItemText
                   secondary={
                       <React.Fragment>
                       <Typography
                           component="span"
                           variant="body2"
                           display="inline"
                           color="textPrimary"
                       >
                           Solid : {volulme}
                       </Typography>
                       </React.Fragment>
                   }
                   />
                   <FormControlLabel
                   control={
                       <Checkbox icon={<FavoriteBorder />} 
                       checkedIcon={<Favorite />} 
                       color="primary"
                       onClick={(e) => {
                           if (e.target.checked) {
                               addFavourite(parc_id, 1)
                           } else {
                               removeFavourite(parc_id, 1)
                           }
                       }}
                       name="checkedH" />
                   }
                       label="Enregistrer"
                   />
                   </Grid>
               </Grid>
           </ListItem>
       </div>
       )
   })


   return (
           <Table className={classes.table} aria-label="custom pagination table">
               <TableBody>
               {(rowsPerPage > 0
                   ? rows.slice(page * rowsPerPage, page * rowsPerPage + rowsPerPage)
                   : rows
               ).map((row) => (
                   <TableRow key={index}>
                       <TableCell component="th" scope="row">
                           {row}
                       </TableCell>
                   </TableRow>
               ))}
               </TableBody>
               <TableFooter>
                   <TableRow>
                       <TablePagination
                       rowsPerPageOptions={[5, 10, 25, { label: 'All', value: -1 }]}
                       colSpan={3}
                       count={rows.length}
                       rowsPerPage={rowsPerPage}
                       page={page}
                       SelectProps={{
                           inputProps: { 'aria-label': 'rows per page' },
                           native: true,
                       }}
                       onChangePage={handleChangePage}
                       onChangeRowsPerPage={handleChangeRowsPerPage}
                       ActionsComponent={TablePaginationActions}
                       />
                   </TableRow>
               </TableFooter>
           </Table>
   )
}

我在您的示例中没有看到 scrollTop ,因此很难准确地说出问题所在。 如果你只是想滚动 window 试试window.scrollTo(0, 0);

https://developer.mozilla.org/en-US/docs/Web/API/Window/scrollTo

如果您尝试滚动表格元素本身,您可以使用参考。

在组件顶部添加:

function DisplayList(props) {
   const tableRef = React.createRef();
   var rows = [];
   const data = props.data;
   ...

将 ref 添加到您的表中:

  return (
  <Table
    ref={tableRef}
    className={classes.table}
    aria-label="custom pagination table"
  >
    <TableBody>
    ...

最后,您的页面事件使用 ref 更改 scrollTop

const handleChangePage = (event, newPage) => {
  setPage(newPage);   
  tableRef.current?.scrollTop = 0;
};

你试过scrollIntoView吗? 我使用scrollTo不起作用,但scrollIntoView很好。

  const handleChangeRowsPerPage = (event) => {
    tableRef.current && tableRef.current.scrollIntoView();

    setRowsPerPage(parseInt(event.target.value, 10))
    setPage(0)
  }

Оn Angular 材料我喜欢这个

// html
<table mat-table [dataSource]="dataSource" #dataTable>
...
</table>

// ts
@ViewChild('dataTable') dataTable: ElementRef;

pageChange(event: { pageSize: number; pageIndex: number; }): void {
    const tableElement = this.dataTable['_elementRef']?.nativeElement;
    tableElement?.scrollIntoView();
    // set current page event.pageIndex or event.pageIndex + 1
    // get data
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM