Provider
Provider
组件可以让被包裹组件的子组件拿到state数据,子组件可以从context拿到store
import { Provider } from 'react-redux'
function App() {
return (
<Provider store={store}>
<App></>
</Provider>
);
}
connect
connect
接受两个参数:mapStateToProps
和mapDispatchToProps
。mapStateToProps
将state映射到组件的参数(props),mapDispatchToProps
将用户操作映射为action
import { connect } from 'react-redux';
const Home = (props) => {
xxx
}
const mapStateToProps = () => {
console.log(state);
return {state}
}
const mapDispatchToProps = {
add(value){
return {
type:'increment',
data:value*1
}
}
}
export default connect(mapStateToProps,mapDispatchToProps)(Home)
案例:state中isCollepsed控制菜单栏折叠
新建store和reducer
store.js
import { legacy_createStore as createStore,combineReducers } from "redux";
import { CollapsedReducer } from "./reducers/CollapseReducer";
import {Addreducer} from '../views/sandbox/home/reducer'
const reducer = combineReducers({
CollapsedReducer,
Addreducer
})
const store = createStore(reducer);
export default store
CollapsedReducer.js
export const CollapsedReducer = (pre={isCollepsed:false},action) => {
let {type} = action
switch (type) {
case 'change_collapsed':
let newstate = {...pre}
newstate.isCollepsed = !newstate.isCollepsed
return newstate
default:
return pre;
}
}
为最外层组件包裹Provider
import IndexRouter from "./router";
import { Provider } from 'react-redux'
import store from './redux/store' //折叠store
function App() {
return (
<Provider store={store}>
<IndexRouter></IndexRouter>
</Provider>
);
}
export default App;
connect 定义映射关系 传参
import { connect } from 'react-redux';
const mapStateToProps = ({CollapsedReducer:{isCollepsed}}) => {
console.log(isCollepsed);
return {
// isCollepsed
isCollepsed
}
}
const mapDispatchToProps = {
changeCollepsed(){
return {
type:'change_collapsed'
}
}
}
export default connect(mapStateToProps,mapDispatchToProps)(TopHeader)
props获取数据 或 传递action
const TopHeader = (props) => {
// const [collapsed] = useState(false);
const changeCollepsed = () => {
//调用changeCollepsed()传递action
props.changeCollepsed()
}
return (
<Header className="site-layout-background" style={{ padding: '0 16px' }}>
//获取数据
{props.isCollepsed? <MenuUnfoldOutlined onClick={changeCollepsed}/> : <MenuFoldOutlined onClick={changeCollepsed}/>}
</Header>
)
}