React函數(shù)組件useContext useReducer自定義hooks
一、hooks(useContext)
接收一個(gè) context 對(duì)象(React.createContext 的返回值)并返回該 context 的當(dāng)前值。當(dāng)前的 context 值由上層組件中距離當(dāng)前組件最近的 <MyContext.Provider> 的 value prop 決定。
新建useContext.js函數(shù)組件,寫入如下代碼:
import React, { useEffect, useState, useContext } from 'react'
import axios from 'axios'
import '../css/middlecp.css'
const GlobalContext = React.createContext(); // 創(chuàng)建context對(duì)象
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 src={poster} alt={name}></img>
<h4>{name}</h4>
<div>觀眾評(píng)分:{grade}</div>
</div>
}
function FilmDetail() {
const value = useContext(GlobalContext)
return (
<div className="filmdetail">
{value.info}
</div>
)
}
二、hooks(useReducer)
useState 的替代方案。它接收一個(gè)形如 (state, action) => newState 的 reducer,并返回當(dāng)前的 state 以及與其配套的 dispatch 方法。
新建useReducer.js組件,寫入代碼:
import React, { useReducer } from 'react'
export default function UseReducer() {
// 處理函數(shù)
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;
}
}
// 外部對(duì)象
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使用跨級(jí)通信。(hooks中自帶的,后面redux不用這么麻煩) 修改useReducer.js組件代碼為如下:
import React, { useReducer, useContext } from 'react'
// 處理函數(shù)
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;
}
}
// 外部對(duì)象
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
當(dāng)我們想在兩個(gè)函數(shù)之間共享邏輯時(shí),我們會(huì)把它提取到第三個(gè)函數(shù)中。 必須使用use開頭。(實(shí)際上就是將獨(dú)立的邏輯函數(shù)抽離出來封裝) 新建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會(huì)執(zhí)行函數(shù)并返回執(zhí)行后的結(jié)果
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>
)
}
效果:

可以看到我們這個(gè)影院的篩選功能還是正常,但是看代碼的話,邏輯更加的清晰了。
以上就是React函數(shù)組件useContext useReducer自定義hooks的詳細(xì)內(nèi)容,更多關(guān)于React hooks函數(shù)組件的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
React實(shí)現(xiàn)隨機(jī)顏色選擇器的示例代碼
顏色選擇器是一個(gè)用于選擇和調(diào)整顏色的工具,它可以讓用戶選擇他們喜歡的顏色,本文主要介紹了React實(shí)現(xiàn)隨機(jī)顏色選擇器的示例代碼,具有一定的參考價(jià)值,感興趣的可以了解一下2023-12-12
React項(xiàng)目中報(bào)錯(cuò):Parsing error: The keyword &a
ESLint 默認(rèn)使用的是 ES5 語法,如果你想使用 ES6 或者更新的語法,你需要在 ESLint 的配置文件如:.eslintrc.js等中設(shè)置 parserOptions,這篇文章主要介紹了React項(xiàng)目中報(bào)錯(cuò):Parsing error: The keyword 'import' is reservedeslint的問題及解決方法,需要的朋友可以參考下2023-12-12
React?Hooks項(xiàng)目實(shí)戰(zhàn)
React?Hooks是React?16.8版本引入的新特性,它使得在函數(shù)組件中也能夠使用狀態(tài)(state)和其他React特性,本文就來詳細(xì)介紹一下React?Hooks項(xiàng)目實(shí)戰(zhàn),感興趣的可以了解一下2023-11-11
關(guān)于React動(dòng)態(tài)修改元素樣式的三種方式
這篇文章主要介紹了關(guān)于React動(dòng)態(tài)修改元素樣式的三種方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-08-08
react koa rematch 如何打造一套服務(wù)端渲染架子
這篇文章主要介紹了react koa rematch 如何打造一套服務(wù)端渲染架子,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-06-06
React Refs轉(zhuǎn)發(fā)實(shí)現(xiàn)流程詳解
Refs是一個(gè) 獲取 DOM節(jié)點(diǎn)或React元素實(shí)例的工具,在React中Refs 提供了一種方式,允許用戶訪問DOM 節(jié)點(diǎn)或者在render方法中創(chuàng)建的React元素,這篇文章主要給大家介紹了關(guān)于React中refs的一些常見用法,需要的朋友可以參考下2022-12-12

