- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这是现场演示:https://codesandbox.io/s/strange-bash-qj7ld?file=/src/App.js
所以我有这样一个组件
const fn = () => {
console.log("useState");
return ["string"];
};
export default function App() {
const [counter, setCounter] = useState(0);
const [nonprimitive, setNonprimitive] = useState(fn());
useEffect(() => {
console.log("useEffect");
}, [nonprimitive]);
return (
<>
<button onClick={() => setCounter(counter + 1)}>Counter {counter}</button>
<div>{nonprimitive[0]}</div>
</>
);
}
每次我点击按钮,计数器都会增加并且组件会重新渲染。然后再次调用fn()
,返回一个数组。 useEffect
在 nonprimitive
发生变化时被触发。我有两个问题:
useEffect
只触发一次,而不是每次后续调用都触发? nonprimitive
是一个数组,它是一个非原始类型,因此即使其中的字符串项保持不变,每次也应该不同。看起来 React 正在做一些深入的比较。useState
都会打印两次?即 console.log("useState");
当我按下按钮时 fn
被调用两次。最佳答案
why is that
useEffect
gets triggered only once, not for every subsequent calls?nonprimitive
is an array, which is a non primitive type, so it should be different every time even when the string item inside of it stays the same. It seems like React is doing some deep comparison under the hood.
整点useState
是在组件的渲染中持久化值。您的组件第一次呈现时,useState(fn())
被称为 nonprimitive
获取值 ["string"]
.在后续渲染中,useState(fn())
再次被调用(因为毕竟它仍然是一个标准的函数调用,所以记录再次发生),但是 React 知道这不是你的第一次渲染,所以它丢弃了参数(fn
的返回值)而是返回先前存储的值,该值在引用上是相同的。
如果您不希望 React 在每次渲染时调用您的初始状态创建(例如,如果您的初始状态非常复杂或计算起来非常耗时),您可以向它传递一个它只会调用的函数初始渲染。
const [nonprimitive, setNonprimitive] = useState(() => fn());
在您的情况下,由于初始状态已经包装在一个函数中,您可以等效地编写
const [nonprimitive, setNonprimitive] = useState(fn);
Why is the
useState
gets printed out twice whenever the component re-renders? i.e.console.log("useState");
insidefn
gets called twice when I hit the button.
如果您查看 index.js,您会注意到您的 App
组件包裹在 <React.StrictMode>
中. React strict mode将有意多次运行某些渲染,以帮助您捕获代码中的副作用和钩子(Hook)违规。
关于javascript - react : why is the state returned from useState stays the same when the initializer function gets called on every re-render?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63768296/
我的新 Nexus One 预装了 CyanogenMod。到目前为止它很棒,但由于我出于软件开发目的购买它(最初只是学习如何为 Android 编程),我应该继续使用它,还是安装官方 Android
在附带的笔中,我想编写我的代码,以便一旦用户将“选择设计”悬停在上方,选项就会保留,不会在用户将鼠标移开后立即消失。 https://codepen.io/anon/pen/EGNGdR 这是我尝试过
我有 CSS 问题。 这是 JsFiddle:http://jsfiddle.net/63NHM/1/ 问题是标题下的正文不会自动换行,他“停留”在一行中,这不好。 这是本节的CSS #trackde
我正在尝试制作自定义控件库。起初我以为我已经完成了表格并且完全可以工作,但我没有。我不会询问如何解决我的表单问题,而是使用我的按钮询问。 我正在制作一个自定义按钮,它可以根据每个状态进行广泛自定义,它
我有 Mysql 5.5我创建了一个存储过程 CREATE DEFINER=`root`@`%` PROCEDURE `refresh_mobileTemp`() BEGIN DROP TABLE I
有没有办法让 Java 应用程序的框架停留在我用 .setLocation 让它出现的位置?我想禁用它被用户在屏幕上移动的能力。 最佳答案 以下是防止移动 JFrame 的方法。在生产应用程序中使用它
我已经尝试了很多次迭代,但它似乎不想只停留在最后一个关键帧上。 我不确定我在这里做错了什么。 #container{ position: relative; width: 100%;
我正在尝试生成一个 svg 矩形和一个 span,以便 span 元素中的文本与 svg 元素垂直对齐。在声明式 HTML+CSS 中,我设法做到了。但我无法通过 javascript 做到这一点。
我目前正在努力使我的伪元素 :before 在单击时保持事件状态。 我在这里做了一个小演示: https://jsfiddle.net/ud8p2nak/1/ 我希望它在当前页面上保持事件状态,所以如
当我指向主菜单时,我得到了我的颜色: 但是当我指向子菜单项时,菜单更改为默认颜色而不是我的颜色。 我的 CSS: .menu:hover { -fx-background-color: #D5
我想在我的 jsp 登录页面中实现保持登录状态或记住我。我正在使用基于容器的表单例份验证。我想我需要将用户的数据(例如 userid 和 token)存储到 cookie 中,这是一种状态信息,用于确
我有一个程序,其中我全局定义的静态变量一旦离开我的“初始化函数”(不是构造函数)就不会保持初始化状态。这是该程序: type.h namespace type { static int * s
在 Delphi XE Update 1 中,如果父(主)表单的 FormStyle 设置为 fsStayOnTop,我会得到模态表单看似随机的行为。 1) 使用 MainFormOnTaskbar
在大多数网站上,当用户要提供用户名和密码登录系统时,都会有一个复选框,例如“保持登录状态”。如果您选中该框,您将在同一 Web 浏览器的所有 session 中保持登录状态。如何在 Java EE 中
我查找了一些有关此警告的答案,但它们既没有帮助我,也没有真正理解 Perl 在这里所做的事情。这就是我想要它做的事情: sub outerSub { my $dom = someBigDOM;
如何在页面加载时显示 qTip 标注,并且即使我将鼠标悬停在该字段上也保留在那里。本质上,我只想要一个固定的标注,并且使用 qTip 来简化定位和样式设置。 注意:我尝试了“show: {ready:
我有一个使用 WorkflowApplication 在 IIS 中托管 WF4 工作流的应用程序 工作流由用户定义(使用重新托管的工作流设计器)并且 xml 存储在数据库中。然后,根据使用该应用程序
所以这真的让我很烦,我不知道这是浏览器相关的故障还是 javascript 就是这样工作的(我希望是这样)。我创建了一个 fiddle 。 https://jsbin.com/laluziqede/1
我已经用 CSS3/javascript 做了一个幻灯片演示,但这不能正常工作.. 当您单击箭头时,“diapos”div 会朝一个方向移动,但在我的例子中,框内的文本并没有完全移动,一小部分文本留在
我希望所有非 EN 的访问者都能被重定向,但来自 EN 的访问者应该留在网站上。有命令吗? var country= geoip_country_code(); if(country =
我是一名优秀的程序员,十分优秀!