網(wǎng)站首頁 編程語言 正文
一、hooks(useContext)
接收一個 context 對象(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對象 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>觀眾評分:{grade}</div> </div> } function FilmDetail() { const value = useContext(GlobalContext) return ( <div className="filmdetail"> {value.info} </div> ) }
二、hooks(useReducer)
useState 的替代方案。它接收一個形如 (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; } } // 外部對象 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' // 處理函數(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; } } // 外部對象 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)我們想在兩個函數(shù)之間共享邏輯時,我們會把它提取到第三個函數(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會執(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> ) }
效果:
可以看到我們這個影院的篩選功能還是正常,但是看代碼的話,邏輯更加的清晰了。
原文鏈接:https://juejin.cn/post/7125780103472087077
相關(guān)推薦
- 2022-07-12 修改docker官方鏡像內(nèi)部內(nèi)容并重新build鏡像
- 2023-04-08 python如何實(shí)現(xiàn)數(shù)組反轉(zhuǎn)_python
- 2022-04-22 docker拉取常用開發(fā)工具
- 2023-03-01 React?useState的錯誤用法避坑詳解_React
- 2023-01-14 Go?庫bytes.Buffer和strings.Builder使用及性能對比_Golang
- 2024-03-07 MyBatis快速入門案例
- 2022-05-21 Python遞歸時間復(fù)雜度_python
- 2022-12-29 Python利用tkinter實(shí)現(xiàn)一個簡易番茄鐘的示例代碼_python
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支