为什么我必须单击 TextField 两次才能显示我的列表?

洗澡

我从@material-ui/[email protected] 更新到@material-ui/[email protected]由于这样做,我的所有 TextField 都必须单击两次才能显示列表。该问题似乎与版本更新无关,因为如果切换回 v4.9.1 版本问题仍然存在。

包.json

"dependencies": {
    "@material-ui/core": "4.10.2",
    "@material-ui/icons": "^4.9.1",
    "@material-ui/styles": "^4.4.1",

.js 文件

    let getBoards = () => {
    const client = new GraphQLClient(url, {
      headers: {
        Authorization: token,
      },
    })

    const query = `{
        boards() {
            id
            name
            owner {
                id
                name
            }
        }
    }`

    client.request(query)
      .then(data => {
        console.log('data: ', data)
        let tempArray = [];

        for (let i = 0; i < data.boards.length; i++) {
          if (data.boards[i].name.indexOf('INT') > -1) {
            tempArray.push({
              id: data.boards[i].id,
              name: data.boards[i].name
            })
          }
        }

        let compare = (a, b) => {
          // Use toUpperCase() to ignore character casing
          const nameA = a.name.toUpperCase();
          const nameB = b.name.toUpperCase();

          let comparison = 0;
          if (nameA > nameB) {
            comparison = 1;
          } else if (nameA < nameB) {
            comparison = -1;
          }
          return comparison;
        }

        setBoards(tempArray.sort(compare));
      })
  }

    <TextField
      required
      error={state.typeErrorBoard}
      select
      label="Select board"
      className={props.classes.textField}
      variant="filled"
      value={state.BoardName}
      onClick={getBoards}
      onChange={e => handleBoardChange(e)}
      margin="dense"
    >
      {boards.map((board, index) =>
        <MenuItem
          key={index}
          value={board.name}
        >
          {board.name}
        </MenuItem>
      )}
    </TextField>
粤港澳大湾区

当您为Textfield提供select 道具时,您基本上是在渲染一个select而不是 Textfield。

查看源代码

...
   {select ? (
        <Select
          aria-describedby={helperTextId}
          id={id}
          labelId={inputLabelId}
          value={value}
          input={InputElement}
          {...SelectProps}
        >
          {children}
        </Select>
      ) : (
        InputElement
      )}
...
  • 有了上面的内容,Textfield 的 onClick (getBoards) 绑定到选择的根 div(而不是 Textfield)。当您关注 Textfield 时,将呈现选择的根 div。检查元素并查看。
  • 因此,当您第一次单击 Textfield 时,select它只会呈现(占据整个屏幕),因此getBoards不会被执行。
  • 但是当您第二次单击输入(或屏幕上的任何位置)时,getBoards将调用函数,因为 select 现在位于 dom 中,onClick 处理程序 (getBoards) 也是如此。
  • 您可以通过函数中打印e.target(最初附加事件的位置)和e.currentTarget(从触发事件的位置)来检查getBoards

要使其通过单击工作,您可以执行以下任一操作:

  • 使用 useEffect 并调用 getBoards
  • 使用 onFocus 而不是 onClick

看演示

代码片段

export default function MultilineTextFields(props) {
  const classes = useStyles();
  const [boards, setBoards] = React.useState([]);

  let getBoards = e => {
    console.log("e", e.target);
    console.log("e cur", e.currentTarget);
    e.stopPropagation();
    fetch("https://jsonplaceholder.typicode.com/users")
      .then(res => res.json())
      .then(res => {
        console.log("boards", res);
        setBoards(res);
      });
  };

  // useEffect(() => getBoards(), []);  //<----another solution

  return (
    // <div onClick={getBoards}> //<----another solution (don't click on text-input , click on the padding)
    <div>
      <TextField
        required
        // error={state.typeErrorBoard}
        select
        label="Select board"
        className={classes.root}
        variant="filled"
        value={""}
        onClick={getBoards}
        // onFocus={getBoards}  //<----another solution
        // onChange={e => handleBoardChange(e)}
        margin="dense"
      >
        {boards &&
          boards.map((board, index) => (
            <MenuItem key={index} value={board.username}>
              {board.username}
            </MenuItem>
          ))}
      </TextField>
    </div>
  );
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Rails-jQuery为什么我必须单击两次才能显示jQuery效果?

为什么我必须单击两次才能运行我的功能?

按钮出现故障,我必须单击两次才能显示信息,而且照片未正确对齐,这是为什么?

为什么我必须单击两次才能打开和关闭菜单

为什么我必须单击两次“ Tab”按钮才能响应?

在这种情况下,为什么必须单击两次才能加载我的图像?

为什么我必须单击两次按钮才能打开URL?

为什么我必须两次调用“sum”才能对“Maybe Integer”列表求和?

为什么我必须单击两次才能获得搜索结果菜单中的链接以加载页面?

我必须单击两次按钮才能工作

为什么我必须输入两次我的回复才能注册?

为什么我需要单击两次才能退出我的 python 程序?

为什么我必须在所选选项上单击两次?

HTML CANVAS-预加载问题或OnLoad问题-为什么我必须单击两次?

为什么我必须在事件触发之前单击按钮两次?

JavaScript:为什么我必须在表中单击两次以执行colorActiveLine函数?

为什么我必须按两次Enter键才能执行Foreach-Object Cmdlet?

为什么我必须在后端登录两次才能登录?

为什么我必须点击两次才能触发事件?

为什么我必须输入两次哨兵值才能退出循环?

为什么我必须写两次才能在 Arraylist 中添加输入?

我有一个表单验证器,我必须单击两次发送按钮才能将数据发送到ajax-为什么?

为什么我必须打开我的csv两次?

在 Android Studio 中,为什么我必须在模拟器中单击“运行应用程序”两次才能启动应用程序?

为什么我必须将TextField声明为public,而不是Label

为什么我必须在 GTmetrix 上测试我的网站两次才能看到 cloudflare 的速度优势?

我需要单击两次,该按钮才能显示该组件

我必须运行两次cmake才能编译项目

为什么必须单击两次才能使此JavaScript函数起作用?