您好,登錄后才能下訂單哦!
今天小編給大家分享一下怎么使用React函數組件useContext useReducer自定義hooks的相關知識點,內容詳細,邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。
接收一個 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> <h5>{name}</h5> <div>觀眾評分:{grade}</div> </div> } function FilmDetail() { const value = useContext(GlobalContext) return ( <div className="filmdetail"> {value.info} </div> ) }
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中自帶的,后面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> ) }
效果:
當我們想在兩個函數之間共享邏輯時,我們會把它提取到第三個函數中。 必須使用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”這篇文章的所有內容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學習更多的知識,請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。