当前位置: 首页 > 知识库问答 >
问题:

react.js - react hooks的useEffect怎么监听对象属性的改变?

凌通
2023-11-16
  const [info, setInfo] = useState({    name:'李光洙',    age:'40'  });  useEffect(() => {    console.log('监听成功')  }, [info.name]);

求教useEffect这样监听对象的属性为什么不行呢?该怎么监听对象的属性呢?

共有3个答案

祁宝
2023-11-16
const [info, setInfo] = useState({  name: '李光洙',  age: '40'});const [name, setName] = useState(info.name);useEffect(() => {  setName(info.name);}, [info.name]);useEffect(() => {  console.log('监听成功');}, [name]);
后易安
2023-11-16

每次render时,简单理解为一个普通函数在执行,info.name 一直是没变话的。比如 setInfo({ name: '1', age: 18, })后,[info.name] 中 info.name 的值一直是 '1',所以不会监听成功。

不鼓励把 useEffect 当作一个监听器,而是优先考虑在 setInfo 的地方写相关逻辑

谷博艺
2023-11-16

这个问题涉及到React Hooks的工作方式,特别是useEffect。在React中,useEffect是用于执行副作用的函数,它接受一个函数和一个依赖数组作为参数。当依赖数组中的任何值更改时,都会执行该函数。

在你的代码中,你试图通过将info.name添加到依赖数组来监听info对象的name属性的更改。然而,这不会按预期工作,因为info.name是一个字符串,而不是一个引用。在useEffect的依赖数组中,你需要传递对象的引用,而不是它的某个属性。

为了解决这个问题,你可以将整个info对象添加到依赖数组中,如下所示:

const [info, setInfo] = useState({ name:'李光洙', age:'40'});useEffect(() => { console.log('监听成功');}, [info]);

这样,每当info对象更改时(包括其属性的更改),都会执行useEffect内的函数。

 类似资料:
  • 本文向大家介绍js如何监听对象属性的改变?相关面试题,主要包含被问及js如何监听对象属性的改变?时的应答技巧和注意事项,需要的朋友参考一下 参考回答: 我们假设这里有一个user对象, (1)在ES5中可以通过Object.defineProperty来实现已有属性的监听 缺点:如果id不在user对象中,则不能监听id的变化 (2)在ES6中可以通过Proxy来实现 这样即使有属性在user中不

  • 在JavaScript中是否可以监听属性值的更改?例如: 我想响应属性中的任何更改。 我已经阅读了对象,以及该对象的替代对象(包括使用动画事件的对象)。据我所知,它们是关于实际DOM的更改。我更感兴趣的是对一个特定DOM元素的属性更改,所以我不认为仅此而已。当然,在我的实验中,这似乎不起作用。 我希望在没有jQuery的情况下这样做。 谢谢

  • 本文向大家介绍watch怎么深度监听对象变化相关面试题,主要包含被问及watch怎么深度监听对象变化时的应答技巧和注意事项,需要的朋友参考一下 deep设置为true 就可以监听到对象的变化

  • 主要内容:实例,实例本章节,我们将为大家介绍 Vue.js 监听属性 watch,我们可以通过 watch 来响应数据的变化。 以下实例通过使用 watch 实现计数器: 实例 <div id = "app"> <p style = "font-size:25px;">计数器: {{ counter }}</p> <button @click = "counter++" style = "font-size:25px

  • 主要内容:实例,实例,实例本章节,我们将为大家介绍 Vue3 监听属性 watch,我们可以通过 watch 来响应数据的变化。 以下实例通过使用 watch 实现计数器: 实例 <div id = "app" >     <p style = "font-size:25px;" >计数器 : { { counter } } </p >     <button @click = "counter++" style = "f

  • 在使用一个库的时候碰到了一个很奇怪的问题,有个class实例化生成的对象,假设为A 对A的属性进行修改 打印A发现,其中的a属性并没有变,但是直接打印A.a是改变了的,请问这种情况大概会是什么原因呢,是有什么知识盲区吗,目前知道a属性是不可删除的属性,但是一般对象设置configurable=false也不会出现这种情况,如果不允许修改的话应该也会报错。。 (PS:A只是为了表述简化的例子,并不是