进阶知识 - reac-redux
react-redux
安装
npm i react-redux
使用方法
利用
react-redux
身上的两个组件(Provider,connecst)来完成全局redux数据交互,provider
用于分发全局store,connect
用于将接收组件转化成高阶-容器组件,有两个参数,一个回调函数:用来接收全局store,并需要返回数据,一个对象:用来写入操作Dispatch的属性方法。connect
容器组件 利用props传参的方式,供接收组件使用
- Provider:
供应商组件
用于分发全局的store参数 供connect容器组件
接收使用;
import { Provider } from "react-redux";
import store from "../Redux/store";
<Provider store={store}> 根组件 </Provider>
connect: 高级容器组件,用于将接收方组件变成容器组件,就可以用props接收数据|方法并操作。两个参数:
回调参数,对象
,调用返回一个函数,将组件当参数传入进入并调用该方法,就可以获得一个高阶容器组件- 1. 回调函数 回调函数接收一个形参(全局的store),函数内部需要返回一个对象,对象就是接收组件内部需要用到的store数据,组件内部props接收使用
- 2. 对象 对象的属性是需要操作的dispatch方法,省去使用dispatch,直接调用方法就可以了,组件内部props接收使用
- connect(function,object)返回值 调用会返回一个函数,这个函数接收一个参数,就是我们需要操作的组件,调用该函数,就可以获得一个高阶容器组件,组件内部就可以用props操作数据了
小demo
<!-- store.jsx -->
import { applyMiddleware, createStore, combineReducers, compose } from "redux";
import thunk from "redux-thunk"; //配置thunk形式
import promise from "redux-promise"; //配置promise形式
import { HomeReducer } from "./Reducers/Home";
const Reducer = combineReducers({ HomeReducer }); // reducer模块化合并,将模块化的reducer 合并成一个大Reducer
//配置 redux-devtools 可视化追踪工具
const composeEnhancers = window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ || compose;
// 导出Store
export default createStore(
Reducer,
composeEnhancers(applyMiddleware(thunk, promise))
);
<!-- /Reducers/Home.jsx -->
let data = { status: true, list: [] };
export const HomeReducer = (oldData = data, action) => {
let newData = { ...oldData };
switch (action.type) {
case "show":
newData.status = true;
return newData;
case "hide":
newData.status = false;
return newData;
case "Newlist":
newData.list = action.newList;
return newData;
case "remove":
newData.list = [];
return newData;
default:
return newData;
}
};
<!-- action.jsx -->
import axios from "axios";
export const TextShow = () => {
return {
type: "show",
};
};
export const TextHide = () => {
return {
type: "hide",
};
};
// react-thunk写法
export const NewListThunk = () => {
return (dispatch) => {
axios
.get(
"/api/mmdb/movie/v3/list/hot.json?ct=%E9%B9%A4%E5%A3%81&ci=239&channelId=4"
)
.then((res) => {
dispatch({ type: "Newlist", newList: res.data.data.hot });
});
};
};
// react-promise 写法
export const NewListPromise = () => {
return axios
.get(
"/api/mmdb/movie/v3/list/hot.json?ct=%E9%B9%A4%E5%A3%81&ci=239&channelId=4"
)
.then((res) => {
return { type: "Newlist", newList: res.data.data.hot };
});
};
// 清空
export const delectList = () => {
return { type: "remove" };
};
<!-- /Redux/Home.jsx文件 -->
import { connect } from "react-redux";
import {
TextShow,
TextHide,
NewListThunk,
NewListPromise,
delectList,
} from "../../Redux/action";
import { useEffect, useMemo } from "react";
const Home = (props) => {
console.log(props);
let {
status,
list,
TextShow,
TextHide,
NewListThunk,
NewListPromise,
delectList,
} = props;
useEffect(() => {
if (props.list.length == 0) {
NewListThunk();
}
}, []);
const newList = useMemo(() => {
return list.map((item) => <li key={item.id}>{item.nm}</li>);
}, [list]);
return (
<div>
<div>{status && "内容"}</div>
<button
onClick={() => {
TextShow();
}}
>
显示文本
</button>
<button
onClick={() => {
TextHide();
}}
>
隐藏文本
</button>
<div>
<ul>{newList}</ul>
<button
onClick={() => {
NewListThunk();
}}
>
react-thunk方式获取
</button>
<button
onClick={() => {
NewListPromise();
}}
>
react-promise方式获取
</button>
<button
onClick={() => {
delectList();
}}
>
清空
</button>
</div>
</div>
);
};
const mapStateToProps = (state) => {
return {
...state.HomeReducer,
};
};
const mapDispacthToProps = {
TextShow,
TextHide,
NewListThunk,
NewListPromise,
delectList,
};
export default connect(mapStateToProps, mapDispacthToProps)(Home);
// connect调用会返回一个函数,返回的函数需要传入一个组件,再次调用就可以将我们的组件变成高阶组件 - 容器组件
// connect需要两个参数,一个回调函数 跟 对象
// 回调函数需要内部需要return你需要传入你组件内需要的状态数据
// 对象里面定义你需要dispatch操作的方法 直接调用 无需在dispatch connect帮您自动dispatch
<!-- /App.jsx文件 -->
import React from 'react';
import ReactDom from 'react-dom';
import { Provider } from "react-redux";
import store from "../Redux/store";
import Home from "./home";
const App = () => {
return (
<Provider store={store}>
<Home />
</Provider>
);
};
ReactDom.render(<App />,document.getElementById('root'))