react学习之useState和useEffect

[复制链接]
发表于 2026-1-31 00:55:00 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
 useState

useState 可以使函数组件像类组件一样拥有 state,函数组件通过 useState 可以让组件重新渲染,更新视图。
实际利用

 setstate()中回调函数的返回值将会成为新的state值回调函数实行时,
  React会将最新的state值作为参数转达
  1. const AddLess = ()=>{
  2. const [num,setNum]  = useState(1)
  3. const add = ()=>{
  4.         setNum((pre)=>{
  5.             return pre+1
  6.         } )
  7.         console.log('num',num)
  8.    }
  9. const less =()=>{
  10.         /**
  11.          * 当前例子就是 less方法是 拿到返回的值减一 成为新的数 赋给num
  12.          */
  13.         setNum((pre)=>pre-1)
  14.         console.log('num',num)
  15.    }
  16. return <div className="addLessBox">
  17.         <p className="num">{num}</p>
  18.         <div>
  19.             <button onClick={add}>+</button>
  20.             <button onClick={less}>-</button>
  21.         </div>
  22.         <div>
  23.             {/* 不允许直接渲染 对象 直接写写{userinfo}会报错 */}
  24.             <p ref={refele} className='user'>{userinfo.name} --- {userinfo.age}</p>
  25.             <button onClick={handleInfo}>修改</button>
  26.             <button onClick={handleRef}>ref修改</button>
  27.         </div>
  28.     </div>
  29. }
复制代码
 当state的值是一个对象时,修改时是利用新的对象去更换已有对象
   -setState()会触发组件的重新消染,它是异步的
            以是当调用setstate()须要用旧state的值时,肯定要留意有大概出现盘算错误的环境
            为了克制这种环境,可以通过为setState()转达回调函数的情势来修改
  1. const AddLess = ()=>{
  2. const [userinfo,setuser] = useState({name:'react',age:18})
  3. const handleInfo = ()=>{
  4.         
  5.         setuser({...userinfo,name:'react18'})
  6.     }
  7. return <div className="addLessBox">
  8.         <p className="num">{num}</p>
  9.         <div>
  10.             <button onClick={add}>+</button>
  11.             <button onClick={less}>-</button>
  12.         </div>
  13.         <div>
  14.             {/* 不允许直接渲染 对象 直接写写{userinfo}会报错 */}
  15.             <p ref={refele} className='user'>{userinfo.name} --- {userinfo.age}</p>
  16.             <button onClick={handleInfo}>修改</button>
  17.         </div>
  18.     </div>
  19. }
复制代码
 当state的值是一个数组时,怎样向数组里添加数据
  1. const App = ()=>{
  2. const [data,setData] = useState([
  3.         {
  4.             id:'001',
  5.             date:'七',
  6.             title:'学习',
  7.             content:'react'
  8.         },
  9.         {
  10.             id:'002',
  11.             date:'七',
  12.             title:'学习',
  13.             content:'nuxt'
  14.         },
  15.     ])
  16. //接收子组件传来的值
  17.     const handleData = (sondata)=>{
  18.         console.log("data",sondata)
  19.         sondata.id = Date.now() + ''
  20.         setData([sondata,...data])
  21.     }
  22. return <div>
  23.         <LogForm onhandleData={handleData}/>
  24.     </div>
  25.    
  26.    
  27.    
  28. }
复制代码


上面的例子都是setState的操纵都是放在详细的方法中,没有直接在函数体中调用。那可不可以在函数体里直接调用setState呢?答案是不可以
为什么呢?
当我们直接在函数体中调用setState时,就会触发错误  ---  too many re-renders
 
 
那必须在函数体里直接利用 setState,那就要用到useEffect

useEffect

办理代码中的副作用 比方上面提到的在函数体里直接操纵setState
 语法
  1. useEffect(()=>{
  2.     return destory
  3. },dep)
复制代码
 useEffect()是一个钩子函数,须要一个函数作为第一个参数
        这个作为参数的函数,将会在组件渲染完毕后实行
         默认环境下,useEffect()中的函数,会在组件渲染完成后调用,而且是每次渲染完成后都会调用
 在 useEffect()可以转达第二个参数
        第二个参数是一个数组,在数组中可以指定effect的依靠项
        指定后,只有当依靠发生厘革时,effect才会被触发
        如果依靠项设置一个空数组,则意味Effect只会在组件初始化触发一次,背面都不会触发了;不设置第二个参数,那么每次组件渲染effect也跟着渲染
  1. function App() {
  2.      const [count,setCount] = useState(0)
  3.     const [count2,setCount2] = useState(0)
  4. const changeCount = ()=>{
  5.         setCount(1)
  6.     }
  7.   useEffect(()=>{
  8.         console.log("effect执行")
  9.         setCount2(pre=>++pre)
  10.     },[count])
  11.   return (
  12.         <div>
  13.             <p>count:{count}</p>
  14.             <p>count2:{count2}</p>
  15.             <button onClick={changeCount}>修改count</button>
  16.          </div>
  17.       
  18.       
  19.     );
  20. }
复制代码
 
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表