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> )
}