這裏記錄的主要針對用法 咱也不是什麼大佬看看源碼文檔隨便就能用了 先學習怎麼用 纔好幫助理解實現原理 若是你對hook
尚未一個基本的概念 請先看看官方文檔javascript
useState useRefcss
const App = (props) => {
const [value, setValue] = useState('')
const input = useRef(null)
const inputChange = ({ target: { value } }) => {
setValue(value)
input.current = value
}
const _click = () => {
setTimeout(() => {
console.log(value)
console.log(input.current)
}, 1000)
}
return (
<div> <input value={state.value} onChange={inputChange} type="text"/> <span>{state.show}</span> <Button onClick={_click}>點擊</Button> </div> ) } 複製代碼
useState
顧名思義是用來聲明和設置當前組件內部的state
變量的。value
是當前state
裏的變量名 而setValue
則是修改他的方法html
接收的參數爲初始的默認值 例如能夠是props.value
由父數據流拿到的值java
useRef
原意是用來獲取dom
節點 能夠用input.current
來訪問但咱們也能夠用他來解決一些做用域的問題 上述代碼console
的結果 value
裏是點擊前入框的內容。而input.current
裏是打印時輸入框的內容react
useEffect 反作用redux
useEffect(() => {
const timer = setInterval(() => {}, 1000)
return () => clearInterval(timer)
}, [value])
複製代碼
useEffect
能夠執行一些反作用 替代了componentDidMount
、componentDidUpdate
和componentWillUNmount
數組
咱們就不用再考慮某些變量在componentDidMount
的時候是否能夠拿到。若是能夠就要去執行一次update
也要執行 UnMount
還要再清除這種繁瑣的操做了dom
return
裏執行的是要清除訂閱或是計時器一類的作法相似於componentWillUNmount
ide
第二個參數的數組所接受的變量 則表明會觸發執行反作用的條件 若是發生改變纔會觸發反作用函數
若沒有改變會直接跳過 若是傳遞[]
則只會在掛載和卸載時執行一次
在寫法上useEffect
反作用須要緊跟着上一個useState
而且保證他在最外層 沒有循環沒有判斷 遵循官方的規則才能避免一些沒必要要的問題出現
useContext useReducer
組件之間數據共享 本身構建一個數據流 作一個局部的store
useReducer
state
和action
會用redux
的童鞋應該就知道咋用了state
的默認值對象state
和dispatch
應該更好理解了 暴露出來的store
和用來突變的方法redux
的狀況下 若是你還不會 請先去了解一下redux
父組件
import React, { useReducer, useEffect } from 'react'
import './style.css'
const initialState = {
value: '',
show: '展現'
}
export const CountContext = React.createContext()
const handleStore = (state, action) => {
switch(action.type) {
case 'change':
return { ...state, value: action.value }
case 'set':
return { ...state, show: action.show }
default:
new Error()
}
}
// 父組件
const App = () => {
const [state, dispatch] = useReducer(handleStore, initialState)
const inputChange = ({ target: { value } }) => {
dispatch({ type: 'change', value })
}
return (
<CountContext.Provider value={{ state, dispatch }}>
<div className="content">
<input value={state.value} onChange={inputChange} type="text"/>
<span>{state.show}</span>
<Child/>
</div>
</CountContext.Provider>
)
}
複製代碼
咱們能夠把state
也就是store
經過CountContext.Provider
的value
讓數據流下去 包括dispatch
方法
子組件
在子組件使用須要引入建立context
的組件裏的CountContext
import React, { useContext } from 'react'
import { CountContext } from '@/components/page'
const Child = () => {
const { state, dispatch } = useContext(CountContext)
const handleClick = () => {
let value = +state.value + 1
dispatch({ type: 'change', value })
}
return (
<div> <div className='child' onClick={handleClick}>點擊</div> <div>{state.value}</div> </div>
)
}
複製代碼
這個時候咱們已經能夠成功修改store
的數據並使用
最近常常打不開掘金 同步至簡書