npm install --save react-redux
react-redux
是官方提供的解决方案,Provider
本身并没有做很多事情,只是把store
放在context
里罢了。实际上如果你用react-redux
,那么连接视图和数据层最好的办法是使用 connect
函数。本质上Provider
就是给 connect
提供store
用的。
import {Provider} from ‘react-redux’ //引入标签
ReactDOM.render(
// 包裹 Provider:显示页面的数据
<Provider store={store}>
<App />
</Provider>,
document.getElementById('root')
);
//createStore创建仓库
// combineReducers:就是要合并的reducer
import {createStore,combineReducers} from 'redux'
import reducer from './reducer'//引入仓库中的reducer纯函数
export default createStore(combineReducers({reducer}))
// store 仓库的reducer纯函数
function reducer(state={
name:'张三',
age:10
},action){
switch(action.type){
case 'change-name':
return{
...state,
name:action.name
}
}
return state
}
export default reducer;
connect
方法拿到reducer
的数据,return处理之后,传给需要数据的组件
在哪个组件中需要使用redux
的数据,就在哪个文件中调用
connect(state的处理函数)(组件):函数,有返回值为函数体 继续调用
import React,{Fragment} from 'react'
import { connect } from 'react-redux'
// Inner页面组件
function Inner(props){
console.log(props); //获取传递的参数
let {name,age,dispatch} = props
return (
<Fragment>
<p>name:{name}</p>
<p>age:{age}</p>
<button onClick={()=>{
dispatch({
type:'change-name',
name:'李四'
})
}}>修改</button>
</Fragment>
)
}
export default connect((state,props)=>{
console.log(state)
return state.reducer
})(Inner)
引入Inner页面,显示页面
import React from 'react';
import Inner from './Inner'
function App() {
return (
<div className="App">
<Inner info = {'父组件传来的数据'}></Inner>
</div>
);
}
export default App;
import React,{Fragment} from 'react'
import { useDispatch,useSelector,useStore } from 'react-redux'
// Inner页面组件
function Inner(){
let {name,age} = useSelector((state)=>{
return state.reducer
})
//useDispatch:修改数据
let dispatch = useDispatch();
return (
<Fragment>
<p>name:{name}</p>
<p>age:{age}</p>
<button onClick={()=>{
dispatch({
type:'change-name',
name:'李四'
})
}}>修改</button>
</Fragment>
)
}
export default Inner