網站首頁 編程語言 正文
一、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 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> ) }
效果:
可以看到我們這個影院的篩選功能還是正常,但是看代碼的話,邏輯更加的清晰了。
原文鏈接:https://juejin.cn/post/7125780103472087077
相關推薦
- 2022-05-20 Maven下載安裝配置詳細過程
- 2022-08-10 Golang泛型的使用方法詳解_Golang
- 2022-04-15 詳解Python?prometheus_client使用方式_python
- 2022-10-13 Python教程之類型轉換詳解_python
- 2022-03-27 3個適合新手練習的python小游戲_python
- 2022-12-07 聊聊C語言中sizeof運算符的一個陷阱_C 語言
- 2022-10-13 Golang執行cmd命令行的方法_Golang
- 2022-12-23 Kubernetes?權限管理認證鑒權詳解_云其它
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支