[前端]Redux

在node环境下使用redux

npm install redux
/store/index.js
const {createStore} from “redux”
const userinfo={
name:"niuniu"
}
//返回值会作为state里的数据,默认返回是为了初始化数据,只要在派发一次后,state里就会有值
function reducer(state=userinfo,actions){
   swtich(actions.type){
     case:updatename:
     return {  ...state,name:actions.name}
     default:return state
   }
}
const store=createStore(reducer)
module.exports=store

在redux中通过派发action来操作数据

/index.jsx
const store=require("./store/index.js")
store.dispatch({type:"updatename",name:"niuniuniu"})
store.getState()
//在生命周期函数监听,发生变化就会回调,我们重新拿数据,渲染到组件的state中
const unSubscribe=store.subscribe(()=>{})
//执行这个返回值方法就会取消回调,一般用在卸载生命周期中
unSubscribe()

react-redux

npm i react-redux
/index.js
import { Provider} from "react-redux"
import redux from './store/app';
const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(
  <React.StrictMode>
    <Provider store={redux}>
      <App />
    </Provider>
  </React.StrictMode>
);
./App.jsx
在页面内使用connect来获取数据
import { connect } from 'react-redux'
//数据改变会自动渲染(返回的高阶组件内生命周期帮我们监听并重置了构造函数里的state),这里映射是我们顶层传入的store可能存有大量数据,我们这个页面可能只会用到一部分,这两个方法的返回值都会返回到组件的props中
const mapStatetoProps=(state)=>({
   couter:state.couter,
   banner:state.banner 
})
function MapDispatchToProps(disptch){
    return{
        f1(){
        //这里我们可以直接派发action
        }
    }
}
export default connect(mapStatetoProps,MapDispatchToProps)(App) 

关于reducer拆分模块

//一个createStore,不同的reduce整合,由于拆分模块,我们在connect里拿数据也得先在state里先拿模块取到对应的对象再去那里面的数据
import {createStore,applyMiddleware,compose,combineReducers} from "redux"
//执行异步操作
import {thunk} from "redux-thunk"
import Couterreducer from "./couter";
import bannerReduce from "./banner";
const store=combineReducers({
   couter:Couterreducer,
   banner:bannerReduce
})
const composeEnhancers = window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ || compose;
const redux=createStore(reducer,composeEnhancers(applyMiddleware(thunk)))
export default redux
//对派发action的封装,关于type,由于reducer里使用的type和派发的type相同,我们抽取成常量
export const updateName=(name)=>({type:"aaa",name:name})
export const getdata = () => {
  //这个方法会自动执行
  function fetchdata(dispatch, state) {
    console.log(state, dispatch);
    axios.get("url").then((res) => {
      console.log(res.data.data.banner);
      dispatch(getbanner(res.data.data.banner));
    });
  }
  return fetchdata;
};

关于RTK和手写connect,以及插件的事件机制随后补充

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值