javascript - 从 React JS 中的输入字段获取值

标签 javascript reactjs redux material-ui query-string

我已经从输入字段中获取了值,但我的问题是我必须将其放入 useEffect 中,因为我只希望在按下 onSearch 函数后才这样做它会搜索。好吧,我只能使用 onChange 函数从输入中获取值。当我还在打字时,它已经运行了 useEffect。如何从参数中获取值并将其放入输入字段,以便我刷新浏览器它仍然存在?我将如何解决这两个问题?

请参阅下面我的代码:

export default function Students() {
  const classes = useStyles();
  const dispatch = useDispatch();
  const students = useSelector((state) => state.student.students);
  const isLoading = useSelector((state) => state.student.isLoading);
  const totalPages = useSelector((state) => state.student.totalPages);
  const currentPage = useSelector((state) => state.student.currentPage);
  const itemsPerPage = useSelector((state) => state.student.itemsPerPage);
  const previous = useSelector((state) => state.student.previous);
  const next = useSelector((state) => state.student.next);
  const history = useHistory();
  const location = useLocation();
  const { search } = location;
  const params = new URLSearchParams(search);
  const page = params.has('page') ? parseInt(params.get('page')) : 1;
  const rowsPerPage = params.has('rowsPerPage') ? parseInt(params.get('rowsPerPage')) : 10;
  const [searchValue, setSearchValue] = React.useState('');

  const handleChangePage = (event, newPage) => {
    params.set('page', newPage + 1);
    history.push('/students?' + params.toString());
  };

  const handleChangeRowsPerPage = (event) => {
    params.delete('page');
    params.set('rowsPerPage', +event.target.value);
    history.push('/students?' + params.toString());
  };

  const onChange = (event) => {
    setSearchValue(event.target.value);
  };

  const onSearch = () => {
    params.delete('page');
    params.delete('rowsPerPage');
    params.set('key', searchValue.toString());
    history.push('/students?key=' + searchValue.toString());
    dispatch(getStudents(10, 1, searchValue.toString()));
  };

  useEffect(() => {
    dispatch(getStudents(rowsPerPage, page, ''));
  }, [page, rowsPerPage, dispatch]);

  return (
    <div>
      <div className={classes.title}>
        <h2>Students</h2>
      </div>

      <div className={classes.header}>
        <Paper component="form" className={classes.searchBarSection}>
          <InputBase
            className={classes.input}
            placeholder="Search..."
            inputProps={{ 'aria-label': 'search...' }}
            onChange={onChange}
          />
          <IconButton type="button" className={classes.iconButton} aria-label="search" onClick={onSearch}>
            <SearchIcon />
          </IconButton>
        </Paper>
      </div>

      {isLoading ? (
        <div style={{ display: 'flex', justifyContent: 'center' }}>
          <CircularProgress />
        </div>
      ) : students && students.length > 0 ? (
        <Paper className={classes.root}>
          <TableContainer className={classes.container}>
            <Table stickyHeader aria-label="sticky table">
              <TableHead>
                <TableRow>
                  <TableCell>First Name</TableCell>
                  <TableCell>Last Name</TableCell>
                  <TableCell>Actions</TableCell>
                </TableRow>
              </TableHead>
              <TableBody>
                {students.map((patient, index) => (
                  <TableRow key={index}>
                    <TableCell>{patient.FirstName}</TableCell>
                    <TableCell>{patient.LastName}</TableCell>>
                    <TableCell>
                      <Button variant="contained" size="small" color="primary" startIcon={<VisibilityIcon />}>
                        View
                      </Button>
                    </TableCell>
                  </TableRow>
                ))}
              </TableBody>
            </Table>
          </TableContainer>
          <TablePagination
            rowsPerPageOptions={[10, 25, 100]}
            component="div"
            count={totalPages}
            rowsPerPage={itemsPerPage}
            page={currentPage - 1}
            backIconButtonProps={{
              disabled: previous === null,
            }}
            nextIconButtonProps={{
              disabled: next === null,
            }}
            onChangePage={handleChangePage}
            onChangeRowsPerPage={handleChangeRowsPerPage}
          />
        </Paper>
      ) : (
        <Typography variant="body2">No Students Available...</Typography>
      )}
    </div>
  );
}

最佳答案

这里不需要useEffect

删除useEffect并更改onSearch:

const onSearch = () => {
  params.delete('page');
  params.delete('rowsPerPage');
  params.set('key', searchValue.toString());
  history.push('/students?key=' + searchValue.toString());
  dispatch(getStudents(rowsPerPage, page, searchValue.toString()));
};

关于javascript - 从 React JS 中的输入字段获取值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62300402/

相关文章:

javascript - document.ready() 和其他定义函数中的局部变量

reactjs - React Native - 在按钮 onPress 中访问 'this' 导致应用程序崩溃

javascript - 这是类型注释、对象还是其他什么?

angularjs - 如果有简单的方法,为什么我们需要reactjs-bootstrap?

reactjs - 如何用react hooks完全替代redux?

javascript - 使用 Redux 进行简单的登录身份验证 React

javascript - HTML/CSS 使图像容器与旁边的容器大小相同

javascript - 有没有我可以练习 javascript 的程序/shell?

javascript - 异步列出目录内容

javascript - react native + Redux : How to properly pass in props to action callers?