这里记录的主要针对用法 咱也不是什么大佬看看源码文档随便就能用了 先学习怎么用 才好帮助理解实现原理 若是你对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
的数据并使用
最近常常打不开掘金 同步至简书