加载页面时如何始终调用 onClick?错误:超过最大更新深度 [重复]

Posted

技术标签:

【中文标题】加载页面时如何始终调用 onClick?错误:超过最大更新深度 [重复]【英文标题】:How onClick is called always when the page is loaded? Error: Maximum update depth exceeded [duplicate] 【发布时间】:2021-11-06 22:50:05 【问题描述】:

我有这段代码来获取用户输入并将其发送回调度

import React,  useState  from 'react';

export default function Form(props) 
  const [book, setBook] = useState(
    title: '',
    author: '',
  );

  const onChange = (e) => 
    if (book[e.target.name] !== e.target.value) 
      setBook(
        ...book,
        [e.target.name]: e.target.value,
      );
    
  ;
  const  add  = props;
  return (
    <form>
      <input onChange=onChange type="text" name="title" placeholder="Title" />
      <input onChange=onChange type="text" name="author" placeholder="Author" />
      <button type="button" onClick=add(book.title, book.author)>Add Book</button>
    </form>
  );

添加函数是这样的:

  const submitBookToStore = (title, author) => 
    const newBook = 
      id: uuidv4(),
      title,
      author,
    ;
    dispatch(addBook(newBook));
  ;

然后我看到这个错误:

Error: Maximum update depth exceeded. This can happen when a component repeatedly calls setState inside componentWillUpdate or componentDidUpdate. React limits the number of nested updates to prevent infinite loops. 

奇怪的行为是当我没有点击页面加载时它调用onClick!!

【问题讨论】:

当您需要将函数的引用传递给onClick时,您正在立即调用该函数。 onClick=() =&gt; add(book.title, book.author). 【参考方案1】:

如果你这样称呼它:

onClick=add(book.title, book.author)

它将在渲染时运行。 试试这个:

onClick=() => add(book.title, book.author)

那是因为 add() 表示一个函数调用,就像在你的 onChange 中一样,你只是给了一个要调用的函数onChange=onChange,区别在于括号()

【讨论】:

【参考方案2】:

尝试以下方法:

import React,  useState  from 'react';

export default function Form(props) 
  const  add  = props;
  const [book, setBook] = useState(
    title: '',
    author: '',
  );

  const onChange = (e) => 
    if (book[e.target.name] !== e.target.value) 
      setBook(
        ...book,
        [e.target.name]: e.target.value,
      );
    
  ;
  const handleAdd = () =>  add(book.title, book.author) 
  return (
    <form>
      <input onChange=onChange type="text" name="title" placeholder="Title" />
      <input onChange=onChange type="text" name="author" placeholder="Author" />
      <button type="button" onClick=handleAdd>Add Book</button>
    </form>
  );

希望对你有帮助

【讨论】:

以上是关于加载页面时如何始终调用 onClick?错误:超过最大更新深度 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

onclick 功能自动运行

使用 onclick AJAX 调用加载 Select2 语句数据

如何在页面重新加载超过 10 像素时激活颜色更改导航

如何调用onclick以获得更多href,而不仅仅是触发最后一个-嵌入式javascript模板

超过页面加载时间阈值时的 SvelteKit 加载指示器

在页面加载而不是 OnClick 时执行代码