hooks 中的数据是只读的,一定要通过钩子函数去修改他
状态钩子
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;共享状态钩子
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 中的数据
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 中函数是异步执行的,不影响浏览器视图更新 而原来的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;