react hooks useEffect副作用钩子使用

    react框架开发作为入门,我们首先学到的是自定义组件,然后编写相关处理逻辑,绑定事件等等。一般自定义组件,我们是通过编写一个class继承React.Component,然后编写最主要的render等方法,另外,我们还可能需要考虑到组件的生命周期componentDidMount,componentDidUpdate这些方法,当我们的组件很简单的时候,这么做就显得有些笨重,不利于维护,比如:

class Hello extends React.Component{
	render(){
		return <div>hello,world</div>
	}
}
export default Hello

    这是一个最简单的react组件,但是代码为了实现组件的功能,继承React.Component,然后在render()方法中返回元素。其实这个组件不涉及到状态state的改变,因此可以通过function函数的形式来实现,会更加的简单。

export const Hello = () => <div>hello,world</div>

    这是精简过后的代码,看着很舒服,没有什么累赘。这样的组件也叫无状态组件(stateless component)。现在react已经推荐使用无状态组件来实现react的组件了,那么问题也来了,既然通过函数function取代class来定义组件,那么状态怎么维护呢?生命周期怎么维护?

    这就是react hooks解决的问题:通过定义useState,useReducer,useEffect等钩子来解决组件状态,组件生命周期问题。useEffect默认可以当做class中的componentDidMount生命周期:只在组件挂载的时候运行一次。useEffect的语法如下:

    useEffect(()=>{
        //todo
    },[])

     默认useEffect可以不用带第二个参数也就是[],可以简写成如下:

    useEffect(()=>{
        //todo
    })

     我们来看看如下示例,可以看到,useEffect方法调用会执行一次。

import React,{useState,useEffect} from 'react'

const App = ()=>{

	const [allTypes,setAllTypes] = useState([])

	useEffect(()=>{
		//setAllTypes([{id:1,name:'aaa'},{id:2,name:'bbb'}])
		console.log("componentDidMount...")
	})

	return (
			<div>
				<h2>hello,react.</h2>
				<ul>
					{allTypes.map(t=><li key={t.id}>{t.name}</li>)}
				</ul>
			</div>
		)
	
}

export default App

     

    这个示例中,通过useEffect实现了类似componentDidMount的功能,但是会有一个很大的风险,当我们打开注释:setAllTypes([{id:1,name:'aaa'},{id:2,name:'bbb'}]),页面会出现无限循环的执行useEffect中的函数。

    

    其实默认,如果去掉useEffect的默认参数[],会导致在页面发生改变的时候也会执行,好比class方式中的componentDidUpdate生命周期函数,解决这个问题的办法就是给useEffect添加这个默认参数[]。

     

    页面也不会报错,正常运行。

     

    其实useEffect这第二个参数[],是监听的对象数组,当监听的对象数组中没有任何值也就是不监听依赖对象,这时候,无论页面如何update,都不会再发生无线循环渲染的问题。 所以只会在类似componentDidMount生命周期下运行一次,之后componentDidUpdate的时候,因为监听对象为空,所以认为没有update发生,所以不会执行。

 

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

luffy5459

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值