javascript - 如何通过单击按钮来伪造 Material-ui TextField 上的焦点?

标签 javascript reactjs material-ui

我的网络应用程序有一种间接填写文本字段的方法,并且由于它是多次单击(对于上下文,它是一个日历)和多个字段,我想向用户展示他们在填写时所填写的字段单击下一步按钮。

我无法将焦点放在文本字段本身。这会让用户离开他们正在点击的界面。

我可以将其用于输入,但无法将其用于文本字段。下面是具体的两套代码,我哪里出错了?

文本字段(不起作用)

import React, { useState, useRef, useEffect } from "react";
import { makeStyles } from "@material-ui/core/styles";
import { Button, TextField } from "@material-ui/core";

const useStyles = makeStyles(theme => ({
  root: {
    "& > *": {
      margin: theme.spacing(1)
    }
  }
}));

export default function Inputs() {
  const classes = useStyles();
  const [focused, setFocused] = useState(false);
  const focusedRef = useRef();
  const toggleFocusOnElement = () => {
    setFocused(prevFocused => !prevFocused);
  };
  useEffect(() => {
    if (focused) {
      focusedRef.current.classList.add("Mui-focused");
    } else {
      focusedRef.current.classList.remove("Mui-focused");
    }
  }, [focused]);
  return (
    <>
      <Button onClick={toggleFocusOnElement}>
        {focused ? "Remove" : "Fake"} focus
      </Button>
      <form className={classes.root} noValidate autoComplete="off">
        <TextField
          inputRef={focusedRef}
          defaultValue="Hello world"
          inputProps={{ "aria-label": "description" }}
        />
      </form>
    </>
  );
}

Edit Material demo

输入(工作)

import React, { useState, useRef, useEffect } from "react";
import { makeStyles } from "@material-ui/core/styles";
import { Button, Input } from "@material-ui/core";

const useStyles = makeStyles(theme => ({
  root: {
    "& > *": {
      margin: theme.spacing(1)
    }
  }
}));

export default function Inputs() {
  const classes = useStyles();
  const [focused, setFocused] = useState(false);
  const focusedRef = useRef();
  const toggleFocusOnElement = () => {
    setFocused(prevFocused => !prevFocused);
  };
  useEffect(() => {
    if (focused) {
      focusedRef.current.classList.add("Mui-focused");
    } else {
      focusedRef.current.classList.remove("Mui-focused");
    }
  }, [focused]);
  return (
    <>
      <Button onClick={toggleFocusOnElement}>
        {focused ? "Remove" : "Fake"} focus
      </Button>
      <form className={classes.root} noValidate autoComplete="off">
        <Input
          ref={focusedRef}
          defaultValue="Hello world"
          inputProps={{ "aria-label": "description" }}
        />
      </form>
    </>
  );
}

Edit Material demo

有没有办法绕过这个限制或者有更好的方法来伪造焦点?

最佳答案

Mui-focused类需要应用于 <div>contains the <input> elementinputRef prop 将引用放在 <input> 上元素本身,而 refInput (无论是直接还是通过 TextField InputProps)是 placed on the containing div .

我建议您不要使用 refs 或 useEffect为了这个目的,只需更直接地应用类名:

        <TextField
          InputProps={{ className: focused ? "Mui-focused" : undefined }}
          defaultValue="Hello world"
        />

Edit Fake TextField focus

关于javascript - 如何通过单击按钮来伪造 Material-ui TextField 上的焦点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60380747/

相关文章:

javascript - 如何使用 Service Worker 从一开始就处理获取事件?

c# - 如何根据某些条件隐藏特定的 jqueryui 选项卡?

javascript - 我应该如何更新时间?新日期或setInterval?

javascript - 仅使用输入字段上传文件 - React Hook Form

javascript - 如何使用 React MUI 覆盖 TextField 组件的宽度?

Javascript 构造函数继承助手

ubuntu - webpack-dev-server : ERROR in missing ) after argument list @ multi main

reactjs - Axios 请求超时

css - 如何在 MUI 中设置 body 元素的样式

css - Material-ui makeStyles 默认覆盖