Hooks是react16.8一個新增項,它能夠在你不編寫class的狀況下使用state以及其餘的React特性react
Hooks的特色:
使你在無需修改組件結構的狀況下複用狀態邏輯
可將組件中相互關聯的部分拆分紅更小的函數,複雜組件將變得更容易理解
更簡潔,更易理解的代碼數組
狀態鉤子 State Hookide
/* * @Author: yang * @Date: 2020-09-03 18:04:27 * @LastEditors: yang * @LastEditTime: 2020-09-06 13:01:06 * @FilePath: \reacty\src\ContextText.js */ import React, { Component,useState } from 'react' function FruitList({fruits,setFruit}){ return ( fruits.map( f => <li key={f} onClick={()=> setFruit(f)}>{f}</li>)) } function FriutAdd(props){ const [pname,setPname] = useState("") const onAddFruit = (e)=> { if (e.key === "Enter") { props.onAddFruit(pname) setPname("") } } return ( <input type="text" value={pname} onChange={e=>setPname(e.target.value)} onKeyDown={onAddFruit} /> ) } export default function HookText(){ // useState參數是狀態初始值 // 返回一個數組,第一個元素是狀態變量,第二個元素是狀態變動函數 const [fruit,setFruit] = useState('草莓') const [fruits,setFruits] = useState(['草莓','蘋果']) return( <div> <p>{fruit===''?'請選擇喜好的水果':`你選擇的水果是${fruit}`}</p> <FriutAdd onAddFruit={pname => setFruits([...fruits,pname])}/> <FruitList fruits={fruits} setFruit={setFruit}/> </div> ) }
useEffect給函數組件增長了執行反作用操做的能力
數據獲取,設置訂閱以及手動更改React組件中的DOM都屬於
反作用函數
/* * @Author: yang * @Date: 2020-09-03 18:04:27 * @LastEditors: yang * @LastEditTime: 2020-09-06 13:32:26 * @FilePath: \reacty\src\ContextText.js */ import React, { Component,useState,useEffect, } from 'react' function FruitList({fruits,setFruit}){ return ( fruits.map( f => <li key={f} onClick={()=> setFruit(f)}>{f}</li>)) } function FriutAdd(props){ const [pname,setPname] = useState("") const onAddFruit = (e)=> { if (e.key === "Enter") { props.onAddFruit(pname) setPname("") } } return ( <input type="text" value={pname} onChange={e=>setPname(e.target.value)} onKeyDown={onAddFruit} /> ) } export default function HookText(){ // useState參數是狀態初始值 // 返回一個數組,第一個元素是狀態變量,第二個元素是狀態變動函數 const [fruit,setFruit] = useState('草莓') const [fruits,setFruits] = useState(['']) // 使用useEffect操做反作用 //請務必設置依賴選項,若是沒有則設置空數組 表示僅執行一次 useEffect(()=>{ console.log('get Fruit') setTimeout(()=>{ setFruits(['草莓','蘋果']) },1000) },[]) useEffect(()=>{ document.title = fruit },[fruit]) useEffect(()=>{ const timer = setInterval(() => { console.log('應用啓動了') }, 1000); // 返回清除函數 return function(){ clearInterval(timer) } },[]) return( <div> <p>{fruit===''?'請選擇喜好的水果':`你選擇的水果是${fruit}`}</p> <FriutAdd onAddFruit={pname => setFruits([...fruits,pname])}/> <FruitList fruits={fruits} setFruit={setFruit}/> </div> ) }
useReducer是useState的可選項,經常使用於組件的複雜狀態邏輯。相似於reducx中的reducer概念
`
~~~~
/*ui
*/
import React, { Component,useState,useEffect,useReducer } from 'react'
function FruitList({fruits,setFruit}){spa
return ( fruits.map( f => <li key={f} onClick={()=> setFruit(f)}>{f}</li>))
}
// 將狀態移至全局
function fruitReducer(state,action){code
switch(action.type){ case "init": return action.payload; case "add": return [...state,action.payload]; default: return state; }
}
function FriutAdd(props){get
const [pname,setPname] = useState("") const onAddFruit = (e)=> { if (e.key === "Enter") { props.onAddFruit(pname) setPname("") } } return ( <input type="text" value={pname} onChange={e=>setPname(e.target.value)} onKeyDown={onAddFruit} /> )
}
export default function HookText(){input
// useState參數是狀態初始值 // 返回一個數組,第一個元素是狀態變量,第二個元素是狀態變動函數 const [fruit,setFruit] = useState('草莓') // const [fruits,setFruits] = useState(['']) // 參數一是相關的Reducer 參數二是初始值 const [fruits,dispatch] = useReducer(fruitReducer,[]) // 使用useEffect操做反作用 //請務必設置依賴選項,若是沒有則設置空數組 表示僅執行一次 useEffect(()=>{ console.log('get Fruit') setTimeout(()=>{ // setFruits(['草莓','蘋果']) dispatch({type:"init",payload:['草莓','蘋果']}) },1000) },[]) useEffect(()=>{ document.title = fruit },[fruit]) useEffect(()=>{ const timer = setInterval(() => { console.log('應用啓動了') }, 1000); // 返回清除函數 return function(){ clearInterval(timer) } },[]) return( <div> <p>{fruit===''?'請選擇喜好的水果':`你選擇的水果是${fruit}`}</p> {/* <FriutAdd onAddFruit={pname => setFruits([...fruits,pname])}/> */} <FriutAdd onAddFruit={pname => dispatch({type:"add",payload:pname})}/> <FruitList fruits={fruits} setFruit={setFruit}/> </div> )
}it
### useContext useContext用於快速在函數組件中導入上下文
import React, { Component,useState,useEffect,useReducer,useContext } from 'react'
const Context = React.createContext()
function FruitList({fruits,setFruit}){
return ( fruits.map( f => <li key={f} onClick={()=> setFruit(f)}>{f}</li>))
}
// 將狀態移至全局
function fruitReducer(state,action){
switch(action.type){ case "init": return action.payload; case "add": return [...state,action.payload]; default: return state; }
}
function FriutAdd(props){
const [pname,setPname] = useState(""); const {dispatch} = useContext(Context);//拿到傳入的value const onAddFruit = (e)=> { if (e.key === "Enter") { dispatch({type:"add",payload:pname}) // props.onAddFruit(pname) setPname("") } } return ( <input type="text" value={pname} onChange={e=>setPname(e.target.value)} onKeyDown={onAddFruit} /> )
}
export default function HookText(){
// useState參數是狀態初始值 // 返回一個數組,第一個元素是狀態變量,第二個元素是狀態變動函數 const [fruit,setFruit] = useState('草莓') // const [fruits,setFruits] = useState(['']) // 參數一是相關的Reducer 參數二是初始值 const [fruits,dispatch] = useReducer(fruitReducer,[]) // 使用useEffect操做反作用 //請務必設置依賴選項,若是沒有則設置空數組 表示僅執行一次 useEffect(()=>{ console.log('get Fruit') setTimeout(()=>{ // setFruits(['草莓','蘋果']) dispatch({type:"init",payload:['草莓','蘋果']}) },1000) },[]) useEffect(()=>{ document.title = fruit },[fruit]) useEffect(()=>{ const timer = setInterval(() => { console.log('應用啓動了') }, 1000); // 返回清除函數 return function(){ clearInterval(timer) } },[]) return( <Context.Provider value={{fruits,dispatch}}> <div> <p>{fruit===''?'請選擇喜好的水果':`你選擇的水果是${fruit}`}</p> {/* <FriutAdd onAddFruit={pname => setFruits([...fruits,pname])}/> */} <FriutAdd /> <FruitList fruits={fruits} setFruit={setFruit}/> </div>~~~~ </Context.Provider> )
}