hook函数
useState函数
- hook特性是react16.8版本之后才有的新特性
- useState 就是一个hook函数 这个函数可以让函数组件拥有state(状态)
- useState(初始值) 返回的是长度为2的数组
- 第一项的初始值
- 第二项是修改该变量的函数
- 注:初始值只有在第一次执行函数是才有效  之后的每次执行都无效1 
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28const {useState} = React
 function Heaven() {
 const [count,setCount] = useState(2)
 console.log('执行',count)
 return (
 <div>
 <p>你已经点击了{count}次</p>
 <button onClick={()=>setCount(count+1)}>点击增加</button>
 </div>
 )
 }
 let showFruit = true;
 function Heaven1() {
 const [count,setCount] = useState(2)
 var [fruit,setFruit] = useState('banana')
 showFruit = false
 const [name,setName] = useState('heaven')
 return (
 <div>
 <p>{count}--{fruit}--{name}</p>
 <button onClick={()=>setCount(count+1)}>点击增加</button>
 </div>
 )
 }
 ReactDOM.render(<Heaven1/>,document.getElementById('box'))
useRef(参数)
- 生成标记对象 {current:标识}1 
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21const {useRef} = React
 function Heaven(){
 const usernameRef = useRef('username');
 const psdRef = useRef('psd');
 const handleClick = ()=>{
 //得到用户名和密码
 console.log(usernameRef.current.value)
 console.log(psdRef.current.value)
 }
 return (
 <div>
 <h3>非受控表单</h3>
 用户名: <input type="text" ref={usernameRef}/><br/>
 密码:<input type="password" ref={psdRef}/><br/>
 <button onClick={handleClick}>点击发送数据</button>
 </div>
 )
 }
 ReactDOM.render(<Heaven/>,document.getElementById('box'))
useEffect
- useEffect(回调函数)
 用来模拟 es6类组件的生命周期函数模拟了componentDidMount和componentDidUpdate和componentWillUnmount
- 回调函数是当页面渲染render之后 就执行回调函数是当页面渲染render之后 就执行
- 回调函数一般是写副作用代码- 副作用指的是
- 1.请求数据
- 2.修改原生dom1 
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25const {useEffect,useState} = React
 function Heaven(){
 let [count,setCount] = useState(0)
 useEffect(()=>{
 document.title = `你已经点击了${count}次`
 
 return function(){
 //这个函数是第二次才会执行的;第一次熏染不会执行;相当于模拟了componentWillUnmount;
 //执行时间早于useEffect的回调函数的;
 }
 },[])
 //useEffect的第二个参数是相当于vue中的watch,
 //设置某个属性用于观察,一旦属性发生变化,就会触发这个生命周期函数,[]表示怎样多要触发;
 //观察第二次的useEffect是否可以执行;
 return (
 <div>
 <button onClick={()=>setCount(count+1)}>点击</button>
 </div>
 )
 }
 ReactDOM.render(<Heaven/>,document.getElementById('box'))
 
扩展自定义组件
| 1 |  | 
useReducer (仓库)
useReducer和redux有很多相似的地方;
构成仓库的必要条件
- 初始的数据
- reducer1 
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31const {useEffect,useState,useReducer} = React
 const number = 3;//仓库的初始的数据
 const reducer = (state,action)=>{//初始的reducer仓库;
 console.log(state, action)
 switch(action.type){
 case 'add':
 return state+action.data;
 case 'minus':
 return state-action.data;
 }
 }
 function Heaven(){
 //第一个是仓库,第二的是数据,接受的时候第一个是数据,第二个数方法;
 //dispatch只能在当前组件使用;
 const [state,dispatch] = useReducer(reducer, number)
 const handleAdd = ()=>{
 dispatch({type:'add',data:1})
 }
 return (
 <div>
 <p>count:{state}</p>
 <button onClick={handleAdd}>+</button>
 <button onClick={()=>dispatch({type:'minus',data:2})}>-</button>
 </div>
 )
 }
 ReactDOM.render(<Heaven/>,document.getElementById('box'))
createContext (创建上下文)
可以是祖孙组件方便传值;
| 1 |  | 
也可以方便兄弟传值(如下代码)
| 1 |  |