React Hooks

React Hooks

  • 什么是Hooks :
    个人理解:有自己的state的函数式组件。无状态函数式组件,在加上state后,就成现在的Hooks
  • 什么是函数式组件:
    即HOC高阶组件,可向其中传递组件,经过函数的再次封装得到一个新的组件
  • 要求:
    React要求要将hooks写在函数最外层,不能写在if-else等语句中,确保hooks的执行顺序

hooks 中的数据是只读的,一定要通过钩子函数去修改他

四个钩子函数

useState

状态钩子

import React,{useState} from 'react'
function App(){
	//创造一个状态,并赋初始值为0
	//数组第一个值count接受初始值0,相当于this.state
	//数组第二个值setCount是个函数,可以改变状态的值,相当于this.setState
	const [count ,setCount ] = useState(0)
	const addCount = ()=>{
		setCount(count+10)
	}
	return (
		<div className = 'App'>
			<div>{count}</div>
			<button onClick = {addCount}>点击加10</button>
		</div>
	)
}

export default App;

useContext

共享状态钩子

import React,{useContext} from 'react'
function App(){
	const AppContext = React.createContext()
	const Achild = ()=>{
		const { name } = useContext(AppContext)
		return (
			<div>这是组件A,name为:{name} </div>
		)	
	}
	return (
		<AppContext.Provide value = {{name:'proger'}}>
			<Achild></Achild>
		</AppContext.Provide>
	)
}

export default App;

共享AppContext.Provide 中的数据

useReducer

action钩子

import React,{useReducer} from 'react'
function App(){
	const reducer = (state , action)=>{
		const actionFn = {
			add:function(){
				return {
					...state,
					count:state.count + 1
				}	
			}
		}
		return actionFn[action.type]()
	}
	//初始化state,并声明reducer
	const [state,dispatch] = useReducer(reducer,{count:0})
	const addCount = ()=>{
		dispatch({type:'add'})
	}
	return (
		<div>
			<div>{state.count}</div>
			<button onClick = {addCount}>点击+1</button>
		</div>
	)
}

export default App;

useEffect

副作用钩子

useEffect 中函数是异步执行的,不影响浏览器视图更新
而原来的componentDidMount 、componentDidUpdate 是同步执行的

import React,{useEffect,setLoading,useState} from 'react'
function App(){
	const [loading,setLoading] = useState(true)
	//相当于componentDidMount ,每次render和初次加载时都会调用
	//传入一个回调函数,第二个参数是个数组,可不加
	//有数组时,那么回调函数会一句数组数据的发生变化而调用
	useEffect(()=>{
		setTimeout(()=>{
			setLoading(false)
		},3000)
	})
	return (
		loading?<div>Loading</div>:<div>Loading Finished</div>
	)
}

export default App;

自定义钩子函数

	//封装自定义钩子 usePerson
	//根据业务需求,将自己组装的钩子函数封装成一个函数,返回对应需要的状态和修改状态的方法即可
	function usePerson(name){
		const [loading,setLoading] = useState(true);
		const [person,setPerson] = useState({})
		useEffect(()=>{
			setLoading(true);
			setTimeout(()=>{
				setLoading(false)
				setPerson({name})
			},3000);	

		//effect 的返回函数 ,可作为卸载的生命周期
		return ()=>{
			console.log('组件被卸载了')
		}
		}[name])
		return [loading,person]
	}
function AsyncPage({name}){
	const [loading,person] = usePerson(name)
	return (
		loading?<div>loading </div>:<div>{person.name}</div>
	)
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值