在一个典型的react应用中,属性props是由父级逐渐传递到子级的,由于 逐级传递,所以在某些层级很多的项目中传递props属性的过程非常麻烦,我们需要定义一个全局属性,可以使他的子组件都能拿到,这是就可以用useContext
先到App.tsx文件中写
import React,{useState}from 'react'; import './App.css'; import LikeBUtton from './components/LikeButton'; ' interface IThemeProps{ [key:string]:{color:string;background:string} } const themes: IThemeProps = { 'light':{ color:'#000', background:'#eee' }, 'dark':{ color:'#fff', background:'#222' } } export const ThemeContext =React.createContext(themes.dark)//里面的参数是默认值 function App() { return ( <div style={{margin:"auto 0"}}> <ThemeContext.Provider value={themes.dark}> <LikeBUtton></LikeBUtton> {/* <MouseTrack></MouseTrack> */} </ThemeContext.Provider> </div> ); } export default App;上面导出了写的ThemeContext 对象,要想让它的子组件能够拿到此属性,就必须加上
<ThemeContext.Provider value={themes.dark}> <LikeBUtton></LikeBUtton> {/* <MouseTrack></MouseTrack> */} </ThemeContext.Provider>包裹likebutton子组件
下面是LikeBUtton子组件拿到属性使用的代码
import React,{useState,useEffect,useRef,useContext} from 'react' import {ThemeContext} from '../App' const LikeBUtton:React.FC = () =>{ const theme =useContext(ThemeContext) console.log(theme); const style = { background:theme.background, color:theme.color } useEffect(()=>{ console.log("running....."); document.title = `点击了${like}次` },[like]) useEffect(()=>{ if(domRef&&domRef.current){ domRef.current.focus() } }) return ( <> <button style={style} onClick = {()=>{setLike(like+1); likeRef.current++}}> {like} </button> </> ) } export default LikeBUtton使用之前先导入,然后可以直接调用