我的编程空间,编程开发者的网络收藏夹
学习永远不晚

React函数组件useContextuseReducer自定义hooks

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

React函数组件useContextuseReducer自定义hooks

一、hooks(useContext)

接收一个 context 对象(React.createContext 的返回值)并返回该 context 的当前值。当前的 context 值由上层组件中距离当前组件最近的 <MyContext.Provider> 的 value prop 决定。

新建useContext.js函数组件,写入如下代码:

import React, {  useEffect, useState, useContext } from 'react'
import axios from 'axios'
import '../css/middlecp.css'
const GlobalContext = React.createContext(); // 创建context对象
export default function UseContext() {
    const [filmList, setFilmList] = useState([])
    const [info, setInfo] = useState('')
    useEffect(() => {
        axios.get('/data.json').then(res => {
            console.log(res.data.data.films)
            setFilmList(res.data.data.films)
        }, err => {
            console.log(err)
        })
    }, [])
    return (
        <GlobalContext.Provider value={{
            info: info,
            changeInfo: (value) => {
                setInfo(value)
            }
        }}>
            <div>
                {
                    filmList.map(item => {
                        return <FilmItem key={item.filmId} {...item}></FilmItem>
                    })
                }
                <FilmDetail></FilmDetail>
            </div>
        </GlobalContext.Provider>
    )
}
function FilmItem(props) {
    let { name, poster, grade, synopsis } = props
    const value = useContext(GlobalContext)
    console.log(value)
    return <div className="filmitem" onClick={() => {
            value.changeInfo(synopsis)
        }}>
            <img class="lazy" data-src={poster} alt={name}></img>
            <h4>{name}</h4>
            <div>观众评分:{grade}</div>
        </div>
}
function FilmDetail() {
    const value = useContext(GlobalContext)
    return (
        <div className="filmdetail">
            {value.info}
        </div>
    )
}

二、hooks(useReducer)

useState 的替代方案。它接收一个形如 (state, action) => newState 的 reducer,并返回当前的 state 以及与其配套的 dispatch 方法。

新建useReducer.js组件,写入代码:

import React, { useReducer } from 'react'
export default function UseReducer() {
  // 处理函数
  const reducer = (prevState, action) => {
    console.log(prevState, action)
    let newState = {...prevState}
    switch(action.type) {
        case 'minus':
            newState.count--
            return newState;
        case 'add':
            newState.count++
            return newState;
        default:
            return newState;
    }
  } 
  // 外部对象
  const intialState = {
    count: 0
  }
  const [state, dispatch] = useReducer(reducer, intialState)  
  return (
    <div>
        <button onClick={() => {
            dispatch({
                type: "minus"
            })
        }}>-</button>
            {state.count}
        <button onClick={() => {
            dispatch({
                type: "add"
            })
        }}>+</button>
    </div>
  )
}

效果:

三、hooks(useContext搭配useReducer使用)

hooks中useContext搭配useReducer使用跨级通信。(hooks中自带的,后面redux不用这么麻烦) 修改useReducer.js组件代码为如下:

import React, { useReducer, useContext } from 'react'
// 处理函数
const reducer = (prevState, action) => {
    console.log(prevState, action)
    let newState = {...prevState}
    switch(action.type) {
        case 'child2':
            newState.a = '改变后的a'
            return newState;
        case 'child3':
            newState.b = '改变后的b'
            return newState;
        default:
            return newState;
    }
  } 
// 外部对象
const intialState = {
    a: 'aaaaa',
    b: 'bbbbb'
}
const GlobalContext = React.createContext()
export default function UseReducer() {
  const [state, dispatch] = useReducer(reducer, intialState)  
  return (
    <GlobalContext.Provider value={
        {
            state,
            dispatch
        }
    }>  
        <div>
            <Child1></Child1>
            <Child2></Child2>
            <Child3></Child3>
        </div>
    </GlobalContext.Provider>
  )
}
function Child1() {
    const {dispatch} = useContext(GlobalContext)
    return (
        <div>
            <button onClick={() => {
                dispatch({
                    type: 'child2'
                })
            }}>改变child2</button>
            <button onClick={() => {
                dispatch({
                    type: 'child3'
                })
            }}>改变child3</button>
        </div>
    )
}
function Child2() {
    const {state} = useContext(GlobalContext)
    return (
        <div>
            {state.a}
        </div>
    )
}
function Child3() {
    const {state} = useContext(GlobalContext)
    return (
        <div>
            {state.b}
        </div>
    )
}

效果:

四、自定义hooks

当我们想在两个函数之间共享逻辑时,我们会把它提取到第三个函数中。 必须使用use开头。(实际上就是将独立的逻辑函数抽离出来封装) 新建useCustom.js,写入代码:

import React, { useEffect, useMemo, useState } from 'react'
import axios from 'axios'
function useCinemaList() {
    const [cinemaList, setCinemaList] = useState([])
    useEffect(() => {
        axios({
            url: 'https://m.maizuo.com/gateway?cityId=110100&ticketFlag=1&k=3085018',
            method: 'get',
            headers: {
                'X-Client-Info':' {"a":"3000","ch":"1002","v":"5.2.0","e":"1646314068530784943341569"}',
                'X-Host': 'mall.film-ticket.cinema.list'
            }
        }).then((res) => {
            console.log(res.data)
            setCinemaList(res.data.data.cinemas)
        }).catch((err) => {
            console.log(err)
        })
      },[])
      return {
        cinemaList
      }
}
function useFliter(cinemaList, text) {
    const getCinemaList = useMemo(() => cinemaList.filter(item => item.name.toUpperCase().includes(text.toUpperCase()) || 
  item.address.toUpperCase().includes(text.toUpperCase())), [cinemaList, text]) // useMemo会执行函数并返回执行后的结果
    return {
        getCinemaList
    }
}
export default function UseCustom() {
  const [text, setText] = useState('')
  const {cinemaList} = useCinemaList()
  const {getCinemaList} = useFliter(cinemaList, text)
  return (
    <div>
        <input value={text} onChange={(event) => {
              setText(event.target.value)
            }}></input>
            {
                getCinemaList.map((item) => 
                <dl key={item.cinemaId}>
                    <dt>{item.name}</dt>
                    <dd>{item.address}</dd>
                </dl>
                )
            }
    </div>
  )
}

效果:

可以看到我们这个影院的筛选功能还是正常,但是看代码的话,逻辑更加的清晰了。

以上就是React函数组件useContext useReducer自定义hooks的详细内容,更多关于React hooks函数组件的资料请关注编程网其它相关文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

React函数组件useContextuseReducer自定义hooks

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

React函数组件useContextuseReducer自定义hooks

这篇文章主要为大家介绍了React函数组件useContextuseReducer自定义hooks示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
2022-11-13

如何使用自定义hooks对React组件进行重构

这篇文章主要介绍了如何使用自定义hooks对React组件进行重构的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇如何使用自定义hooks对React组件进行重构文章都会有所收获,下面我们一起来看看吧。处理复杂性
2023-07-05

Vue怎么自定义hooks函数

本文小编为大家详细介绍“Vue怎么自定义hooks函数”,内容详细,步骤清晰,细节处理妥当,希望这篇“Vue怎么自定义hooks函数”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。在Vue当中,一个非常重要的功能就
2023-07-05

详解Vue如何自定义hooks(组合式)函数

这篇文章主要为大家详细介绍了在Vue中如何实现自定义hooks(组合式)函数,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
2023-03-13

React Native自定义标题栏组件的实现方法

大家好,今天讲一下如何实现自定义标题栏组件,我们都知道RN有一个优点就是可以组件化,在需要使用该组件的地方直接引用并传递一些参数就可以了,这种方式确实提高了开发效率。标题栏是大多数应用界面必不可少的一部分,将标题栏剥离出来做成一个组件很有必
2023-05-31

android自定义控件和自定义回调函数步骤示例

自定义控件的步骤: 1 View的工作原理2 编写View类3 为View类增加属性4 绘制屏幕5 响应用户消息6 自定义回调函数 java代码代码如下:private class MyText extends LinearLayout {
2022-06-06

PHP数组反转:内置函数与自定义算法

php反转数组可通过以下方式:内置函数array_reverse():直接对原数组进行反转。自定义算法:通过遍历数组从尾到头,将元素依次添加到新数组中。实际应用场景包括:实现栈或队列、进行数组比较等。PHP数组反转:内置函数与自定义算法在
PHP数组反转:内置函数与自定义算法
2024-04-28

C++ 函数如何帮助开发者创建自定义 GUI 组件?

c++++ 函数可用于创建自定义 gui 组件。通过定义函数、处理 gui 任务并从主应用程序调用函数,开发人员可以创建自定义组件。优点包括可复用性、代码清晰度和可扩展性。实战案例展示了在 qt 中使用函数创建自定义按钮组件。C++ 函数:
C++ 函数如何帮助开发者创建自定义 GUI 组件?
2024-04-25

如何使用命名空间组织自定义 PHP 函数?

通过命名空间,您可以在 php 中将自定义函数分组到逻辑层级中,避免名称冲突,提高代码的可读性和可维护性。具体步骤包括:使用 namespace 关键字创建命名空间;在命名空间内定义自定义函数;使用 use 关键字使用命名空间中的函数。命名
如何使用命名空间组织自定义 PHP 函数?
2024-04-22

使用 PHP 内置函数和自定义函数去重数组的性能对比

array_unique() 是去重数组性能最好的内置函数。哈希表法自定义函数性能最优,哈希值用作键,值为空。循环法实现简单但效率低,建议使用内置或自定义函数进行去重。array_unique() 耗时 0.02 秒、array_rever
使用 PHP 内置函数和自定义函数去重数组的性能对比
2024-04-26

PHP 数组高级排序:自定义比较器和 匿名函数

在 php 中,按自定义顺序对数组排序有两种方式:自定义比较器:实现 comparable 接口并指定两个对象的比较规则。匿名函数:创建无名函数作为自定义比较器,用于比较两个对象的标准。PHP 数组高级排序:自定义比较器和匿名函数在 PH
PHP 数组高级排序:自定义比较器和 匿名函数
2024-04-27

使用PHP自定义函数扩展数组交集和并集的功能

使用 php 自定义函数可扩展数组交集和并集功能,自定义交集函数允许按键或值查找交集,而自定义并集函数按键或值查找并集。这使您能够基于特定需求灵活操作数组。使用 PHP 自定义函数扩展数组交集和并集在 PHP 中,交集和并集是两个经常使用
使用PHP自定义函数扩展数组交集和并集的功能
2024-05-01

SQL多条件模糊查询、IN 、自定义函数笔记(一)

在工作中遇到的一些关于Sql查询的问题整理记录,实现环境 SQLService 2014一、对同一个字段,多个关键词的查询几种实现方式基本语法:SELECT column_name(s)FROM table_nameWHERE column_name LIKE
SQL多条件模糊查询、IN 、自定义函数笔记(一)
2015-07-01

编程热搜

目录