react hook 学习随记

这里记录的主要针对用法 咱也不是什么大佬看看源码文档随便就能用了 先学习怎么用 才好帮助理解实现原理 如果你对hook还没有一个基本的概念 请先看看官方文档

useState useRef

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则是修改他的方法

接收的参数为初始的默认值 例如可以是props.value由父数据流拿到的值

useRef原意是用来获取dom节点 可以用input.current来访问但我们也可以用他来解决一些作用域的问题
上述代码console的结果 value里是点击前入框的内容。而input.current里是打印时输入框的内容

useEffect 副作用

useEffect(() => {
    const timer = setInterval(() => {}, 1000)
    return () => clearInterval(timer)
}, [value])

useEffect 可以执行一些副作用 替代了componentDidMountcomponentDidUpdatecomponentWillUNmount

我们就不用再考虑某些变量在componentDidMount的时候是否可以拿到。如果可以就要去执行一次update也要执行 UnMount还要再清除这种繁琐的操作了

return里执行的是要清除订阅或是计时器一类的做法类似于componentWillUNmount

第二个参数的数组所接受的变量 则代表会触发执行副作用的条件 如果发生改变才会触发副作用

若没有改变会直接跳过 如果传递[] 则只会在挂载和卸载时执行一次

在写法上useEffect副作用需要紧跟着上一个useState并且保证他在最外层 没有循环没有判断
遵循官方的规则才能避免一些不必要的问题出现

useContext useReducer

组件之间数据共享 自己构建一个数据流 做一个局部的store

useReducer

  • 接收的第一个参数是一个回调函数 接收一个stateaction 会用redux的童鞋应该就知道咋用了
  • 第二个参数是可选参数 为state的默认值对象
  • 而前面的statedispatch 应该更好理解了 暴露出来的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.Providervalue让数据流下去 包括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的数据并使用他

掘金同步

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,607评论 6 507
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,239评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,960评论 0 355
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,750评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,764评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,604评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,347评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,253评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,702评论 1 315
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,893评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,015评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,734评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,352评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,934评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,052评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,216评论 3 371
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,969评论 2 355

推荐阅读更多精彩内容