为什么在第一次渲染时,useEffect 内部的代码会运行两次?
为什么在第一次渲染时,useEffect 内部的代码会运行两次?
控制台.log运行两次。下面说的是严格模式
的原因:
React Hooks: useEffect()即使使用空数组作为参数,也会被调用两次
为了检测代码中的任何问题并警告您(这可能非常有用),StrictMode会两次渲染组件(在开发环境中,而不是在生产环境中)。
但是我不明白为什么!它说:为了检测代码中的任何问题并警告您
。但是问题是什么?警告什么?
是否有办法在不移除应用中的严格模式
的情况下消除这种(两次运行)?
这是我的代码:
import {useEffect, useState} from "react"; import BlogList from "./BlogList"; const Home = () =>{ const [blogs, setBlogs] = useState([ { title: 'My new website', body: 'lorem ipsum...', author: 'mario', id: 1 }, { title: 'Welcome party!', body: 'lorem ipsum...', author: 'yoshi', id: 2 }, { title: 'Web dev top tips', body: 'lorem ipsum...', author: 'mario', id: 3 } ]); const [name, setName] = useState('mario'); const handleDelete = (id) => { const newBlogs = blogs.filter(blog => blog.id !== id); setBlogs(newBlogs); } useEffect(() => { console.log("useEffect被调用"); console.log(name); },[name]); return({name} ); } export default Home;
完整的代码:
问题的原因是React在开发模式下会使用StrictMode来检测代码中的问题,其中之一就是会导致useEffect内的代码运行两次。而在生产模式下,这个问题不会出现。
解决这个问题的方法是移除StrictMode标签,这样就不会再出现双重渲染了。
StrictMode标签无法自动检测副作用,但它可以通过使副作用更加确定性来帮助我们发现它们。但需要注意的是,这个双重渲染只在开发模式下出现,在生产模式下是不会有的。
另外,StrictMode标签的双重渲染是为了进行一些检查,包括识别不安全的生命周期方法、警告关于已弃用的字符串引用API的使用、警告关于已弃用的findDOMNode方法的使用以及检测意外的副作用等等。
如果想要了解更多细节,请查阅React文档中的相关部分。
总结起来,StrictMode的双重渲染是为了在开发模式下检测代码问题,如果不想要双重渲染,可以移除StrictMode标签。