Um estado compartilhado global não deve apenas ser compartilhado e transmitido, mas também deve ser capaz de ser modificado, fazendo uma modificação e mudando em todos os lugares. A seguir, vamos melhorar o Liezi no site oficial para realizar o compartilhamento e modificação do status.
Primeira foto:
App.js
import React,{useEffect,useReducer,useState} from 'react';
// import logo from './logo.svg';
import './App.css';
import {
// BrowserRouter as Router,
Route,
Link,
// Router
} from "react-router-dom";
import {initState,context,countReducer} from './reducer/index'
import Count from './components/Count'
import ShowCount from './components/ShowCount'
function App() {
let store=useReducer(countReducer,initState)
useEffect(()=>{
console.log('store',store)
})
let linkArr=[
{
path:'/page1',
label:'页面1'
},
{
path:'/page2',
label:'页面2'
},
{
path:'/page3',
label:'页面3'
}
]
let [currentIndex,setCurrentIndex]=useState(0)
function changeCurrentIndex(index){
setCurrentIndex(index)
}
return (
<context.Provider value={store}>
<div className="App">
<ul className="list">
{
linkArr.map((item,index)=>{
return <li className="list-item" onClick={(e)=>changeCurrentIndex(index,e)} key={index}><Link to={item.path} className={`${index===currentIndex?'active':''}`}>{item.label}</Link></li>
})
}
</ul>
<Route path='/page1' component={Page1}></Route>
<Route path='/page2' component={Page2}></Route>
<Route path='/page3' component={Page3}></Route>
</div>
</context.Provider>
);
}
function Page1(){
return (
<div>
<Count></Count>
</div>
)
}
function Page2(){
return (
<div>
<ShowCount></ShowCount>
</div>
)
}
function Page3(){
return (
<div>
this is page3
</div>
)
}
export default App;
A função principal do app.js: Use context.Provider no componente de nível superior e compartilhe o único armazenamento (incluindo estado e envio) com os componentes abaixo. Qualquer um dos componentes abaixo obtém o estado e despacha por meio de useContext e, em seguida, eles podem compartilhar e alterar o valor do estado. Como obter o estado e o despacho de que precisamos é obtido por meio de useReducer.
./reducer/index
import React from 'react'
let initState={
count:0
}
function countReducer(state={},action){
switch(action.type){
case 'increment':
return {count:state.count+1}
case 'decrement':
return {count:state.count-1 }
default:
return state
}
}
let context =React.createContext()
export {
countReducer,
initState,
context
}
Isso inclui o redutor e o iniState, e também exporta o contexto. Todos que usam o estado compartilhado precisam usar esse contexto para garantir que todos os componentes usem o mesmo contexto.
Count.js
import React,{useContext} from 'react'
import {context} from '../reducer/index'
function Count(){
let [state,dispatch]=useContext(context)
return (
<div>
<h1>count:{state.count}</h1>
<div>
<button style={
{width:'128px',height:'30px'}} onClick={()=>dispatch({type:'decrement'})}>-</button>
<button style={
{width:'128px',height:'30px'}} onClick={()=>dispatch({type:'increment'})}>+</button>
</div>
</div>
)
}
export default Count
A função principal de count.js: obter estado e despachar por meio de useContext para exibir e modificar o estado.
ShowCount.js
import React,{useContext} from 'react'
import {context} from '../reducer/index'
function ShowCount(){
let [state]=useContext(context)
return (
<div>
<h1>count:{state.count}</h1>
</div>
)
}
export default ShowCount
showCount.js é semelhante a count.js. Apenas o estado é usado aqui.