react hook用法看这一篇就够了

1. 前言

1.之前写过一篇粗浅的文章 hook初识 介绍hook
2.今天总结下常用的hook
3.整体分为2部分 一部分是 from react的 hook
4.一部分是react-redux的hook
5.脚手架项目自己新建准备好


2. hook from 'react'

import { useState, useEffect, useReducer } from 'react'

3. useState

顾名思义 主要是用于 state,或者说用于state的封装,拆分模块


3.1 语法

    const [state, setstate] = useState(initialState)

设置初始值
返回 数组 解构出 state和修改函数
state和修改函数名字可以自己改


3.2 使用

  let [num, setNum] = useState(0)

布局
使用修改

<h1>{num} </h1>
<button onClick={() => { setNum(num+ 1) }}>+修改 num</button>
<button onClick={() => { setNum(num- 1) }}>-修改 num</button>

非常简单 的计数器 demo


3.3 使用单独的 state模块

0.单独的state 方便统一管理state
1.state.js 内容

const user = { 
     test:'测试',
     userInfo:{
         name:'yzs',
         job:'web'
     }
}
export default  user


2.使用引入

import myState from './state.js'
  1. 具体的使用

const [state, setState] = useState(myState)
  let { userInfo, test } = state

配合解构赋值 用起来更丝滑


3.4 render

           <h1>  hook练习</h1>
            <h1>{userInfo.job}--{test}</h1>
            <div><button onClick={updateState}>修改 </button></div>
            <hr />

3.5 修改函数的实现

      let updateState = () => {
        setState({
            ...state,
            test: '改了',
            userInfo: {
                ...state.userInfo,
                job: '前端从业者',
                age: 31
            }
        })
    }

1.整体上 hook 一般都不实用this
2.数据来源清晰
3.便于复用
4.注意引用类型的变量的修改方式


4. useEffect

这个我们一般理解成 生命周期的替代方案

// ****************DidMount+DidUpdate
    useEffect(()=>{
        console.log("初始化或者 更新的时候调用")
     })

//****************DidMount
    useEffect(() => {
        console.log(' ----------初始化')
        return () => {
                //*****************WillUnMount
            console.log("cleanup")
        }
    }, [])
//*******************DidUpdate
    useEffect(() => {
        console.log("初始化 或者 监听的对象改变的时候")
    }, [num])

5. useReducer

1.这个并不是react-redux里面的hook
2.其实这个 reducer代表一种思想,修改函数的封装,独立成模块
3.所以并不是说非得是redux里面的reducer,当然reduxreducer也能用


5.1 reducer 准备

1.既然名字叫reducer 先准备个
2.还是简单的计数器为引子,开展
3.这个也可以单独起个模块/文件

let defaultState = {
        count: 66666,
        person: {
            name: 'yzs',
            city: '郑州'
        }
    }
//***********这块 action直接解构 并且赋初值
    const reducer = (state, { type, payload=10 }) => {
        switch (type) {
            case 'increment':
                return {
                    ...state,
                    count: state.count + payload
                }
            case 'decrement':
                return {
                    ...state,
                    count: state.count - payload
                }
            case 'PERSON_UPDATE': {
                console.log('对象修改:', payload)
                return {
                    ...state,
                    person: {
                        ...state.person,
                        ...payload
                    }
                }
            }
            default:
                return state
        }
    }

1.参数state的初始值 也可以单独来个变量,或者再来个初始化模块
2.第二个参数是载荷,我这里直接解构了,赋初值,这个只是为了讲解 基本类型和引用类型的修改方式,所以放一起了,不然初值其实应该单独处理的
3.state的修改方式,不能直接修改


5.2 使用

1.导入 reducer模块
2.插一下useReducer 这个语法

        const [state, dispatch] = useReducer(reducer, initialState, init)

3.参数需要reducer所以我们才在第一步准备 reducer
4.核心代码

   // ******************* useReducer
    const [pageState, dispatch] = useReducer(reducer, defaultState)
    let { count, person } = pageState

1.这里的第二个参数是初始值,可选参数
2.会覆盖掉 reducer 里面的 state参数 初始值
3.我是直接把结果 state 直接给解构出来了


5.3 state和 dispatch的使用

 <hr />
            <h1>useReducer</h1>
            <h1>
                <button onClick={() => {dispatch({type:'increment'}) }}>+修改 </button>
                {count}
                <button onClick={() => { dispatch({type:'decrement',payload:100}) }}>-修改</button>
            </h1>
            <h1>{person.city}
            <button onClick={updateObj }>-修改</button> </h1>

1.这个和 vuex辅助函数 用法类似
2.type值和 reducer保持一致
3.参数key payloadreducer 里面的 参数保持一致


5.4 useReducer 和 redux 的区别

1.useReducer是 useState的代替方案,主要用于 state 复杂变化的场景
2.useReducer 是单个组件状态管理,组件通讯还需要 props
3.redux 是全局状态管理,多组件共享数据


5.5 react的hook总结

1.了解vue3的可以结合vue3的组合式API来理解
2.useState 负责数据相关,来源清晰,方便复用
3.useReducer 数据的逻辑的统一处理


useRef

获取 DOM 的

使用

  let { useState, useRef,useEffect } = React
 const myref1 = useRef("yzs")
 const myref2 = useRef("yzs")

钩子

  let  testR = null            
// ********didMount didUpdate
            useEffect(() => {
                testR.style.color = "red"
                console.log("DOM:", testR.innerHTML);
                myref1.current.style = "color: orange";
                console.log(myref1,myref2);
            })

布局

 <h1 ref={el =>testR=el}>测试</h1>
<p ref={myref1}>演示useRef</p>
 <div ref={myref2}>我是一个div</div>

6. hook from react-redux

6.1 准备工作

1.这个是redux相关的 hook,所以需要准备下 redux的基本配置
2.安装就不说了自己装npm i react-redux -S
3.目录结构 src/store
4.reducer和第五条的 useReduer 讲解中的公用一个就行
5.store/index.js 整合 reducer


6.2 store

唯一的 store

import reducer from '../pages/search/store'
// 不拆分的写法
// 导入
import {createStore,combineReducers} from 'redux'

//  创建 store
const rootReducer = combineReducers({
    hookPageYzs:reducer,
})

let store = createStore(rootReducer)
export default store


1.注意这里的根reducer配置 有个hookPageYzs


7.useSelector

import { useSelector, useDispatch } from 'react-redux'

7.1 useSelector 逻辑

这个hook是用来使用 react-redux中的 state的

const hookpageAge = useSelector((state) => {
        console.log("hook------------------state", state)
        return state.hookPageYzs
    })
    console.log("useSelector----------HookPage", hookpageAge)

1.搞不懂的,打印或者断点看逻辑
2.hookPageYzs是在根store里面配置的


7.2 数据显示

<div> redux-hook----{hookpageAge.count}  </div>
 <h1>{hookpageAge.person.name}</h1>

大概的 reducer 参见上面 5.1 reducer 准备

let defaultState = {
        count: 66666,
        person: {
            name: 'yzs',
            city: '郑州'
        }
    }

8. useDispatch

 //************************  useDispatch
    const dispatch= useDispatch()

1.注意名字不要重复了
2.使用useReducer的时候解构出来的默认也叫叫dispatch
3.我这个不在一个同一界面使用所以不会重复


8.1 基本类型

<hr />
            <h1> react-redux -hook</h1>
          <div> redux-hook----{hookpageAge.count}  </div>
            <h1>
                <button onClick={() => { add(10000) }}> +增加</button>
                <button onClick={() => {
                    dispatch({
                        type: 'decrement'
                    })
                }}>-减少</button> </h1>
            <hr />

8.2 基本类型修改

 let add = (payload) => {
        dispatch({
            type: 'increment',
            payload
        })
    }

1.这个单独声明了箭头函数 ,绑定事件的时候需要使用箭头函数
2.没有绑定直接修改的也需要在 事件的箭头函数里填写,因为需要传参


8.3 引用类型

 <h1>{hookpageAge.person.name}</h1>
            <h1>引用类型修改
                <button onClick={ updateObj}>修改</button>
            </h1>

8.4 修改

 let updateObj =()=>{
        dispatch({
            type:'PERSON_UPDATE',
            payload:{ name: '一蓑烟雨', age: 18 }
        })
    }

9. 持久化

想结合持久化使用,看之前的文章就行redux持久化


参考资料

react-hook
hook初识
redux持久化


初心

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

推荐阅读更多精彩内容